【发布时间】:2021-01-04 11:18:21
【问题描述】:
我有一个包含 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
_noDepthTestState 变量是使用以下描述符创建的 ID3D11DepthStencilState:
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 叠加四边形,并且 3D 对象只会在 2D 叠加为空白的地方绘制。
有没有一种有效的方法来实现这种行为?深度/模板状态的正确配置是什么?
【问题讨论】:
-
听起来您可以将叠加层视为 UI 元素。首先渲染 3D 场景,然后将叠加层渲染为精灵。您甚至可以将剪辑空间用于顶点位置,然后您可以将屏幕像素值用于角落。
x=(x/viewport.width)*2-1;和y=-((y/viewport.height)*2-1).
标签: directx directx-11 direct3d direct3d11