背面剔除
背面剔除确保只有面向摄像机的三角形才会被渲染。当启用背面剔除时,所有背向我们的三角形都不可见。三角形的正面朝向有两种方法来定义。第一种方法是三角形的顶点指定成逆时针方向。第二种方法是用面的法线向量指向的方向来定义。
面法线向量的计算参见列表3-13。数组V表示定义三角形的三个顶点。变量N是计算结果法向向量。
列表 3.13:面法线的计算
// Calculate the vector from the second point back to the first point.
V1.x = V[0].x − V[1].x
V1.y = V[0].y − V[1].y
// Calculate the vector from the third point back to the second point.
V2.x = V[1].x − V[2].x
V2.y = V[1].y − V[2].y
V2.z = V[1].z − V[2].z
// Calculate the magnitude of each vector.
mag1 = sqrt( V1.x * V1.x + V1.y * V1.y + V1.z * V1.z )
mag2 = sqrt( V2.x * V2.x + V2.y * V2.y + V2.z * V2.z )
// Normalize both vectors.
V1.x /= mag1
V1.y /= mag1
V1.z /= mag1
V2.x /= mag1
V2.y /= mag1
V2.z /= mag1
// Compute the cross product of the two vectors which is the normal of the vectors.
N.x = V1.y * V2.z − V1.z * V2.y
N.y = V1.Z * V2.y − V1.x * V2.z
N.z = V1.x * V2.y − V1.y * V2.x
只有当我们编程创建3D对象才会需要计算面的法线向量。建模软件(译注:例如3DMax和Maya等等建模软件)通常在存储的数据格式中包含了面的法线信息。法线向量不仅仅用于确定面的光照特征;当知道面的法线所指的方向时,我们就可以计算出光打大面上的入射角。
我们已经建立了背面剔除的规则,并且知道怎么判定了。因为背面剔除是默认的,为什么我们需要关掉它?通过对某些对象关掉背面剔除,我们可以使一个2D对象两边可见。一个使用了此技术的例子是赛跑终点线上面飘着的彩带(checkered banner)。既然此彩带的两边看起来一摸一样,我们没有理由把同样的一些三角形作为双重用途,使两边看起来一样。关闭背面剔除的代码如下:
Device.SetRenderState(RS.CullMode, Cull.None);
我们必须确保在渲染了那样的对象后把剔除状态还原到之前的值。对任何其他的渲染状态也需要这样做。忘记还原渲染状态的话,屏幕上可能会出现一些奇怪的东西(Forgetting to restore rendering states is a sure recipe for strange things happening on the screen)。