3D 坐标系
3D 图形渲染管线
计算机图形创建模型通常被称为光栅化模型,它与光线追踪等技术截然不同。物体的生成始于一堆三角形,这些三角形通常由 3D 艺术家使用诸如 3ds Max、Maya 或 Blender 之类的软件定义。每一帧,这些三角形都会经历各种三维变换,以便将它们放置在空间中的所需位置,并投影到二维屏幕表面上。然后,在光栅化过程中,这些三角形会被转换成一系列像素。
在这个阶段,会计算出各个像素的最终颜色。在这门课中,我们将编写两种着色器代码:顶点着色器,用于处理这些三维顶点;以及像素着色器,也称为片段着色器,用于决定像素的最终颜色。
顶点着色器的特点是,单独处理每个顶点,并且不会创建新顶点。还有其他类型的着色器,称为几何着色器,可以创建新顶点。此外还有计算着色器,这是一种更通用的着色器,可以被视为更通用的 GPU 编程。
3D 坐标系
- Z-up, LHS: Unreal
- Nearly everything still uses Y-up for screen coordinates!
顶点坐标
至少目前,3D 游戏中使用的模型由三角形构成,三角形上的每个顶点都有一个 X、Y 和 Z 坐标来定义这三个顶点。通常,每个顶点还有一个关联的单位法线,这是 3D 美术师从他们的 3D 建模软件导出模型时产生的。
因此,美术师通常会创建一个高分辨率的平滑曲面参数化模型,然后,运行导出程序会将模型分割成不同分辨率的多个面,这些面可能用于不同的用途。例如,一个拥有大量顶点的高分辨率模型可能用于生成预渲染的过场动画,而一个低分辨率模型则用于敏捷的游戏玩法。当模型被分割成具有不同顶点的三角形时,程序会计算一些法线矢量信息,试图了解这些三角形所代表的表面曲率。这对于计算逼真的光照效果至关重要。如果没有这些信息,模型就会呈现出所谓的"平面着色"效果,可以清晰地看到构成物体的多边形。但如果在光照计算中使用法线信息,结果会更加平滑。
一些 3D 模型可能还包含与不同顶点关联的颜色信息,可以在渲染物体时对这些颜色进行插值。但如今,顶点颜色实际上很少使用,因为通常情况下,这些颜色信息会嵌入到某种二维纹理中,从而提供视觉效果。在 2D 纹理中,有时你会看到颜色槽被使用,但它也可能用于渲染过程中的其他信息,而不是典型的颜色信息。
3D object
通常情况下,你会看到一个顶点列表,例如 X、Y、Z、4、1、2、3、4、5、6、7,然后是一个三角形列表,这些三角形是顶点列表的索引。这样可以节省大量内存。列表的顺序很重要。
一种避免不必要计算的常用技巧是胆碱(Choline),它本质上只渲染面向观察者的三角形,而忽略背对观察者的三角形。当观察者靠近时,可以使用面的法线。面法线与顶点法线不同在于,不同顶点有不同的法线,而对于特定的三角形,它只有一个法线。
我们嵌入这类信息的方式是选择某种顺序来列出顶点,比如左手坐标系,在本例中是从 v1, v3 到 v2。我们想象法线是你的拇指,然后你的手指围绕着顶点顺序弯曲,所以我们有 v1, v3, v2。
3D 渲染管线
计算机图形学中有很多计算可以以不同的顺序进行。图形管线中每个阶段的具体计算顺序可能不同,这取决于你选择的顺序,尤其是在光照处理等环节。但有很多情况下,你可以以不同的方式重新排列这些计算。如何重新排列通常取决于你使用的硬件。以前 GPU 的功能有限,大部分计算都必须在 CPU 上完成,那时安排计算的方式与现在截然不同。
现在,你会将大量原始数据发送到 GPU,并期望它稍后进行处理。我们之前讨论过使用不同的 3D 坐标系来表示 3D 物体。实际上,在 3D 图形制作中会用到几种坐标系。模型坐标系是美术人员使用的坐标系,他们在 Blender、Maya 或其他 3D 建模软件中就是使用这个坐标系。
我们需要将这些坐标转换到世界坐标系,也就是关卡编辑器中的视图空间。当你在关卡的不同位置放置同一个物体,比如敌方坦克的模型时,你看到的就是这个坐标系。世界坐标系转换的作用就是将美术人员使用的坐标系转换到关卡设计师使用的坐标系。
视图转换的作用则是将关卡设计师使用的世界坐标系转换到摄像机实际使用的坐标系。这指的是玩家的视角,例如第一人称游戏。
投影转换是视图转换的最后步骤之一。从摄像机拍摄到实际将物体投影到二维屏幕表面,我们将使用矩阵代数的语言来描述这个过程,因为它便于组合各种变换。