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

问题描述 投票:0回答:2

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

particles depth-buffer directx-12
2个回答
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/]


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.