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结构体
- BackBufferWidth、BackBufferHeight 绘制的宽和高,窗体如果边框有宽度可能要减去才为它实际的宽和高
- BackBufferFormat 缓冲区通道像素格式的结构,默认为 D3DFMT_UNKNOWN 跟显卡保持一致
- BackBufferCount 指有几个后台缓冲区(全屏的后台缓冲只能有一个)
- MultiSampleType 后台缓存的多重采样类型(默认应该是0无多重采样)
- MultiSampleQuality 多重采样的质量
- SwapEffect 后台缓存交换到前台缓存的方式,默认为D3DSWAPEFFECT_DISCARD 最快
- hDeviceWindow 与设备相关的窗口句柄,默认不填
- Windowed 是窗口模式还是全屏模式
- EnableAutoDepthStencil 3D渲染需要设置(为True,自动创建并维护深度缓存或模板缓存)
- AutoDepthStencilFormat 深度缓存或模板缓存的像素格式
- Flags 特殊标志
- FullScreen_RefreshRateInHz 刷新频率 ,默认为 D3DPRESENT_RATE_DEFAULT 或者 0
- 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