DirectX之二——Direct3D接口的初始化(Direct3D9)

DirectX之二——Direct3D接口的初始化(Direct3D9)

Direct3D与接口的关系

  Direct3D是一套底层API,可以被视为应用程序与图形硬件的交互的中介。具体结构图如下图所示:
这里写图片描述
- 图中HAL又称硬件抽象层(Hardware Abstraction Layer),是一个指示设备完成某些操作的设备相关的代码集(硬件制造商来实现),由Direct3D统一调用。这样可以屏蔽硬件之间的差异。
- 若硬件不支持某些功能,可以用Direct3D提供的REF(Reference Rasterizer Device 参考光栅化设备)来实现,REF以软件运算方式来实现,但只适用于测试,不适合发行。

Direct3D初始化之获取获取Direct3D接口的指针

具体过程就是

IDirect3D9* _d3d9;
_d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
  • _d3d9就是我们最终获得的指针,获取函数有Direct3D提供。

Direct3D初始化之检测设备性能

  有了接口的指针后我们就可以来检测硬件是否支持某些性能,以硬件顶点运算为例;

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;
}
  • 关于GetDeviceCaps函数的介绍可以参考这里,获取的特性保存在caps结构体实例里。
  • vp保存这我们应使用哪种顶点处理方式。

Direct3D初始化之填充D3DPRESENT_PARAMETERS结构体

  检测玩硬件特性后,还需要初始化一个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结构体的具体介绍,请点击这里

Direct3D初始化之获取最终的设备接口

有了D3DPRESENT_PARAMETERS结构体后,我们就可以获取最终的设备接口了,具体代码如下

IDirect3DDevice9* Device = 0;
 _d3d9->CreateDevice(D3DADAPTER_DEFAULT, 
            deviceType,
            mainHandle,
            D3DCREATE_HARDWARE_VERTEXPROCESSING, 
            &d3dpp,
            &Device);
  • Device就是我们最终获取的设备接口,通过该接口我们就可以使用图形硬件的各种操作;
  • 关于CreateDevice函数的介绍请移步这里

Direct3D初始化之显示窗口

获取设备接口后,我们可以简单在消息循环中不断调用下列代码来更新窗口

Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
Device->Present(0, 0, 0, 0);
  • 关于设备接口(及内部可调用函数)的介绍请移步这里
  • 最终我们可以得到如下图所示的空窗口
    这里写图片描述
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值