Directx 在渲染3D场景之前,如何在3D场景的顶部渲染2D UI?

Directx 在渲染3D场景之前,如何在3D场景的顶部渲染2D UI?,directx,directx-11,direct3d,direct3d11,Directx,Directx 11,Direct3d,Direct3d11,我有一个包含2D覆盖的2D纹理。纹理本身大部分为空白(透明),少数部分包含一些数据 我当前要做的是渲染整个3D场景,禁用深度缓冲区并在其上渲染2D四边形: // render 3D scene context->OMSetDepthStencilState(_noDepthTestState.Get(), 1); // disable depth test // render 2D quad on top of the whole viewport context->OMSe

我有一个包含2D覆盖的2D纹理。纹理本身大部分为空白(透明),少数部分包含一些数据

我当前要做的是渲染整个3D场景,禁用深度缓冲区并在其上渲染2D四边形:

 // render 3D scene
 context->OMSetDepthStencilState(_noDepthTestState.Get(), 1); // disable depth test
 // render 2D quad on top of the whole viewport
 context->OMSetDepthStencilState(nullptr, 1); // restore default
\u noDepthTestState
变量是使用以下描述符创建的
id3d11depthtstencilstate

   D3D11_DEPTH_STENCIL_DESC desc{};
   desc.DepthEnable = false;
   desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
   desc.DepthFunc = D3D11_COMPARISON_LESS;
   desc.StencilEnable = true;
   desc.StencilReadMask = 0xFF; 
   desc.StencilWriteMask = 0xFF;
   desc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
   desc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
   desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
   desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
   desc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
   desc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
   desc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
   desc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
我希望在渲染3D场景之前渲染2D覆盖四边形,并且仅在2D覆盖为空白的位置绘制3D对象


有没有一种有效的方法来实现这种行为?深度/模具状态的正确配置是什么?

这取决于主3D场景的渲染方式

假设您不使用模具缓冲区,并且使用D3D11_比较_较小的深度比较,请按照以下方式绘制四边形

顶点着色器应输出四边形顶点[±1、±1、0、1]。这使得GUI最接近摄影机,早期的Z拒绝应该在PS阶段之前在3D场景中剪裁遮挡的像素,节省一些GPU资源(我假设这就是为什么要首先渲染2D)

像素着色器应该从GUI纹理中读取,将alpha与某个阈值进行比较,如果足够小,则调用
discard
。丢弃的像素不会更改任何缓冲区,也不会更改颜色或深度/模具


如果您的GUI是由轴对齐的矩形组成的,或者您不使用MSAA,那么这将正常工作。然而,如果您确实拥有GUI的曲线/对角线边缘,并且使用MSAA,您将不会对结果感到满意。解决这个问题是可能的,但要复杂得多。当渲染GUI纹理时,你需要以某种方式产生每一个像素<代码> SvultBuffs/Cuth.Value.< /P>听起来好像你可以把覆盖看作是UI元素。首先渲染3D场景,然后将覆盖渲染为精灵。甚至可以对顶点位置使用剪辑空间,然后对角点使用屏幕像素值<代码>x=(x/视区宽度)*2-1
y=-((y/视口高度)*2-1)