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

时间:2016-01-04 22:51:28

标签: graphics directx-11 compute-shader

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

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

有没有办法做到这一点?谷歌让我失望,因为在谈论采样深度值时,每个人都称它为深度/模板缓冲区。

1 个答案:

答案 0 :(得分:1)

这是可能的。

  1. 使用无类型格式DXGI_FORMAT_R24G8_TYPELESS创建D24S8深度缓冲区纹理。
  2. 使用强类型格式DXGI_FORMAT_D24_UNORM_S8_UINT在步骤1中创建资源的DepthStencilView。
  3. 使用强类型格式DXGI_FORMAT_X24_TYPELESS_G8_UINT创建模板缓冲区的ShaderResourceView以绑定到Compute Shader。
  4. [可选]创建"深度"的ShaderResourceView。部分资源使用强类型格式DXGI_FORMAT_R24_UNORM_X8_TYPELESS。
  5. 确保将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.