版权声明:K5出品,必属精品,欢迎收藏评论 https://blog.csdn.net/a694861283/article/details/87616264
1.4 Direct3D的初始化
Direct3D的初始化过程可分解为以下几个步骤:
(1)获取接口IDirect3D9的指针,该接口用于获取系统中物理硬件设备的信息并创建接口IDirect3DDevice9,该接口是一个C++对象,代表了我们用来显示3D图形的物理硬件设备
(2)检查设备性能(D3DCAPS9),判断主显卡(primary display adapter或primary graphics card)是否支持硬件顶点运算.为了创建接口IDirect3DDevice9,我们必须明确显卡是否支持该功能
(3)初始化D3DPRESENT_PARAMETERS结构的一个实例,该结构由许多数据成员组成,我们可以通过这些变量来指定即将创建的接口IDirect3DDevice9的特性
(4)利用已初始化的D3DPRESENT_PARAMETER结构创建IDirect3DDevice9对象(一个C++对象代表了我们用来显示3D图形的物理硬件设备)
1.4.1 获取接口IDirect3D9的指针
IDirect3D9* _d3d9;
_d3d9=Direct3DCreate9(D3D_SDK_VERSION);
1.4.2 校验硬件顶点运算
HRESULT IDirect3D9::GetDeviceCaps(
UINT Adapter, //指定物理显卡的序号
D3DDEVTYPE DeviceType, //指定设备类型(硬件设备:D3DDEVTYPE_HAL,软件设备:D3DDEVTYPE_REF)
D3DCAPS9* pCaps //返回已初始化的设备性能结构实例
);
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;
}
1.4.3 填充D3DPRESENT_PARAMETER结构
typedef struct _D3DPRESENT_PARAMETERS_{
UINT BackBufferWidth; //后台缓存中表面的宽度
UINT BackBufferHeight; //后台缓存中表面的高度
D3DFORMAT BackBufferFormat; //后台缓存的像素格式(如32位:D3DFMT_A8R8G8B8)
UINT BackBufferCount; //使用的后台缓存的个数
D3DMULTISAMPLE_TYPE MultiSampleType; //后台缓存使用多重采样类型
DWORD MultiSampleQuality; //多重采样的质量水平
D3DSWAPEFFECT SwapEffect; //指定交换链中的缓存的页面置换方式
HWND hDeviceWindow; //与设备相关的窗口句柄
BOOL Windowed; //true表示窗口模式,false表示全屏模式
BOOL EnableAutoDepthStencil; //为true时,Direct3D自动创建并维护深度缓存或模板缓存
D3DFORMAT AutoDepthStencilFormat; //深度缓存或模板缓存的像素格式(如D3DFMT_D24S8)
DWORD Flags; //附加特性
//D3DPRESENTFLAG_LOCKABLE_DEPTHBUFFER 指定可锁定的后台缓存
//D3DPRESENTFLAG_DISCARD_DEPTHBUFFER 指定下一个后台缓存提交时,深度缓存或模板缓存丢弃
UINT FullScreen_RefreshRateInHz; //刷新频率
//D3DPRESENT_RATE_DEFAULT 默认刷新频率
UINT PresentationInterval; //时间的间隔
//D3DPRESENT_INTERVAL_IMMEDIATE 立即提交
//D3DPRESENT_INTERVAL_DEFAULT 默认刷新频率
}D3DPRESENT_PARAMETERS;
D3DPRESENT_PARAMETERS d3pp;
d3pp.BackBufferWidth=800;
d3pp.BackBufferHieght=600;
d3pp.BackBufferFormat=D3DFMT_A8R8G8B8;
d3pp.BackBufferCount=1;
d3pp.MultiSampleType=D3DMULTISAMPLE_NONE;
d3pp.MultiSampleQuality=0;
d3pp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3pp.hDeviceWindow=hwnd;
d3pp.Windowed=false;
d3pp.EnableAutoDepthStencil=true;
d3pp.AutoDepthStencilFormat=D3DFMT_D24S8;
d3pp.Flags=0;
d3pp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3pp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;