在以前的例子中我们只是简单的创建D3D程序, 并使用CPU代替GPU做了很多的图形计算, 现在GPU的图形处理能力远远超过CPU, 我们应该使用GPU做图形渲染的运算, 而让CPU有更多的时间处理其他的事情如进行逻辑计算等. 通常我们的程序需要运行在不同硬件配置的电脑上, 用户也要选择不同的分辩率, 刷新率和颜色等, 这样就要检查硬件配置是否支持该模式或仅列出可用的模式. 以下为可检查硬件是否支持硬件加速等能力, 你可以在程序中配置分辩率和显示模式等.

在以上代码中我们在错误的时候通过 MessageBox 弹出消息对话框显示出错的信息.

首先在我们通过 Direct3DCreate9 创建一个 D3D物体 , 成功后使用 IDirect3D9::GetAdapterModeCount 得到默认显卡支持的 显示模式 数量, 然后通过 IDirect3D9::EnumAdapterModes 检查32位颜色和75MHz刷新率下是否有我们想要使用的分辩率, 当然你也可以设置这些. 当我们检查硬件可以得到想要的 显示模式 后再通过调用 IDirect3D9::GetDeviceCaps 来检查是否支持硬件加速顶点处理器, 该函数将填充 D3DCAPS9 结构, 我们还可以获取硬件支持的VS和PS的版本等信息. 通过 IDirect3D9::CheckDeviceType 来检查是否支持32位的后置缓冲区, 这里其实我们只需要检查全屏模式. 通过 IDirect3D9::CheckDeviceFormat 来检查硬件支持的深度&模板缓冲格式, 深度缓冲也称Z缓冲或W缓冲, 用于存储深度信息, 深度信息决定光栅化时每个三角形的相互遮蔽, 如果启用深度缓冲, 在光栅化三维场景时渲染表面的每个点都要被测试. 深度缓冲中的值可以是一个点的Z坐标值或它的齐次坐标W值, 大多的驱动程序支持基于Z值的深度缓冲但不一定支持基于W值的深度缓冲, 如果试图启用不支持的类型, 驱动程序不会失败而是退而使用另一种缓冲类型或是完全禁用深度缓冲, 这将导致渲染的场景内有极多的深度排序遗留物体. 在这里我们检查硬件是否支持最低16位的深度缓冲.

最后通过获取的参数填充 D3DPRESENT_PARAMETERS 结构, 在创建全屏模式或窗口模式时使用不同的参数.

设置显示参数以后我们通过 IDirect3D9::CreateDevice 来创建一个 D3D设备 . 现在我们已经完成DirectX图形的初始化并可以使用D3D渲染啦.

我们在渲染时需要通过 IDirect3DDevice9::Clear 清屏(这里要注意的是我们使用了深度缓冲, 清屏时除了清 D3DCLEAR_TARGET 还要清 D3DCLEAR_ZBUFFER)并指定一个颜色填充后置缓冲区(我们需要用来画东西的表面), D3DCOLOR_XRGB 宏用于指定一种颜色. 需要注意的是我们在渲染任何物体之前都要调用 IDirect3DDevice9::BeginScene 函数并且在结束渲染后调用 IDirect3DDevice9::EndScene . 这主要是告诉DirectX我们需要画一些图形并且已经清过后置缓冲区啦. 最后我们通过调用 IDirect3DDevice9::Present 切换后置缓冲区到前置缓冲区, 将我们画的图形显示到屏幕上.

D3D物体D3D设备 都是 COM物体 , 我们需要在程序结束后通过 Release 将资源释放给Window, 在以上代码中我们使用自定义的Release_Safe宏释放资源.

下图为本例代码执行效果:

[返回目录][我有话说]