一、绘制流水线简介
场景(scene)是物体或模型的集合。任何物体都可以用三角形网格(triangle mesh)逼近表示。三角形网格是构建物体模型的基本单元。
摄像机指定了场景对观察者的可见部分,即我们将依据哪部分3D场景来创建2D图像。在世界坐标系中,摄像机有一定的位置和方向,定义了可见的空间体积(volume of space)。下图展示了一个虚拟摄像机的模型:
用几何学中的术语讲,上述的空间体积是一个平截头体(frustum)。在3D图形学中也可以称为视域体或视截体。采用视域体的主要原因是显示屏为矩形。那些位于视域体之外的物体是不可见的,在进一步处理时就应将其丢弃。丢弃这类数据的运算过程称为裁剪(clipping)。
投影窗口(projection window)是一个2D区域,位于视域体中的3D几何体通过投影映射到该区域中,这样便创建了3D场景的2D表示。很重要的一点是,矩形投影窗口在X和Y方向上的坐标范围是[-1,1]。
一旦建立了3D场景的几何描述,并设置好摄像机,我们下面的任务就是在显示器中建立该场景的2D表示。为实现这一目标所必需实施的一系列运算统称为绘制流水线(rendering pipeline),即
绘制流水线的功能是:在给定3D场景和指定观察方向的虚拟摄像机(virtual camera)的几何描述时,创建一副2D图像。
下图为绘制流水线的大致流程:
二、绘制流水线详细介绍
一、局部坐标系
局部坐标系(local space)或建模坐标系(modeling space),是用于定义构成物体的三角形单元列表的坐标系。采用局部坐标系的优势体现在它可以简化建模过程,局部坐标系允许我们构建模型时无需考虑位置、大小或相对于其他物体的朝向。下图是一个在自身局部坐标系中构建的茶壶:
二、世界坐标系
构建各种物体模型时,每个模型都位于其自身的局部坐标系中。我们还需要将这些物体组织在一起构成世界坐标系(全局坐标系)中的场景。位于局部坐标系中的物体通过一个称为世界变换(world transform)的运算过程变换到世界坐标系(world space)中,该变换通常包括平移(translation)、旋转(rotation)以及缩放(scaling)运算,分别用于设定该物体在世界坐标系中的位置、方向以及模型的大小。
世界变换用一个矩阵表示,并有Direct3D通过IDirect3DDevice::SetTransform方法来加以应用,该方法的声明如下:
IDirect3DDevice::SetTransform(
D3DTRANSFORMSTATETYPE State,
const D3DMATRIX* pMatrix);
第一个参数表示变换的类型:
进行世界变换时,取值D3DTS_WORLDÿ