多年来,已经有许多关于使用射线跟踪器绘制高度场地形的不同技术的论文。一些算法直接(或通过四叉树)对网格进行光线行进;其他人则将地形转换为多边形网格,并使用标准的射线三角形相交测试。这项研究似乎在过去几年中一直在进行,并且很难找到过去十年中撰写的论文,但是内存和计算(CPU和GPU)之间的平衡仍然在变化。

如今,哪种算法可在高端台式机上提供最佳性能?或者,如果没有一个答案,那么当前最佳算法的性能特征有何不同?

评论

屏幕空间反射:使用深度和帧缓冲区创建一个高度场,对其进行光线追踪以获取粗略的反射。我不知道细节,但是我想《孤岛危机》,《杀戮地带》,《近日冻伤》等将使用一些复杂的技术来使其快速完成。你看过这个吗?

@DavidKuri谢谢,这是如何快速获得核心光线行进的好指针。对于更静态的高度场,应该有很多优化方法可能无法在屏幕空间跟踪中很好地发挥作用,例如预先计算mipmap或最小-最大四叉树,因此我仍在寻找答案涵盖了这一点。

嘿Dan BTW您是否在寻找CPU或GPU解决方案?实时还是非实时渲染?

@AlanWolfe我使用的是GPU和非实时(即最大吞吐量,而不是您可以在16毫秒内管理的最佳图像质量),但是我仍然会推荐一些有趣的答案,这些答案在CPU上或主要是在交互式渲染器上都是快速的。 br />
您可以尝试从高度图创建一个带符号的距离字段。基本上就是3d纹理,用于存储到下一个表面的距离。这允许“更快地移动射线”。虚幻引擎4将此用于一般的中距离环境光遮挡,柔和阴影和地形阴影

#1 楼

对于当前的最新技术,请查看本文:
“ Tevs等人的“用于快速,准确和可扩展的动态高度场的最大Mipmap
渲染”。 2008

基本思想是通过了解大面积地形的最大值来跳过很多空间。如果光线停留在上方,请跳到下一个大区域。

如果看图8,您将看到基本线性步进与最大mipmap的比较。线性步进导致200步,可以在现代GPU上实时完成,但实际上仍然很慢。最大的mipmap大约需要10个步骤,全部在着色器中完成。

评论


$ \ begingroup $
我接受这个答案,因为论文本身很好,并且其“相关工作”部分似乎很全面。即使我最终没有完全使用该技术,也可以确定我可以从此应用程序及其参考中为自己的用例定制一些内容。
$ \ endgroup $
–丹·赫尔姆
16-2-5在9:42

$ \ begingroup $
您是否找到了具有最大mipmap的演示?谢谢。
$ \ endgroup $
–琼·特劳斯提·阿拉森(JónTrausti Arason)
17年2月14日在15:31

$ \ begingroup $
我还没有读过这篇论文,但是这种“最大mipmap”听起来与“锥步映射”所用的技术非常相似(由于使用了视锥,该技术比视差遮挡映射有所改进)。
$ \ endgroup $
–朱利安·盖尔特(Julien Guertault)
17-10-27在3:35

$ \ begingroup $
@JulienGuertault我会说这是普通的HiZ跟踪。这是确保您击中目标的安全方法。但是与二进制搜索之类的不安全方法相比,速度不是很快。
$ \ endgroup $
–v.oddou
17-10-30在2:46

#2 楼

我亲自看到的最好的东西是inigo quillez所做的东西,用于演示场景。光线在地形上前进,因为距(通常)远处的细节影响不大(例外=薄壁!),所以距相机越远,步伐越大。他使用渗透率信息和其他容易获得的指标来模拟环境光遮挡和其他复杂的照明技术。

这里是演示实际操作的示例:
https://www.youtube.com/观看吗?v = _YWMGuh15nE

这是IQ上有关地形光线行进的页面,非常有趣,请阅读:
http://www.iquilezles.org/www/articles/terrainmarching/terrainmarching .htm

BTW,在现代游戏中,“屏幕空间反射”技术通常只是对渲染场景的Z缓冲区的射线行进。 Z缓冲区实际上只是一个高度场。

我在2014 siggraph上看到了一些关于此的讨论,虽然有些人使用与IQ相似的技术,但有些人做的甚至不如智商,这很有趣:P

评论


$ \ begingroup $
链接中的算法非常简单。它看起来不像我从90年代发现的一些论文那么复杂。看来这是一个很好的起点,但我希望为生产系统提供性能最高的解决方案,而不仅仅是“我的第一个光线跟踪器”。
$ \ endgroup $
–丹·赫尔姆
15年11月17日在8:35

$ \ begingroup $
在最先进的现代游戏中,这些东西用于场景代码和屏幕空间反射。最快的代码有时是最简单的。由于其简单性,我不会拒绝它。有趣的是,您是否会收到其他任何回复。
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
2015年11月17日14:18



$ \ begingroup $
您的响应中缺少的是,IQ使用标准的高度场网格作为初始猜测来开始对实际地形进行光线编排。他首先使用标准栅格化渲染低多边形版本的地形,然后在图像上运行像素着色器,然后在栅格化深度减去某个保守阈值的情况下开始进行光线marching。这是真正实现实时性的唯一方法。
$ \ endgroup $
– Benedikt Bitterli
15年11月17日在19:23

$ \ begingroup $
我相信您所说的只是真实的一部分。他确实使用了基于地形高度的启发式方法(以及与相机的距离)来得出射线可以行进多远,但是据我所知,他没有使用栅格化。这是他不使用栅格化的示例,但这并不是说没有使用栅格化的实现:shadertoy.com/view/MdX3Rr
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
15年11月17日在19:27

$ \ begingroup $
我有点困惑,这个问题与射线追踪有关,而这个答案与射线行进有关。两者之间以及它们可以实现的目标之间存在根本的区别。
$ \ endgroup $
–朱利安·盖尔特(Julien Guertault)
15年11月19日在12:35

#3 楼

锥步映射和松弛锥步映射似乎是非常不错的算法。这些依赖于对高度字段的一点预处理来创建用于更有效查找的2D映射。

http://www.lonesock.net/files/ConeStepMapping.pdf
https ://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch18.html