- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在看阴影贴图,我看到有些人在阴影通道中将距离的平方写到深度纹理中,而有些人则使用实际的深度值。有什么理由比另一个更喜欢一个吗?仅使用实际深度值似乎更快?
最佳答案
在对其中一个答案的评论中,我注意到您引用了我编写的另一个答案,并且我想确保您了解该答案的原始内容。
尽管到目前为止的答案都集中在实际比较本身的复杂性上,但他们没有考虑更改存储在硬件深度缓冲区中的值对阴影贴图构造的性能有何影响。您担心早期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/
我正在使用python 2.7 当我尝试在其上运行epsilon操作时出现此错误, 这是我的代码 import cv2 import numpy as np img = cv2.imread('img
1 很多程序员对互联网行业中广泛讨论的“35岁危机”表示不满,似乎所有的程序员都有着35岁的职业保质期。然而,随着AI技术的兴起,这场翻天覆地的技术革命正以更加残酷且直接的方式渗透到各行各业。程序员
我有一个包含多个子模块的项目,我想列出每个子模块的相对深度 该项目: main_project submodule1 submodule1\submodule1_1 submo
我有一张彩色图像及其深度图,它们都是由 Kinect 捕获的。我想将它投影到另一个位置(以查看它在另一个视角下的样子)。由于我没有 Kinect 的内在参数(相机参数);我该如何实现? P.S:我正在
给出了这三个网址: 1) https://example.com 2) https://example.com/app 3) https://example.com/app?param=hello 假
这个着色器(最后的代码)使用 raymarching 来渲染程序几何: 但是,在图像(上图)中,背景中的立方体应该部分遮挡粉红色实体;不是因为这个: struct fragmentOutput {
我希望能够在 ThreeJS 中创建一个房间。这是我到目前为止所拥有的: http://jsfiddle.net/7oyq4yqz/ var camera, scene, renderer, geom
我正在尝试通过编写小程序来学习 Haskell...所以我目前正在为简单表达式编写一个词法分析器/解析器。 (是的,我可以使用 Alex/Happy...但我想先学习核心语言)。 我的解析器本质上是一
我想使用像 [parse_ini_file][1] 这样的东西。 例如,我有一个 boot.ini 文件,我将加载该文件以进行进一步的处理: ;database connection sett
我正在使用 Mockito 来测试我的类(class)。我正在尝试使用深度 stub ,因为我没有办法在 Mockito 中的另一个模拟对象中注入(inject) Mock。 class MyServ
我试图在调整设备屏幕大小时重新排列布局,所以我这样做: if(screenOrientation == SCREEN_ORIENTATION_LANDSCAPE) { document
我正在 Ubuntu 上编写一个简单的 OpenGL 程序,它使用顶点数组绘制两个正方形(一个在另一个前面)。由于某种原因,GL_DEPTH_TEST 似乎不起作用。后面的物体出现在前面的物体前面
static FAST_FUNC int fileAction(const char *pathname, struct stat *sb UNUSED_PARAM, void *mo
我有这样的层次结构: namespace MyService{ class IBase { public: virtual ~IBase(){} protected: IPointer
我正在制作一个图片库,需要一些循环类别方面的帮助。下一个深度是图库配置文件中的已知设置,因此这不是关于无限深度循环的问题,而是循环已知深度并输出所有结果的最有效方法。 本质上,我想创建一个 包含系统中
如何以编程方式在树状结构上获取 n 深度迭代器?在根目录中我有 List 每个节点有 Map> n+1 深度。 我已修复 1 个深度: // DEPTH 1 nodeData.forEach(base
我正在构建一个包含大量自定义元素的 Polymer 单页界面。 现在我希望我的元素具有某种主样式,我可以在 index.html 或我的主要内容元素中定义它。可以这样想: index.html
我正在尝试每 25 秒连接到配对的蓝牙设备,通过 AlarmManager 安排,它会触发 WakefulBroadcastReceiver 以启动服务以进行连接。设备进入休眠状态后,前几个小时一切正
假设有一个有默认值的函数: int foo(int x=42); 如果这被其他人这样调用: int bar(int x=42) { return foo(x); } int moo(int x=42)
是否可以使用 Javascript 获取 url 深度(级别)? 如果我有这个网址:www.website.com/site/product/category/item -> depth=4www.w
我是一名优秀的程序员,十分优秀!