2

我正在尝试在 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);
4

1 回答 1

1

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

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

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

于 2010-11-11T10:08:14.060 回答