gpt4 book ai didi

c++ - 阴影贴图,距离与深度比较?

转载 作者:行者123 更新时间:2023-11-28 06:56:37 25 4
gpt4 key购买 nike

我一直在看阴影贴图,我看到有些人在阴影通道中将距离的平方写到深度纹理中,而有些人则使用实际的深度值。有什么理由比另一个更喜欢一个吗?仅使用实际深度值似乎更快?

最佳答案

在对其中一个答案的评论中,我注意到您引用了我编写的另一个答案,并且我想确保您了解该答案的原始内容。

尽管到目前为止的答案都集中在实际比较本身的复杂性上,但他们没有考虑更改存储在硬件深度缓冲区中的值对阴影贴图构造的性能有何影响。您担心早期Z拒绝的影响,这是一个有效的关注,但是它只会影响阴影贴图构造的性能,正如我将在下面解释的那样。

另外,请记住,answer you are referring to与基于立方体贴图的阴影贴图有关。由于它们的构造和采样方式独特,因此它们面临着一系列挑战,这就是为什么比较与您在其他情况下所看到的略有不同的原因。



现代GPU使用图块层次结构来压缩颜色和深度缓冲区,以增加内存吞吐量。

这种压缩不会节省存储空间(实际上,它会增加一点额外的存储开销),但是它所做的是允许更快地清除和提取缓冲区。不必将相同的颜色或深度写入缓冲区中的每个像素,而是可以将每个图块标记为“透明”,并指定清晰的颜色/深度。当需要获取像素的颜色/深度时,首先要看的是该像素所属的图块,如果整个图块都清晰可见,则将返回图块的颜色,而不会遇到获取麻烦的问题。内存中的实际像素。

很好...但是压缩与早期深度测试有什么关系?

实际上很多。这种分层存储结构非常适合一次拒绝大量片段,因为可以在单个专门的存储操作中确定整个像素块的最小/最大深度。这确实意味着写入颜色/深度缓冲区要复杂得多(必须更新标志和这样的每平铺),但是硬件是专门设计为以这种方式工作的,而且很多时候您不必这样做任何特别的好处。

现在,即使光栅化器可以完成简单的固定功能工作,但只要适用分层Z缓冲(Hi-Z),它都会做一些非常聪明的事情。考虑到所有图元都是平面的,如果可以保证光栅化器不使片段着色器改变深度,则可以使用以下方法执行粗粒度(例如,压缩深度缓冲区中的1个测试)最小/最大深度值,并在着色/混合之前杀死多个片段。如果通过了此粗粒度测试,或者如果片段着色器写入了自己的深度,则必须对每个片段进行着色,然后再分别针对深度缓冲区进行测试。现在,在您的情况下,片段着色器非常简单,因此不必要地对片段进行着色的费用将不会像通常那样多,并且混合也不是仅进行深度遍历的因素。

但是,必须对完全阻塞的图元进行每个片段的后期深度测试,这是浪费时间,而Hi-Z可以避免。仅深度渲染的许多可衡量的开销实际上是绘图调用本身(状态验证,命令序列化等)引起的前端CPU开销。假设只对深度测试进行了有效批处理,则可以通过提高深度测试的效率来提高性能。只是不希望看到性能上的巨大改进,上面有多个原因说明了为什么Hi-Z在更传统的渲染中效果更好。

顺便说一句,如果您想获得我刚才解释的大部分内容的直观摘要,请查看here



回到您的原始问题...

最后,在构建阴影贴图时正确利用分层Z缓冲不会产生巨大的性能提升,但是它可以通过减少比较深度所需的算术指令数量来抵消所要获得的收益。这主要取决于您更新阴影贴图的频率。一方面,如果只执行一次(静态),则硬件填充阴影贴图的效率实际上并不重要。另一方面,如果必须每帧每光源绘制6个独立的阴影贴图,则可以减少绘制每个阴影所需的时间,从而在性能上有可衡量的改进。

此处未考虑的房间中的大象首先是从阴影贴图获取深度所需的时间(比您的比较多得多的时间)。您可以加快阴影贴图的构建和比较速度,但是最大的好处是可以提高重建(采样)性能。

例如,抗锯齿VSM阴影可以使用传统的纹理过滤来完成,而不必使用其他技术必须执行的多个卷积样本和比较。这使得从VSM进行抗锯齿的重构更加有效。由于VSM是基于方差的,因此不需要存储透视深度...如果需要,可以使用线性距离,因此此算法没有区别。即使构造(存储d和d2)更复杂,但是如果需要抗锯齿,它可能会更有效。

显然没有万能的,您存储在阴影贴图中的内容很大程度上取决于算法。

关于c++ - 阴影贴图,距离与深度比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23078666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com