我正在尝试在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);
答案 0 :(得分:1)
另一种解决方案允许您通过使用Z缓冲区(特别是使用早期Z拒绝硬件支持)和前后绘制来限制透支的数量。然而,您遇到了与场景交互的问题。只需在渲染菜单之前清除Z-Buffer即可轻松解决此问题。
TBH尽管你最好使用Z-Buffer清除方法,因为这意味着你可以更有效地批量一起绘制调用。即不断地映射和填充ID3D10Buffer将比执行一次然后不断重新绘制它更慢。当状态发生变化时,您可能需要编辑缓冲区,但是您可以限制编辑的缓冲区数量,并且当没有状态更改时,您不会不必要地咀嚼CPU。