重新從頭開始學習DX,以前太急於求成了,很多基礎知識都沒掌握就開始寫程式了,結果出了問題很難解決.
1.
D3D
體繫結構D3D與GDI處與同一層次,區別在於,D3D可以使用HAL(Hardware Abstraction Layer)通過DDI來訪問圖形硬體,充分發揮硬體效能.
2.
D3D
裝置對象
2.1 D3D
裝置類型 HAL,支援硬體加速光柵化和硬體或軟體處理 Software Device,硬體類比層 REF,reference device,SDK專用.不過nVidia的PerfHUD就是用的這種裝置類型
2.2
D3DPRESENT_PARAMETERS
1: typedef struct D3DPRESENT_PARAMETERS { 2: UINT BackBufferWidth, BackBufferHeight;//背景緩衝區寬高 3: D3DFORMAT BackBufferFormat;//背景緩衝區像素格式 4: UINT BackBufferCount;//背景緩衝區的數量 5: D3DMULTISAMPLE_TYPE MultiSampleType;//多重採樣類型,用於反鋸齒 6: DWORD MultiSampleQuality; 7: D3DSWAPEFFECT SwapEffect;//背景緩衝區複製到前端緩衝區的方式 8: HWND hDeviceWindow;//圖形繪製視窗 9: BOOL Windowed;//視窗/全屏 10: BOOL EnableAutoDepthStencil; 11: D3DFORMAT AutoDepthStencilFormat; 12: DWORD Flags; 13: UINT FullScreen_RefreshRateInHz;//重新整理速率,視窗時必須為0 14: UINT PresentationInterval; 15: } D3DPRESENT_PARAMETERS, *LPD3DPRESENT_PARAMETERS; |
BackBufferWidth與BackBufferHeight為0時系統自動使用當前視窗客戶區寬高BackBufferCount取0和1時都表示一個背景緩衝區hDeviceWindow為NULL時預設為當前被啟用的視窗BackBufferFormat取D3DFMT_UNKNOWN時,像素格式取當前顯卡的像素格式
2.3
CreateDevice
中的BehaviorFlag
D3DCREATE_HARDWARE_VERTEXPROCESSING,硬體頂點運算
D3DCREATE_MIXED_VERTEXPROCESSING,軟硬體共同進行頂點運算
D3DCREATE_MULTITHREADED,多線程繪製,會降低效能
D3DCREATE_SOFTWARE_VERTEXPROCESSING,軟體頂點運算
通常某些整合顯卡不支援硬體頂點運算,如intel 的GMA900/950
2.4
D3D
繪製Clear(),可以清空顏色緩衝區,深度緩衝區,樣板緩衝區.可以選擇清除地區BeginScene()和EndScene()不允許嵌套Present(),可以指定更新地區(髒矩形技術?),不過要求用D3DSWAPEFFECT_COPY
3.
D3D
裝置對象
全螢幕模式: 枚舉顯示適配器(多顯示器適用) IDirect3D9::EnumAdpterModes()枚舉支援的顯示模式 IDirect3D9::CheckDeviceType()檢測顯示模式是否支援硬體加速 IDirect3D9::GetDeviceCaps()檢查渲染裝置是否支援所需要的功能(顯卡相容性檢測) IDirect3D9::CheckDeviceFormat()檢測其它表面格式是否支援 IDirect3D9::CheckDepthStencilMatch()檢測深度/樣板緩衝區是否和渲染目標相容 IDirect3D9::CheckDeviceMultiSampleType()檢查裝置是否支援多重採樣(反鋸齒用)
視窗模式: 直接用D3DADAPTER_DEFAULT就可以忽略前兩步了,剩下的都一樣
裝置丟失: 圖形顯示丟失焦點,必須重新建立相關資源 任何顯存資源在裝置丟失時必須銷毀,包括CreateAdditionalSwapChain()建立的交換鏈結和D3DPOOL_DEFAULT格式的記憶體資源
4.
D3D
表面表面格式:通常有兩個屬性,表面大小與顏色位元表面翻轉:將背景緩衝區移動到前端緩衝區的過程交換鏈結:按順序逐個提交到前台顯示的多個背景緩衝區的集合 多個視圖的應用程式用多個交換鏈結訪問表面記憶體:IDirect3DSurface9::LockRect(),不適用於多重採樣背景緩衝區