DirectX11:从计算着色器读取模板位

Dav*_*age 2 graphics directx-11 compute-shader

我正在将全屏效果转换为计算着色器,以便我可以利用片段着色器无法完成的一些计算功能。现在,这种全屏效果使用模板来避免写入它不应该影响的像素,我想用我的计算着色器来模仿这种行为。

我知道我可以将此信息写入某处的颜色通道,但我希望避免这种情况,而是直接在计算着色器中读取模板位。但是,我找不到任何方法将 D24S8 缓冲区绑定到计算着色器,以便我可以实际读取模板位。它似乎只提供深度信息。

有什么办法可以做到这一点吗?谷歌让我失望了,因为在谈论采样深度值时每个人都将其称为深度/模板缓冲区。

Ada*_*les 5

这个有可能。

  1. 使用无类型格式 DXGI_FORMAT_R24G8_TYPELESS 创建 D24S8 深度缓冲区纹理。
  2. 使用强类型格式 DXGI_FORMAT_D24_UNORM_S8_UINT 创建步骤 1 中资源的 DepthStencilView。
  3. 使用 DXGI_FORMAT_X24_TYPELESS_G8_UINT 强类型格式创建模板缓冲区的 ShaderResourceView,用于绑定到计算着色器。
  4. [可选] 使用强类型格式 DXGI_FORMAT_R24_UNORM_X8_TYPELESS 创建资源“深度”部分的 ShaderResourceView。

确保在 HLSL 中声明您的模板 SRV,以便Texture2D<uint2>您可以访问绿色通道 (G8),这是模板数据的来源。

请注意,由于 Depth 和 Stencil 是独立的 SRV,因此您需要在 HLSL 中声明两个 Texture2D,每个一个。例如:

Texture2D<float> depthBuffer; // Red contains depth.
Texture2D<uint2> stencilBuffer; // Green contains stencil. Red is unused.
Run Code Online (Sandbox Code Playgroud)