光线追踪浅谈

Date
Mar 21, 2021
Tag
MasterApplication

栅格化 Rasterization

物理世界不管如何复杂,人类去感知的时候,最后还是通过人眼获取信息传递到大脑。同样的,不管数字世界如何复杂,最后还是通过显示设备将信息传递给人。数字世界和物理世界需要通过媒介来传递信息。在现有的科技下,计算机通过显示设备将图像信息传递给人,而显示设备是由一个个像素点构成的。因此为了输出信息,我们需要将矢量图形转换成点阵图。
比如下面的PPM格式的图像,包含了2行3列6个像素:
P3 # "P3" means this is a RGB color image in ASCII 3 2 # "3 2" is the width and height of the image in pixels 255 # "255" is the maximum value for each color # The part below is image data: RGB triplets 255 0 0 # red 0 255 0 # green 0 0 255 # blue 255 255 0 # yellow 255 255 255 # white 0 0 0 # black
通过光栅化我们可以将矢量图形转化为由像素构成的点阵图。图片中包含的像素越多,人眼就能接收到越接近矢量图的信息,直至最后难以分辨。所以,3维的影像,最后都是转化成2维的投影projection,再通过栅格化Rasterization转化成点阵图raster image后输出。

坐标coordinate与向量vector

色彩信息

通过三原色来近似模拟颜色 (r, g, b)。

空间位置

, , )可以代表三维世界的一个点point,可以代表位移向量,可以代表直线。通过一个确定的点和向量可以构成线段。通过 可以构成任意的三维图像。通过点和矩阵的相乘,可以得到空间变换如位移旋转收缩扩张后的点。简而言之,通过对向量的运算操作,我们可以实现三维世界中对象的空间变换。

三维到二维的转换

受限于人类的观察方式,我们也需要做相应的模拟。即观察三维空间时,我们需要一个观察点,这个观察点需要一个point作为位置,一对正交的vector作为方向。在观察点和3D物体之间需要一个成像面film plan。通过三者的位置关系,三维物体投射到成像面上。成像面上的矢量图就是三维到二维的转换结果。
三维物体,观察点信息,成像面,这三个信息可以确定成像。由于观察者仅能看到成像面上的信息,与其把三维世界中所有物体都与观察点交互,不如考虑观察点和成像面的交互。既然成像面上的成像最终要栅格化,不如将矢量的成像面栅格化得到有限的点,观察点和成像点所构成的射线最终会打到物体或者打空,通过对射线的追踪,我们来定义这个点的颜色。用同样的方式对所有成像点都定义好颜色之后,所形成的图像即为成像面上的成像的栅格化的结果。

如何看到三维世界的球体

三维世界的物体可以用 来表示,比如 来表示圆心在原点的半径为r的球体。从观察点出发,经过每一个成像点所构成的射线,我们判断是否与这个球体相交。并通过相交的结果,相交位置的法线信息,我们可以根据想要达到的效果计算出成像点的值。没有打到球上的射线对应的成像点则赋予背景的颜色。所有的成像点在成像面上构成的图形就是三维世界的球体在成像面上矢量成像的栅格化点阵图。
从观察点到成像点的射线打到物体后,我们可以通过光线反射折射方程继续去追踪光线接下来的状态,并将光线状态叠加到一起来计算成像点的值。其中涉及到很多参数,我们可以通过改变各种参数来实现球体的不同材质。

虚化

实际上观察点并非一个点。对于人眼而言为眼球,对于相机镜头而言则为光圈,其实是一个观察面。观察面上的所有射线聚焦于同一点,这样的点又构成聚焦面。聚焦面上的成像是清晰的,而偏离聚焦面越远,所形成的画面就越虚化。虚化效果可以通过多条射线不同取值加权叠加后得到。