赞
踩
Direct3D是一套底层API,可以被视为应用程序与图形硬件的交互的中介。具体结构图如下图所示:
- 图中HAL又称硬件抽象层(Hardware Abstraction Layer),是一个指示设备完成某些操作的设备相关的代码集(硬件制造商来实现),由Direct3D统一调用。这样可以屏蔽硬件之间的差异。
- 若硬件不支持某些功能,可以用Direct3D提供的REF(Reference Rasterizer Device 参考光栅化设备)来实现,REF以软件运算方式来实现,但只适用于测试,不适合发行。
具体过程就是
IDirect3D9* _d3d9;
_d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
有了接口的指针后我们就可以来检测硬件是否支持某些性能,以硬件顶点运算为例;
D3DCAPS9 caps;
_d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
int vp = 0;
if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}
检测玩硬件特性后,还需要初始化一个D3DPRESENT_PARAMETERS结构体,该结构体是为了获取我们最终需要的设备接口。代码如下:
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = 800;
d3dpp.BackBufferHeight = 600;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = mainHandle;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
有了D3DPRESENT_PARAMETERS结构体后,我们就可以获取最终的设备接口了,具体代码如下
IDirect3DDevice9* Device = 0;
_d3d9->CreateDevice(D3DADAPTER_DEFAULT,
deviceType,
mainHandle,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,
&Device);
获取设备接口后,我们可以简单在消息循环中不断调用下列代码来更新窗口
Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
Device->Present(0, 0, 0, 0);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。