原文:Direct3D基礎知識
?
重新從頭開始學習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(),不適用于多重采樣后臺緩沖區