VS2022+DirectX9之创建DirectX9设备

VS2022+DirectX9之创建DirectX9设备

DirectX9可以简称 DX9,创建了窗体窗口之后就是创建DX9对象,相当于是GDI的HDC句柄,然后,才能创建DX9的设备,这个设备与游戏之类的显示设置是一个事情。

学习路线

我这个是根据王德才编著的《精通DirectX.3D图形与动画程序设计》和俗称龙书的《DirectX 9.0 3D 游戏开发编程基础》网上也可以找到相关资料。

应用程序、Direct3D、GDI和HAL之间的关系

从图上从上到下,就是开发的应用调用图形渲染的功能流程,GDI就直接一些,Direct3D的话还需要一个HAL(硬件抽象层)来支持各种各样的显卡设备。

Direct3D就从左侧这条线开发展开,主要是(应用程序->Direct3DAPI这部分)。

Direct3D对象渲染流程

如下图所示:

首先就是创建Direct3D 对象,然后,创建Direct3D设备,进入到循环渲染,退出的时候,先释放Direct3D设备,然后,释放Direct3D对象,就完成了渲染的主流程。

创建Direct3D 对象

创建对象很简单,按照如下标准即可

LPDIRECT3D9 g_pD3D = NULL; //Direct3D对象
//创建Direct3D对象, 该对象用来创建Direct3D设备对象
if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{
    return E_FAIL;
}

执行完就会获取一个g_pD3D的设备对象。

Direct3D 对象获取其他信息

在进行下一步创建DX9设备之前,需要进一步获取一些当前显卡设备所支持的一些特性,就可以从这个获取到的DX9对象上来获取到

// 查询显示适配器的能力
D3DCAPS9 caps;
if (FAILED(g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,//默认显示适配器
    D3DDEVTYPE_HAL,// 硬件抽象层设备
	&caps) // 输出参数, 返回显示适配器的能力
))
{
    return E_FAIL;
}

这样就获取到了D3DCAPS9结构体,里面有很多需要用到的信息


通过VS2022可以看到这个获取到的caps对象里的属性信息,便于后期的查看和使用。

判断显卡是否支持硬件或软件来计算顶点(肯定是硬件显卡计算速度会更快)

DWORD BehaviorFlags = 0;
//D3DDEVCAPS_HWTRANSFORMANDLIGHT /* 设备支持在硬件中进行变换和光照计算,并且必须同时支持 DRAWPRIMITIVES2EX */
if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) {
    BehaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else {
    BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}

创建Direct3D的设备对象

这一块需要注意的参数很多。前期可以不了解那么多,但是,每个参数还是需要详细的了解

//设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

//创建Direct3D设备对象
if (FAILED(g_pD3D->CreateDevice(
	D3DADAPTER_DEFAULT, //默认显示适配器 
	D3DDEVTYPE_HAL, //设备类型
    hWnd, 
	BehaviorFlags | D3DCREATE_MULTITHREADED, //多线程支持
	&d3dpp, //创建参数
    &g_pd3dDevice)))
{
    return E_FAIL;
}

其中最重要的实际上D3DPRESENT_PARAMETERS结构体,它包含了许多参数,可以有个简单的描述

D3DPRESENT_PARAMETERS结构体

  1. BackBufferWidth、BackBufferHeight 绘制的宽和高,窗体如果边框有宽度可能要减去才为它实际的宽和高
  2. BackBufferFormat 缓冲区通道像素格式的结构,默认为 D3DFMT_UNKNOWN 跟显卡保持一致
  3. BackBufferCount 指有几个后台缓冲区(全屏的后台缓冲只能有一个)
  4. MultiSampleType 后台缓存的多重采样类型(默认应该是0无多重采样)
  5. MultiSampleQuality 多重采样的质量
  6. SwapEffect 后台缓存交换到前台缓存的方式,默认为D3DSWAPEFFECT_DISCARD 最快
  7. hDeviceWindow 与设备相关的窗口句柄,默认不填
  8. Windowed 是窗口模式还是全屏模式
  9. EnableAutoDepthStencil 3D渲染需要设置(为True,自动创建并维护深度缓存或模板缓存)
  10. AutoDepthStencilFormat 深度缓存或模板缓存的像素格式
  11. Flags 特殊标志
  12. FullScreen_RefreshRateInHz 刷新频率 ,默认为 D3DPRESENT_RATE_DEFAULT 或者 0
  13. PresentationInterval 垂直同步D3DPRESENT_INTERVAL_ONE,D3DPRESENT_INTERVAL_IMMEDIATE 追求极限帧率和低延迟选择

3D渲染

有了Direct3D设备,就可以通过API来进行渲染了。

//清空后台缓冲区
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0);

//开始在后台缓冲区绘制图形
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
    //在此在后台缓冲区绘制图形

    //结束在后台缓冲区渲染图形
    g_pd3dDevice->EndScene();
}

//将在后台缓冲区绘制的图形提交到前台缓冲区显示
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);

显示的结果,我们可以通过修改颜色,来让屏幕显示各种颜色

D3DCOLOR_XRGB(0, 0, 0) 黑色
D3DCOLOR_XRGB(45, 50, 170) 蓝色

总结

手敲一遍,更容易深入理解。

git仓库

https://github.com/kesshei/direct9Demo/tree/main/02_%E7%AC%AC%E4%BA%8C%E7%AB%A0%20Direct3D%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/01_CreateDevice
https://gitee.com/kesshei/direct9Demo/tree/main/02_%E7%AC%AC%E4%BA%8C%E7%AB%A0%20Direct3D%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/01_CreateDevice
posted @ 2025-10-18 14:29  蓝创精英团队  阅读(15)  评论(0)    收藏  举报  来源