C ++中的DirectX 10 HUD

时间:2010-11-11 05:04:43

标签: c++ directx directx-10

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

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

我的问题实际上归结为:我是否在正确的轨道上,或者我是否需要重新考虑这一点?另外,如果这是对这个问题的一个很好的攻击计划,我还有什么可以忘记的吗?

以下是我尝试获取此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);

1 个答案:

答案 0 :(得分:1)

是的,你正在吠叫正确的树。但要记住的是,如果您的菜单系统是分层的,那么您必须回到前面,因为Z缓冲区无法帮助您。这意味着相当多的透支。

另一种解决方案允许您通过使用Z缓冲区(特别是使用早期Z拒绝硬件支持)和前后绘制来限制透支的数量。然而,您遇到了与场景交互的问题。只需在渲染菜单之前清除Z-Buffer即可轻松解决此问题。

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