DirectX11:从计算着色器读取模板位
DirectX11: Read stencil bit from compute shader
我正在将全屏效果转换为计算着色器,以便我可以利用片段着色器无法实现的某些计算功能。现在,这个全屏效果使用模板来避免写入它不应该影响的像素,我想用我的计算着色器模仿这种行为。
我知道我可以将此信息写入某处的颜色通道,但我希望避免这种情况,而是直接在计算着色器中读取模板位。但是,我找不到任何方法将 D24S8 缓冲区绑定到计算着色器,以便我可以实际读取模板位。好像只提供了深度信息。
有什么办法吗? Google 让我失望了,因为在谈论采样深度值时每个人都称它为 depth/stencil 缓冲区。
这是可能的。
- 使用无类型格式创建 D24S8 深度缓冲区纹理 DXGI_FORMAT_R24G8_TYPELESS。
- 使用 DXGI_FORMAT_D24_UNORM_S8_UINT 的强类型格式创建第 1 步中资源的 DepthStencilView。
- 使用 DXGI_FORMAT_X24_TYPELESS_G8_UINT.
的强类型格式创建用于绑定到计算着色器的模板缓冲区的 ShaderResourceView
- [可选] 使用强类型格式 DXGI_FORMAT_R24_UNORM_X8_TYPELESS.
创建资源 "depth" 部分的 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.
我正在将全屏效果转换为计算着色器,以便我可以利用片段着色器无法实现的某些计算功能。现在,这个全屏效果使用模板来避免写入它不应该影响的像素,我想用我的计算着色器模仿这种行为。
我知道我可以将此信息写入某处的颜色通道,但我希望避免这种情况,而是直接在计算着色器中读取模板位。但是,我找不到任何方法将 D24S8 缓冲区绑定到计算着色器,以便我可以实际读取模板位。好像只提供了深度信息。
有什么办法吗? Google 让我失望了,因为在谈论采样深度值时每个人都称它为 depth/stencil 缓冲区。
这是可能的。
- 使用无类型格式创建 D24S8 深度缓冲区纹理 DXGI_FORMAT_R24G8_TYPELESS。
- 使用 DXGI_FORMAT_D24_UNORM_S8_UINT 的强类型格式创建第 1 步中资源的 DepthStencilView。
- 使用 DXGI_FORMAT_X24_TYPELESS_G8_UINT. 的强类型格式创建用于绑定到计算着色器的模板缓冲区的 ShaderResourceView
- [可选] 使用强类型格式 DXGI_FORMAT_R24_UNORM_X8_TYPELESS. 创建资源 "depth" 部分的 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.