介绍
光线追踪简介:创建 3D 图像的简单方法课程为您快速介绍了渲染和计算机图形学中的一些重要概念,以及小型光线追踪器的源代码(我们用它渲染了一个场景,其中包含 几个球体)。光线追踪是一种非常流行的渲染 3D 场景的技术(主要是因为它很容易实现,而且也是一种更自然的思考光在空间中传播方式的方式,如上一 课中快速解释的那样),但也存在其他方法。在本课程中,我们将了解渲染的含义、渲染 3D 场景图像需要解决哪些类型的问题,并快速回顾专门为解决这些问题而开发的最重要的技术;我们的研究将集中在光线追踪和光栅化方法上,这两种流行的算法用于解决可见性问题(找出构成场景的哪些对象通过相机可见)。我们还将研究着色,这是定义对象的外观及其亮度的步骤。
一切都从计算机(和计算机屏幕)开始
计算机图形世界的旅程从计算机开始。通过陈述对您来说似乎显而易见的事情来开始本课程可能听起来很奇怪,但它是如此明显,以至于我们确实认为这是理所当然的,并且在使用计算机制作图像时从未考虑过它意味着什么。除了电脑之外,我们更应该关心的是如何用电脑屏幕显示图像。计算机和计算机屏幕都有一些重要的共同点。他们使用离散结构,这与我们周围的世界相反,我们周围的世界是由连续结构组成的(至少在宏观层面)。这些离散的结构是计算机的位和屏幕的像素。让我们举一个简单的例子。在现实世界中找一条线。它是不可分割的。但是,要将这条线表示在计算机屏幕的表面上,需要将其“切割”或“分解”成称为像素的小块。这个想法如图 1 所示。
图1:在现实世界中,一切都是“连续的”。但在计算机世界中,图像是由离散的块(即像素)组成的。
图2:在计算机表面上表示一个对象的过程可以看作是在对象的表面上布置了一个网格。与对象重叠的网格的每个像素都填充有底层对象的颜色。但是,当对象仅部分重叠像素表面时会发生什么?我们应该用哪种颜色填充像素?
在计算中,实际转换任何连续对象(数学中的连续函数,线程的数字图像)的过程称为离散化。 但是,计算机图形学中的大多数问题(如果不是全部)都来自于计算机所基于的技术的本质:0、1 和像素。
您可能仍然想“谁在乎呢?”。对于在计算机上观看图像的人来说,这可能确实不是很重要。但如果您必须创建此图像,这可能是您应该关心的事情。想想这个。假设我们需要在计算机屏幕的表面上表示一个球体。让我们看一个球体并在其顶部应用网格。网格代表屏幕的像素(图 2)。球体与某些像素完全重叠。一些像素也是空的。然而,某些像素存在问题。球体仅部分重叠它们。在这种特殊情况下,我们应该用什么来填充像素:背景的颜色还是物体的颜色?
直觉上你可能会想“如果背景占据像素区域的 35%,物体占据 75%,那么让我们为像素分配一个颜色,该颜色由背景颜色 35% 和物体颜色 75% 组成”。这是很好的推理,但事实上,你只是把问题转移了。无论如何,你首先如何计算这些面积?该问题的一种可能的解决方案是将像素细分为子像素并计算背景重叠的子像素的数量并假设所有子像素都与对象重叠。可以通过将与背景重叠的子像素的数量除以子像素的总数来计算被背景覆盖的面积。
图 4:为了近似与形状和背景重叠的像素的颜色,可以将表面细分为更小的单元。通过计算与形状重叠的单元格数量乘以形状颜色加上与背景重叠的单元格数量乘以背景颜色,再除以单元格总数,可以找到像素的颜色。然而,无论单元有多小,其中一些单元总是会与形状和背景重叠。
然而,无论子像素有多小,总会有一些子像素与背景和物体重叠。虽然您可能会以这种方式获得对象和背景覆盖范围的相当好的近似值(子像素越小近似值越好),但它始终只是一个近似值。计算机只能近似。可以使用不同的技术来计算这个近似值(将像素细分为子像素只是其中之一),但是从这个例子中我们需要记住的是,我们必须在计算机科学中解决很多问题。计算机图形学源于必须“模拟”由连续结构和离散结构组成的世界。
解决这个问题的另一种方法显然也是提高图像的分辨率。换句话说,使用更多的像素来表示相同的形状(球体)。然而,即便如此,我们仍然受到屏幕分辨率的限制。
使用二维像素阵列来表示或显示图像的图像和屏幕分别称为光栅图形和光栅显示。术语“栅格”更一般地定义显示空间上的 x 和 y 坐标网格。我们将在透视投影章节中了解有关光栅化的更多信息。
正如所建议的,用计算机表示物体图像的主要问题是物体形状需要被“分解”成离散的表面,即像素。计算机通常只能处理离散数据,但更重要的是,在计算机内存中定义数字的定义受到用于编码这些数字的位数的限制。例如,您可以在屏幕上显示的颜色数量受到用于编码 RGB 值的位数的限制。在计算机的早期,使用单个位对屏幕上像素的“亮度”进行编码。当该位的值为 0 时,该像素为黑色;当该位的值为 1 时,该像素为白色。第一代使用彩色显示器的计算机,使用单个字节或 8 位对颜色进行编码。使用 8 位(红色通道 3 位,绿色通道 3 位,蓝色通道 2 位),您只能定义 256 种不同的颜色 (2^3 * 2^3 * 2^2)。当您想要显示的颜色不是您可以使用的颜色时,会发生什么情况?解决方案是从调色板中找到与您理想想要显示的颜色最接近的可能匹配颜色,然后显示该匹配颜色。这个过程称为颜色量化。
图 5:我们的眼睛可以感知非常小的颜色变化。当使用太少的位来编码颜色时,就会出现条带(右)。
颜色量化的问题在于,当我们没有足够的颜色来准确采样连续的色调渐变时,连续渐变就会显示为一系列离散的色阶或色带。这种效果称为条带(也称为术语海报化或假轮廓)。
现在没有必要太关心条带(最常见的图像格式使用 32 位来编码颜色。使用 32 位,您可以显示大约 1600 万种不同的颜色),但是请记住,从根本上来说,我们可能需要在计算机内存中表示的其他连续函数必须分解为一系列离散或单个量子值,其精度受到用于编码这些值的位数的限制。
图 6:数字图像无法准确捕捉小于像素的物体形状。
最后,必须将连续函数分解为离散值可能会导致信号处理和计算机图形学中所谓的混叠。数字图像的主要问题是您可以捕获的细节量取决于图像分辨率。这样做的主要问题是图像无法准确捕捉小细节(粗略地说,小于像素的细节)。例如,想象一下,您想要用数码相机拍摄一个距离很远的茶壶,该物体小于图像中的一个像素(图 6)。像素是离散结构,因此我们只能用恒定的颜色填充它。如果在这个例子中,我们用茶壶的颜色填充它,你的茶壶只会在图像中显示为一个点:你未能捕捉到茶壶的颜色。。实际上,锯齿比这复杂得多,但您应该了解这个术语,并且应该记住,根据数字图像的本质(因为像素是离散元素),给定分辨率的图像只能准确地表示给定尺寸的物体。我们将在“锯齿”课程中解释对象大小和图像分辨率之间的关系(您可以在计算机图形学的数学和物理部分找到该课程)。