您是否曾经想过计算机如何在2D屏幕上渲染3D对象/模型供我们查看?引擎盖下有大量的GPU和CPU密集型操作,它们正在非常努力地模仿3D模型的真实照明,材质和纹理。在本文中,让我们学习如何渲染3D对象的基础知识。
要了解3D渲染,您首先应该了解3D模型。计算机中表示的3D对象由顶点组成,这些顶点是3D空间中的任意点。至少需要3个顶点才能表示一张脸。好吧,为什么是3?你一定在想。考虑由4个顶点组成的面,最初,所有四个点都将位于同一参考平面上。但是,当您移动4个点之一时,所有点都不位于同一平面上。因此,选择一个三角形作为3D模型的基础。 3D文件不过是文件中存储的顶点列表,类似于图像文件格式,对于3D对象,存在各种文件格式,每种文件格式都有其特定的优势。
渲染是使用各种计算算法基于3D数据文件生成2D图像的方法。渲染过程实际上是根据分类的方法和技术来模拟3D模型的光照和几何形状。
- 扫描线渲染和栅格化
它是最基本的渲染类型,将3D对象的几何形状投影在2D平面上,不考虑奇特的光折射,散射和色彩空间。这种类型的渲染的一个很好的例子是旧的DOOM游戏 - 射线铸造
Ray Casting是该书中的另一种旧方法,它在Wolfenstein 3D中得到最广泛的使用,因为它具有简单而强大的算法,因此被广泛用于游戏开发中,这些游戏可以在计算机中以3MHz的速度渲染3D图形。 - 光线追踪
光线追踪通过复杂的算法模拟光和光学。它通过拍摄来自相机/查看源的光线进行渲染,并考虑光源的位置,以不同角度记录光线撞击不同材料的效果。与其他方法相比,它能够产生高度逼真的图像和渲染。由于对屏幕上的每个像素都模拟并计算了射线,因此渲染时间非常慢。这就是为什么制作VFX胶片的成本更高,并且需要很高的计算能力,这需要专门为渲染影片(渲染场)而制作的GPU。它可以刺激反射,折射,景深和许多其他逼真的光学成像技术。
基本光线跟踪算法
基本光线跟踪算法的工作方式与简单光线相同。假设光线从相机投射(虚拟)。它行进并撞击固体物体,并根据物体表面的材料和反射率以一定角度反射出去。物体的材质决定了光线撞击到物体表面时的行为。由于3D模型由微小的三角形组成,因此可以通过求解直线与平面的交点来解决射到三角形表面上的光线。如果对象的高度详细( high-poly ),则GPU必须执行更多的计算以进行渲染,类似地,如果模型的多边形/三角形较少(低多边形),则GPU会执行较少的计算。这就是为什么第一代图形块状而新一代图形平滑的原因。
可以清楚地看到,光线跟踪模仿了现实世界中的光学系统。上图显示了单条光线的行为,但实际上,将有数百万条来自相机的光线;不断地撞击和反射各种物体。一种简单的光线跟踪算法可以表示为…
for every pixel on the view-cone:
- shoot out a ray from the camera.
- find the first intersecting object to the ray.
- if it is a reflective material
- recursively shoot out rays from the reflected point based on the reflectivity and the light bounce limit.
- calculate the light intensity of each pixel.
这是用于光线跟踪的过于简化的算法,但实际上,有大量的后台工作来优化该过程。在此描述的射线基本上被实现为具有大小和方向的矢量。
射线追踪的未来
您可能已经听说过Nvidia的实时光线追踪(RTX)GPU。在RTX之前,由于它的计算量大且速度慢,因此无法进行实时光线跟踪。因此,RTX使用混合渲染技术。它融合了两全其美的优势:普通材料的渲染/光栅化速度更快,反射材料的光线跟踪效果更高。 GPU的速度和并行处理正在日益提高。光线追踪GPU所获得的真实性和清晰度也在不断提高。
参考:
- https://zh.wikipedia.org/wiki/Ray_tracing_(图形)