当前位置: 首页 > news >正文

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
http://www.dtcms.com/a/499510.html

相关文章:

  • unordered_map和unordered_set的封装与简单测试
  • (Kotlin协程十六)try/catch 可以捕获子协程的异常吗?为什么?
  • 网站移动端怎么做的做外国网站怎么买空间
  • 图像的脉冲噪声和中值滤波
  • 3.4特殊矩阵的压缩存储
  • SpringAI+DeepSeek大模型应用开发
  • 递归-24.两两交换链表中的节点-力扣(LeetCode)
  • 【Java零基础·第12章】Lambda与Stream API
  • Qemu-NUC980(八):GPIO Controller
  • 外贸型企业网站建设开源商城源码
  • JS逆向-安全辅助项目Yakit热加载魔术方法模版插件语法JSRpc进阶调用接口联动
  • 使用IOT-Tree接入各种数据转BACnet模拟设备输出
  • 网站搭建说明北京海淀区是几环
  • 基于多模态AI技术的传统行业智能化升级路径研究——以开源AI大模型、AI智能名片与S2B2C商城小程序为例
  • 【C语言进阶】指针进阶_数组指针的使用,数组参数和指针参数
  • PySide6 控件插入日期时间(QDateTime)
  • 网站建设 jsp php垂直网站建设
  • 招商网站大全企业官方网站建设的流程
  • 征程 6 | 工具链如何支持 Matmul/Conv 双 int16 输入量化?
  • 【案例实战】鸿蒙分布式调度:跨设备协同实战
  • 中英文网站设计网站开发投标文件
  • Langgraph译文1:让AI自主决策的代理架构
  • 如何让百度能查到自己衡阳专业的关键词优化终报价
  • 为什么.NET的System.IO.Compression无法解压zlib流
  • 微信小程序:日常零售供应系统
  • 安卓如何查看settings是被哪个进程更新的?相关dumpsys命令剖析
  • 网络营销方式案例分析郑州网站优化推广
  • 下载软件太慢的加速操作
  • 网站改版技术要求git wordpress中文免费主题
  • 从应力到位移:混合模式分层损伤起始点推导