这是对MIT Foundation of 3D Computer Graphics第20章的翻译,本章讲解了光线追踪(ray tracing)技术的基础知识。本书内容仍在不断的学习中,因此本文内容会不断的改进。若有任何建议,请不吝赐教nintymiles@icloud.com。
注:文章中相关内容归原作者所有,翻译内容仅供学习参考。
另:Github项目CGLearning中拥有相关翻译的完整资料、内容整理、课程项目实现。
什么是光线追踪(What is Ray Tracing)
光线追踪表达了一种不同于标准OpenGL管线的渲染方式。这种技术原理的大部分超越了本书的范围,但是我们会给出基础概念的概要。关于这个主题在本书中要参考更多,请查看本书课后练习[23]或[56]。
20.1 循环排序(Loop Ordering)
从最基本的视角,我们可以将OpenGL基于光栅化的渲染看作下面的算法形式
//psuedo code
initialize z-buffer //启动z-buffer
for all triangles //遍历所有三角形
for all pixels covered by the triangle //遍历三角形所覆盖的像素
compute color and z //计算像素的色彩和z值
if z is closer than what is already in the z-buffer //如果z比z-buffer中所见的更接近
update the color and z of the pixel //更新这个像素的色彩和z值
这种算法具有每个场景中的三角形仅被接触一次的良好特性,并且以一种可预测的顺序。例如,正是这个原因,甚至离线的皮克斯(Pixar)的RenderMan软件也使用了这种基本算法。另一种好的特性是,在三角形处理期间,设置计算仅被完成一次并且可以在其中所有像素上平摊。正如我们已经看到的,基于光栅化的渲染可以使用迷人的着色计算甚至使用多通道算法来增强。也存在诸如遮挡剔除(参考课后例子[11])等高级算法,这些算法尝试避免渲染那些在场景中我们知道其会被其它物体所遮挡的三角形。
在基本的光线追踪中,我们反转循环顺序以获得如下的算法
//psuedo code
for all pixels on the screen
for all objects seen in this pixel //对于在这个像素被看到的所有物体
if this is the closest object seen at the pixel //如果其是在像素上被看到的最近的物体
compute color and z //计算色彩和z值
set the color of the pixel //设置这个像素的色彩
在第二行中,我们需要计算沿着一个像素的