https://www.scratchapixel.com/lessons/3d-basic-rendering/introduction-to-ray-tracing
Keywords: ray-tracing, perspective projection, conductor, dielectric, forward tracing, backward tracing, shadow ray, primary ray, eye ray, path tracing, reflection, refraction, Appel, Whitted, index of refraction, Fresnel equation, transmission, recursive, recursion depth, image file format.
在本课开始之前,我们将解释如何将 3D 场景制作成可见的二维图像。一旦我们了解了该过程及其涉及的内容,我们将能够利用计算机通过类似方法模拟“人造”图像。我们喜欢将此部分视为构建更高级 CG 的理论。
在本课的第二部分,我们将介绍光线追踪算法并简要解释它的工作原理。我们收到了很多人的电子邮件,询问为什么我们专注于光线追踪而不是其他算法。事实是,我们不是。为什么我们选择在本介绍性课程中关注光线追踪?仅仅因为这个算法是模拟导致物体可见的物理现象的最直接的方法。出于这个原因,我们认为在编写创建简单图像的程序时,光线追踪是除其他技术之外的最佳选择。
首先,我们将为光线追踪算法打下基础。然而,一旦我们涵盖了实现扫描线渲染器所需的所有信息,例如,我们也会展示如何做到这一点。
How Does an Image Get Created?
虽然从下面的陈述开始看起来很不寻常,但我们首先需要生成一个图像,是一个二维表面(这个表面需要是某个区域,不能是一个点)。考虑到这一点,我们可以将图片想象为通过金字塔切割而成,金字塔的顶点位于我们眼睛的中心,其高度与我们的视线平行(请记住,为了看到某些东西,我们必须沿着连接到该对象的线)。我们将前面提到的这种切割或切片称为图像平面(您可以将此图像平面视为画家使用的画布)。图像平面是一个计算机图形概念,我们将使用它作为二维表面来投影我们的三维场景。尽管看起来很明显,但我们刚刚描述的是用于在多种不同设备上创建图像的最基本概念之一。例如,摄影中的等价物是胶片的表面(或者如前所述,画家使用的画布)。
Perspective Projection
假设我们想在空白画布上绘制一个立方体。 描述投影过程的最简单方法是从三维立方体的每个角到眼睛画线开始。 为了在画布上绘制对象的形状,我们在每条线与图像平面的表面相交处标记一个点。 例如,假设 c0 是立方体的一个角,并且它连接到其他三个点:c1、c2 和 c3。 将这四个点投影到画布上后,我们得到c0'、c1'、c2'和c3'。 如果 c0-c1 定义了一条边,那么我们画一条从 c0' 到 c1' 的线。 如果 c0-c2 定义了一条边,那么我们画一条从 c0' 到 c2' 的线。
如果我们对立方体的剩余边重复这个操作,我们将在画布上得到立方体的二维表示。 然后我们使用透视投影创建了我们的第一个图像。 如果我们对场景中的每个对象不断重复这个过程,我们得到的是从特定有利位置出现的场景图像。 直到15世纪初,画家才开始了解透视投影的规则。
Light and Color
一旦我们知道在二维表面上在哪里绘制三维物体的轮廓,我们就可以添加颜色来完成图片。
快速总结一下我们刚刚学到的知识:我们可以通过两步过程从 3D 场景中创建图像。第一步包括将三维物体的形状投影到图像表面(或图像平面)上。这一步只需要从物体特征到眼睛的连接线。然后通过返回并在画布上绘制这些投影线与图像平面相交的位置来创建轮廓。您可能已经注意到,这是一个几何过程。第二步包括为图片的骨架添加颜色。
场景中物体的颜色和亮度主要是灯光与物体材质相互作用的结果。光由光子(电磁粒子)组成,换句话说,光子具有电分量和磁分量。它们携带能量并在直线传播时像声波一样振荡。光子由各种光源发射,最显着的例子是太阳。如果一组光子撞击一个物体,会发生三件事:它们可以被吸收、反射或透射。反射、吸收和传输的光子百分比因一种材料而异,通常决定了物体在场景中的显示方式。然而,所有材料都有一个共同的规则,即入射光子的总数总是与反射、吸收和透射光子的总和相同。换句话说,如果我们有 100 个光子照射物体表面上的一个点,60 个可能被吸收,40 个可能被反射。总数仍然是 100。在这种特殊情况下,我们永远不会统计 70 个吸收和 60 个反射,或 20 个吸收和 50 个反射,因为传输、吸收和反射的光子总数必须为 100。
在科学中,我们只区分两种类型的材料,称为导体的金属和电介质。电介质包括玻璃、塑料、木材、水等。这些材料具有电绝缘体的特性(纯水是电绝缘体)。请注意,介电材料可以是透明的,也可以是不透明的。下图中的玻璃球和塑料球都是介电材料。事实上,每种材料对某种电磁辐射都是透明的。例如,X 射线可以穿过身体。
物体也可以由复合材料或多层材料制成。例如,可以有一个不透明的物体(例如木头),上面有一层透明的清漆(这使它看起来既漫射又闪亮,就像下图中的彩色塑料球一样)。
现在让我们考虑不透明和漫射对象的情况。为简单起见,我们假设吸收过程是物体颜色的原因。白光由“红”、“蓝”和“绿”光子组成。如果白光照亮红色物体,吸收过程会滤除(或吸收)“绿色”和“蓝色”光子。因为物体不吸收“红色”光子,它们被反射。这就是这个物体出现红色的原因。现在,我们之所以能看到物体,是因为物体反射的一些“红色”光子向我们移动并撞击我们的眼睛。照明区域或物体上的每个点都向各个方向辐射(反射)光线。来自每个点的只有一条光线垂直照射眼睛,因此可以被看到。我们的眼睛由光感受器组成,可将光转换为神经信号。然后我们的大脑能够使用这些信号来解释不同的阴影和色调(我们不确定如何)。这是描述所涉及现象的一种非常简单的方法。颜色课程中对所有内容进行了更详细的解释(您可以在计算机图形的数学和物理部分找到。
就像透视投影的概念一样,人类理解光也需要一段时间。希腊人发展了一种视觉理论,即通过眼睛发出的光线看到物体。阿拉伯科学家 Ibn al-Haytham (c. 965-1039) 是第一个解释我们之所以能看到物体是因为太阳光线的人;直线运动的微小粒子流从物体反射到我们的眼睛中,形成图像(图 3)。现在让我们看看我们如何用计算机模拟自然!