人脸和顶点法向量 (Direct3D 9)

网格中的每个人脸都有一个垂直单位法向量,如下图所示。 矢量方向取决于顶点的定义顺序和坐标系统是左手坐标还是右手坐标。 面法线指离面的前端。 在 Direct3D 中,仅正面可见。 正面是指在其中按顺时针顺序定义顶点的面。

正面的法向量的插图

任何非正面的面都属于背面。 Direct3D 并不总是呈现背面人脸;因此,后脸据说被剔除。 如果需要,你可以更改剔除模式以渲染背面。 有关详细信息 ,请参阅 Culling State (Direct3D 9)

Direct3D 使用顶点单位法线产生高氏着色、照明和纹理效果。 下图显示了示例法线。

顶点法线图示

对多边形应用高氏阴影着色时,Direct3D 使用顶点法线计算光源和表面之间的角度。 它计算顶点的颜色和强度值,并为所有基元表面的每个点插入顶点。 Direct3D 采用此角度计算光线强度值。 角度越大,表面上发亮的光越少。

如果要创建平面对象,请将顶点法线设置为与表面垂直的点,如下图所示。

由两个带有顶点法线的三角形组成的平面图示

但是,更可能的是,对象由三角形条带组成,三角形不是共面的。 在三角形带中为所有三角形实现平滑着色的一个简单方法是,首先计算关联了矢量的每个多边形面的表面法向矢量。 可将顶点法线设置为与每个表面法线等角。 但是,对于复杂的基元来说,此方法可能不是很高效。

下图对此方法进行了说明,该图显示了从侧边上方看到的两个表面-S1 和 S2。 S1 和 S2 的法向矢量显示为蓝色。 顶点法向矢量显示为红色。 顶点法向矢量与 S1 表面法线的角与顶点法线和 S2 表面法线的角相同。 当照亮这两个表面并使用高氏着色进行着色时,两者之间形成平滑着色的平滑圆边。

两个图面 (s1 和 s2) 及其法向量和顶点法向量的关系图

如果顶点法线和与之关联的一个表面斜交,则会导致此表面上的点的光线强度增加或降低,具体取决于其与光源形成的角。 下图显示了一个示例。 同样,这些表面是边缘可见的。 顶点法线与 S1 斜交时与光源之间的角要小于其与两个表面法线形成的角相同时与光源之间的角。

 (s1 和 s2) 两个表面的示意图,其中顶点法向量偏向了一张人脸

你可以使用高氏着色在 3D 场景中显示带锐边的对象。 为此,请在需要锐边的人脸的任何交集处复制顶点法向量,如下图所示。

尖锐边缘处重复顶点法向量的插图

如果你使用 DrawPrimitive 方法渲染你的场景,则需将带锐边的对象定义为三角形列表,而非三角形带。 将对象定义为三角形带时,Direct3D 会将其视为一个由多个三角形面组成的多边形。 同时为多边形的各个面和邻近面之间应用高氏着色。 最终将产生一个从面到面平滑着色的对象。 因为三角形列表是一个由一系列不相交的三角形面组成的多边形,Direct3D 将跨多边形的各个面应用高氏着色。 但是,它不会从面到面进行应用。 如果一个三角形列表中的两个或多个三角形邻近,则它们之间会形成一个锐边。

另一种做法是在渲染带锐边的对象时更改为平面着色。 这是借助计算的最有效方法,但它可能会导致场景中的对象的渲染逼真度低于应用髙氏着色的对象。

坐标系和几何图形