c++ - C++ 中的 DirectX 10 HUD

标签 c++ directx directx-10

我正在尝试在 DirectX 10 中制作自定义 HUD 系统。我目前的攻击方法是简单地使用网格树来表示不同级别的菜单。

我相信,通过禁用深度测试,我可以制作一个网格,该网格粘贴在背景中其余 3d 世界的上方。为此,我尝试使用 D3D10_DEPTH_STENCIL_DESC,并将 DepthEnable 选项设置为 false。然后,我将此 D3D10_DEPTH_STENCIL_DESC 绑定(bind)到模板状态,然后在绘制网格之前将其激活。到目前为止,这给我留下了一个缺失的网格。

我的问题实际上可以归结为:我是否在正确的轨道上,或者我是否需要重新考虑这个问题?此外,如果这是解决此问题的好计划,是否有任何我忘记考虑的事情?

下面是我尝试获取此 HUD 的代码位

创建 D3D10_DEPTH_STENCIL_DESC:

    //HUD Elements
D3D10_DEPTH_STENCIL_DESC dsDesc;
//Depth Settings 
dsDesc.DepthEnable      = false;
dsDesc.DepthWriteMask   = D3D10_DEPTH_WRITE_MASK_ALL;
dsDesc.DepthFunc        = D3D10_COMPARISON_LESS;
//Stencil settings
dsDesc.StencilEnable    = true;
dsDesc.StencilReadMask  = 0xff;
dsDesc.StencilWriteMask = 0xff;
//Always pass the stencil test, and replace the current stencil value with 
// the stencil reference value 1
dsDesc.FrontFace.StencilFailOp      = D3D10_STENCIL_OP_KEEP;
dsDesc.FrontFace.StencilDepthFailOp = D3D10_STENCIL_OP_KEEP;
dsDesc.FrontFace.StencilPassOp      = D3D10_STENCIL_OP_REPLACE;
dsDesc.FrontFace.StencilFunc        = D3D10_COMPARISON_ALWAYS;
// We are not rendering backfacing polygons, so these settings do not matter.
dsDesc.BackFace.StencilFailOp       = D3D10_STENCIL_OP_KEEP;
dsDesc.BackFace.StencilDepthFailOp  = D3D10_STENCIL_OP_KEEP;
dsDesc.BackFace.StencilPassOp       = D3D10_STENCIL_OP_REPLACE;
dsDesc.BackFace.StencilFunc         = D3D10_COMPARISON_ALWAYS;
//Bind HUD to a stencil
HR(md3dDevice->CreateDepthStencilState(&dsDesc,&hud));

要画画,我只需要做:

    md3dDevice->OMSetDepthStencilState(hud, 1);
menu.draw(mVP);

最佳答案

是的,您找对了树。但要记住的一点是,如果您的菜单系统是分层的,那么您必须从后退到前面,因为 Z 缓冲区无法帮助您。这将意味着相当多的 overdraw 。

另一种解决方案允许您通过使用 Z 缓冲区(尤其是使用早期的 Z 拒绝硬件支持)并从前到后绘制来限制 overdraw 量。但是,您会遇到它与您的场景交互的问题。只需在呈现菜单之前清除 Z-Buffer 即可轻松解决此问题。

TBH 尽管您最好使用 Z-Buffer 清除方法,因为这意味着您可以更有效地批处理绘制调用。即不断映射和填充 ID3D10Buffer 将比执行一次然后不断重新绘制它要慢。当然,当状态发生变化时,您可能需要编辑缓冲区,但您可以限制编辑的缓冲区数量,并且当没有状态变化时,您不会不必要地消耗 CPU。

关于c++ - C++ 中的 DirectX 10 HUD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4151497/

相关文章:

c++ - 在构造函数中初始化 const char * - 会不会有内存泄漏?

c++ - 不是类或结构名称 _D3DCOLORVALUE

opengl - 在我的代码 : Whats the licensing model? 中使用 NVidia FxAA

c++ - 错误 C2228 : left of '.DXGI_MODE' must have class/struct/union Direct X

c++ - Eigen: 逗号初始化动态矩阵

C++ 运行多个类函数

C++ Directx鼠标输入在失去焦点后表现得很奇怪

c++ - 将 C++ 应用程序从 Directx9 移植到 Directx10 之前的重要阅读

c++ - 类实例的唯一标识

c++ - 如何防止direct2d “stretching”窗口大小改变时的 View ?