DX9入門筆記1 D3D初始化

2021-09-08 22:32:12 字數 3703 閱讀 1832

對3d程式設計期待已久,卻一直葉公好龍淺嘗輒止。近期在公司實習卻無具體的工作安排,琢磨著學習個新的手藝,就又想起了3d programming。這次從大名鼎鼎的龍書(introduction to 3d game progamming with directx 9.0)開始學起,堅持...

作為入門的第一篇筆記,本文對d3d初始化過程做了總結。directx3d的初始化需要做兩部分工作:建立乙個視窗、建立idirect3ddevice9物件,視窗用於展示d3d渲染出來的場景;idirect3ddevice9則是乙個c++物件,表示用來displaying3d圖形的物理裝置。本文也主要包含兩個部分:

d3d的初始化龍書中使用簡單框架的**分析龍書中將乙個d3d的初始化過程分為4個步驟:

獲取idirect3d9介面的指標,該介面通常用於取得物理裝置資訊和建立idirect3ddevice9物件。

檢測裝置的處理能力(d3dcaps9),檢測顯示介面卡(display adapter)是否支援頂點的硬體處理。

初始化結構體d3dpresent_parameters,該結構指定了一些引數用來建立idirect3ddevice9。

建立ideirect3ddevice9物件。

d3d中有專門的函式來獲取idirect3d9指標

idirect3d9* d3d9 = null;

d3d9 = direct3dcreate9(d3d_sdk_version);

d3d_sdk_version是建立idirect3d9唯一需要的引數,該引數能夠保證程式是基於當前版本的directx生成的。

在建立idirect3ddevice9時需要指定其頂點處理型別(硬體或者軟體),硬體頂點處理速度較快,但是不是所有的顯示介面卡都具有該能力。可以呼叫函式getdevicecaps,該函式的原型如下

hresult idirect3d9::getdevicecaps(

uint adapter,

d3ddevtype devicetype,

d3dcaps9 *pcaps

);

adpater 指定要檢測的顯示介面卡

devicetype 硬體型別,d3ddevtype_hal(硬體裝置)、d3ddevtype_ref(軟體裝置)。

pcaps 返回d3dcaps9結構,包含了硬體的所支援的各種特性。

//  檢查硬體的頂點處理能力

d3dcaps9 caps;

d3d9->getdevicecaps(d3dadapter_default, devicetype, &caps);

int vp = 0 ; //頂點處理型別

if(caps.devcaps & d3ddevcaps_hwtransformandlight)

vp = d3dcreate_hardware_vertexprocessing;

else

vp = d3dcreate_software_vertexprocessing;

d3dpresent_parameters用於指定idirect3device9的一些特性,其宣告如下:

typedef struct _d3dpresent_parameters_

d3dpresent_parameters;

fullscreen_refreshrateinhz 重新整理頻率,使用d3dpresent_rate_default指定為預設的重新整理頻率。

presentationinterval d3dpresent成員,兩個常用的標誌

d3dpresent_parameters d3***;

d3***.backbufferwidth = width;

d3***.backbufferheight = height;

d3***.backbufferformat = d3dfmt_a8r8g8b8;

d3***.backbuffercount = 1;

d3***.multisampletype = d3dmultisample_none;

d3***.multisamplequality = 0;

d3***.swapeffect = d3dswapeffect_discard;

d3***.hdevicewindow = hwnd;

d3***.windowed = windowed;

d3***.enableautodepthstencil = true;

d3***.autodepthstencilformat = d3dfmt_d24s8;

d3***.flags = 0;

d3***.fullscreen_refreshrateinhz = d3dpresent_rate_default;

d3***.presentationinterval = d3dpresent_interval_immediate;

填充d3dpresent_parameters後,idirect3device9就很簡單了

d3d9->createdevice(d3dadapter_default,devicetype,hwnd,vp,&d3***,device);
在龍書的第二章提供了乙個簡單框架,用於d3d的初始化工作。

d3dutility.h如下:

namespace d3d

}templatevoid delete(t t)

}}

函式init3d建立程式的主視窗,並進行d3d的初始化工作,初始化完成返回idirect3device9的指標。

entermsgloop 進入視窗的訊息迴圈,它的引數是乙個顯示函式,該函式是用於圖形的繪製。

release 用於釋放乙個com介面

delete 用於刪除乙個物件

wndproc 是視窗的訊息處理函式。

vs中的專案編碼預設的是unicode,這樣在進行一些字串處理(例如設定視窗標題)非常容易出現亂碼。這就需要加入標頭檔案tchar.h

#include
在使用字串的時候使用巨集_t轉換就可以避免亂碼,例如:

在該框架中,進入視窗迴圈的**如下:

int d3d::entermsgloop(bool (*ptr_display)(float timedelta))

else

}return msg.wparam;

}

在上述**中取得訊息使用的是peekmessage而不是常用的getmessage。peekmessage和getmessage都是從訊息佇列中抓取訊息,如果訊息隊列為空,程式的主線程會被作業系統掛起。過一段時間,當作業系統再次執行該執行緒時,如果訊息佇列仍然為空,這時這兩個函式的行為則就不一樣了:

本文是龍書第二章的學習筆記,總結了d3d初始化的4個步驟,並對龍書中提供的**框架作為簡單分析。

DirectX 11 學習筆記(1) D3D基礎

dx11特性 強制要求裝置實現d3d11規定的所有功能特性。dx9特性 不強制要求裝置實現d3d11規定的所有功能特性。當需要使用某一特性時,先查詢再呼叫。com component object model 元件物件模型 texture 紋理 d3d紋理只支援特定格式的資料儲存,這些格式由dxgi...

D3DX庫的使用 D3DX初始化

自7.0版以來,directx隨d3dx direct3d擴充套件 庫一起提供。該庫提供了一組簡化的數 算,紋理和影象操作,網格操作以及著色器操作 例如編譯和裝配 相關的常見3d圖形相關操作的函式,類和介面。也就是說,d3dx包含很多功能,如何你自己實現這些功能將會比較麻煩。我們使用d3dx庫,因為...

Dx9 龍書 chapter1 筆記

第一章筆記 顯示 黑色螢幕 主要是初始化的四個步驟 1.建立idirect3d9介面指標 2個用途 確定系統中顯示裝置的技術特徵,顯示的模式等 是否支援硬體 第2步 建立代表物理裝置的device物件 第四部 後release掉 它是2.3.4步的上層介面。2.檢測硬體是否支援頂點處理,否則用sof...