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

网格中的每个人脸都有垂直单位法向量,如下图所示。 矢量的方向取决于顶点的定义顺序以及坐标系是右手还是左撇子。 人脸正常点远离人脸的前侧。 在 Direct3D 中,只有人脸的正面可见。 正面是按顺时针顺序定义顶点的顶点。

前脸图示

任何不是前脸的人脸都是后脸。 Direct3D 并不总是呈现后脸;因此,据说后脸被扑杀。 如果需要,可以更改剔除模式以呈现后脸。 有关详细信息,请参阅 剔除状态(Direct3D 9)

Direct3D 将顶点单位法线用于 Gouraud 底纹、照明和纹理效果。 下图显示了示例法例。

顶点法线图示

将 Gouraud 底纹应用于多边形时,Direct3D 使用顶点法线来计算光源和表面之间的角度。 它计算顶点的颜色和强度值,并为所有基元图面上的每个点内插它们。 Direct3D 使用角度计算光强度值。 角度越大,表面的光就越亮。

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

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

但是,你的对象更有可能由三角形条带组成,而三角形不是共同平面。 在条带中的所有三角形之间实现平滑底纹的一种简单方法是首先计算顶点与之关联的每个多边形面的表面法向量。 可以将顶点法线设置为与每个表面法线相等的角度。 但是,此方法对于复杂基元可能不够高效。

下图演示了此方法,其中显示了两个图面:S1 和 S2 从上面看到边缘。 S1 和 S2 的正常向量以蓝色显示。 顶点法向量以红色显示。 顶点法向量与 S1 表面法线之间的角度与顶点法线与 S2 表面法线之间的角度相同。 当这两个表面通过 Gouraud 着色点亮和着色时,结果是它们之间的平滑着色、平滑圆角。

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

如果顶点法向与之关联的人脸之一倾斜,则它会导致该表面的点增加或减少光强度,具体取决于它与光源产生的角度。 下图显示了一个示例。 同样,这些图面在边缘可见。 顶点法向 S1 倾斜,导致其与光源的角度比顶点法线与表面法线的角相等。

具有顶点法向量(s1 和 s2)的两个表面(s1 和 s2)的 图示,该矢量倾向于一张人脸

可以使用 Gouraud 底纹在具有尖锐边缘的 3D 场景中显示某些对象。 为此,请在需要尖锐边缘的任何交集处复制顶点法向量,如下图所示。

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

如果使用 DrawPrimitive 方法呈现场景,请将具有尖锐边缘的对象定义为三角形列表,而不是三角形条带。 将对象定义为三角形条形时,Direct3D 将其视为由多个三角人脸组成的单个多边形。 Gouraud 底纹同时应用于多边形的每个面和相邻人脸之间。 结果是一个对象,该对象从面到面平滑着色。 由于三角形列表是由一系列不相交的三角人脸组成的多边形,Direct3D 将应用 Gouraud 底纹覆盖多边形的每个面。 但是,它不会从人脸到脸应用。 如果三角形列表的两个或多个三角形相邻,它们之间似乎有尖锐的边缘。

另一种替代方法是在呈现具有尖锐边缘的对象时更改为平面底纹。 这是计算上最有效的方法,但它可能会导致场景中的对象不如 Gouraud 着色的对象真实呈现。

坐标系和几何图形