【问题标题】:DirectX11: Read stencil bit from compute shaderDirectX11:从计算着色器读取模板位
【发布时间】:2016-04-08 15:59:25
【问题描述】:
我正在将全屏效果转换为计算着色器,以便我可以利用片段着色器无法完成的一些计算功能。现在,这个全屏效果使用模板来避免写入不应该影响的像素,我想用我的计算着色器来模拟这种行为。
我知道我可以将此信息写入某处的颜色通道,但我希望避免这种情况,而是直接在计算着色器中读取模板位。但是,我找不到任何方法将 D24S8 缓冲区绑定到计算着色器,以便我可以实际读取模板位。它似乎只提供深度信息。
有没有办法做到这一点?谷歌让我失望了,因为在谈论采样深度值时,每个人都称它为深度/模板缓冲区。
【问题讨论】:
标签:
graphics
directx-11
compute-shader
【解决方案1】:
这是可能的。
- 使用无类型格式 DXGI_FORMAT_R24G8_TYPELESS 创建您的 D24S8 深度缓冲区纹理。
- 使用强类型格式 DXGI_FORMAT_D24_UNORM_S8_UINT 在步骤 1 中创建资源的 DepthStencilView。
- 使用 DXGI_FORMAT_X24_TYPELESS_G8_UINT 的强类型格式创建模板缓冲区的 ShaderResourceView 以绑定到计算着色器。
- [可选] 使用强类型格式 DXGI_FORMAT_R24_UNORM_X8_TYPELESS 创建资源“深度”部分的 ShaderResourceView。
确保您在 HLSL 中将您的模板 SRV 声明为 Texture2D<uint2>,以便您可以访问模板数据的来源绿色通道 (G8)。
请注意,由于深度和模板是独立的 SRV,您需要在 HLSL 中声明两个 Texture2D,每个对应一个。例如:
Texture2D<float> depthBuffer; // Red contains depth.
Texture2D<uint2> stencilBuffer; // Green contains stencil. Red is unused.