有没有比光栅化或光线追踪更好的渲染选择?

17

光栅化(三角形)和光线追踪是我所遇到的渲染3D场景的唯一方法。还有其他方法吗?此外,我想知道是否有其他非常“独特”的3D制作方式,例如不使用多边形。

3个回答

46

啊啊!这些答案非常不准确!

当然,问题的不精确也没有帮助。

好的,“渲染”是一个非常广泛的话题。在渲染中的一个问题是相机可见性或“隐藏表面算法”,即确定每个像素中看到哪些对象。有各种各样的可见性算法的分类。这可能是发帖人所问的(考虑到他们将其视为“光栅化”和“光线跟踪”之间的二分法)。

经典的(尽管现在有些过时)分类参考是Sutherland et al.的“十种隐藏表面算法的特征描述”,ACM计算机调查1974年。它非常过时,但仍然非常适合提供框架来思考如何对这些算法进行分类。

一类隐藏表面算法涉及“射线投射”,即计算从相机通过每个像素与物体的交点(可以具有各种表示形式,包括三角形,代数曲面,NURBS等)。

其他类别的隐藏表面算法包括“z-buffer”,“扫描线技术”,“列表优先算法”等。在那些计算周期不多且没有足够的内存来存储z-buffer的日子里,他们非常有创意地设计算法。

现代计算和内存都很便宜,因此三种技术基本上获胜了:(1)将所有内容切换成三角形并使用z-buffer;(2)射线投射;(3)类似Reyes的算法,使用扩展z-buffer来处理透明度等。现代图形卡执行#1;高端软件渲染通常执行#2或#3或组合。虽然已经提出了各种光线跟踪硬件,并且有时也建造了,但从未流行起来,而且现代GPU现在足够可编程,以实际进行光线跟踪,但速度劣势很大,以其编码硬件化的光栅化技术为主。多年来,其他更奇特的算法大都被淘汰了。(尽管各种排序/喷洒算法可以用于体积渲染或其他特殊目的。)

“Rasterizing”实际上就是“计算一个对象落在哪些像素上”。惯例规定它不包括光线追踪,但这是不确定的。您可以认为栅格化回答了“此形状与哪些像素重叠”,而光线追踪回答了“哪个对象在这个像素后面”,如果您看到区别的话。
那么,隐藏表面去除不是在“渲染”领域中要解决的唯一问题。知道每个像素中可见的对象只是一个开始,您还需要知道它是什么颜色,这意味着必须有某种计算环境中光如何传播的方法。有许多技术,通常分为处理阴影、反射和“全局照明”(即在物体之间反弹,而不是直接来自光源)。
“光线追踪”是将射线投射技术应用于阴影、反射、全局照明等方面的可见性的技术。可以使用光线追踪来处理所有内容,或者使用各种栅格化方法进行摄像机可见性,然后使用光线追踪来处理阴影、反射和GI。 “光子映射”和“路径追踪”是计算某些种类的光传播(使用光线追踪,因此错误地说它们在根本上是不同的渲染技术)的技术。还有一些不使用光线追踪的全局照明技术,例如“辐射度”方法(这是一种求解全局光传播的有限元方法,但当前该领域中已经不太流行)。但是,使用辐射或光子映射进行光传播仍然需要您以某种方式制作最终图片,通常是使用标准技术之一(射线投射、z缓冲/栅格化等)。
提到特定形状表示(NURBS、体积、三角形)的人也有点困惑。这是与光线跟踪与栅格化无关的问题。例如,您可以直接追踪nurbs,也可以将nurbs划分为三角形并对其进行追踪。您可以直接将三角形栅格化到z缓冲区中,但是您也可以按扫描线顺序直接将高阶参数曲面栅格化(参见Lane/Carpenter等CACM 1980年)。

1
+1 对于“光栅化”,实际上就是“确定一个物体落在哪些像素上。” 我花了很多年才意识到这一点。 - Bossliaw

5
有一种技术叫做光子映射,它与光线追踪非常相似,但在复杂场景中提供了各种优势。事实上,只有这种方法(至少我所知道的)在正确使用时能够真正地提供符合光学定律的真实渲染。据我所知,这种技术很少被使用,因为它的性能甚至比光线追踪还要差得多(因为它实际上相当于模拟了从光源到相机的光子路径),但这是它唯一的缺点。虽然这是一个有趣的算法,但在光线追踪之后(如果有的话),你不会在广泛的应用中看到它。

1
请注意,与光线追踪一样,这种方法不需要多边形。例如,球体可以被完美地表示。实际上,用多边形来建模大多数复杂对象是最容易的。 - Noldorin
1
球体也可以在光线追踪中完美地表示。 - Andrei Krotkov
1
另一种可以提供逼真渲染效果的方法是路径追踪,它类似于光线追踪,但使用随机光流而不是确定性阴影检查。它很可能比光子映射还要慢。 :) - FeepingCreature
@Andrei:事实上,这正是我所说的! @FeepingCreature:是的,看来你是对的。它们都属于同一类渲染器,尽管光子映射/路径追踪有其自身的优缺点。 - Noldorin
光子映射使用光线追踪,它并不是与光线追踪分开的(就像“光线追踪阴影”或“光线追踪反射”与“光线追踪”不分开一样)。此外,光子映射用于计算光的特定传播(某些类型的全局照明),它并不直接适用于计算物体的直接相机可见性,因此光子映射并不是问题的正确答案。 - Larry Gritz
1
@Larry:实际上,那是不正确的。你可以说它们属于相同的渲染算法家族,但光线追踪显然是不同的——首先它不能完全解决渲染方程。不过这真的值得被踩吗? - Noldorin

2
维基百科上的渲染文章涵盖了各种技术。
许多渲染算法已经被研究,用于渲染的软件可能采用多种不同的技术来获得最终图像。在场景中跟踪每个光线是不切实际的,需要大量时间。即使跟踪足以产生图像的部分,如果采样没有智能限制,也需要很长时间。因此,出现了四个更高效的光传输建模技术:栅格化,包括扫描线渲染,将场景中的对象几何投影到图像平面上,没有高级光学效果;射线投射将场景视为从特定视点观察到的,仅基于几何和非常基本的反射强度光学定律计算观察到的图像,也许使用蒙特卡罗技术来减少伪影;辐射度使用有限元数学来模拟光从表面扩散;而光线跟踪类似于射线投射,但采用更先进的光学模拟,并通常使用蒙特卡罗技术以获得更真实的结果,速度通常慢几个数量级。大多数先进的软件结合两种或更多的技术,以合理的成本获得足够好的结果。另一个区别是图像顺序算法和对象顺序算法之间的区别,前者迭代图像平面上的像素,后者迭代场景中的对象。通常对象顺序更有效率,因为场景中的对象通常比像素少。
从这些描述中,只有辐射度在概念上对我来说似乎不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接