有没有办法在像素着色器中读取深度缓冲区? [DX12]

时间:2019-12-03 11:32:17

标签: particles depth-buffer directx-12

我正在尝试读取深度值以创建软粒子,但找不到有关该方法的信息。 hlsl中是否有内置变量来达到像素位置的深度值?

2 个答案:

答案 0 :(得分:1)

首次使用像素着色器渲染对象时,无法读取深度缓冲区。但是,如果要先进行深度预占,则可以将结果深度缓冲区转换为着色器资源,并像像素着色器中的纹理一样从中进行采样。要进行深度预传递或z传递,您只需使用顶点着色器而不绑定像素着色器即可渲染所有几何图形。然后再次使用像素着色器进行渲染。

答案 1 :(得分:0)

否,这是不可能的。相应的语义是SV_Depth,但仅是写的。

出于性能原因,供应商已选择不实施任何允许深度和目标缓冲区进行读取同步的操作。如果GPU不必担心在像素着色器执行过程中有人想读取这些值的可能性,那么它就会变得更快。

另请参阅此处的HLSL语义文档,包括SV_DepthSV_Targethttps://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics

这也是一个有趣的话题,如果您想更深入地研究该主题(从2008年开始,但它已经老化了),人们可以通过论文链接对此进行讨论:https://forum.beyond3d.com/threads/reading-sv_depth-and-sv_target-in-pixel-shader-hardware-implementation-issues.44816/