共用方式為


曲面和頂點法向量

網格中的每一曲面都有垂直單位法向量。 向量的方向會端視頂點的定義順序,以及採用左手或右手座標系統而定。

正面的垂直單位法向量

網格中的每一曲面都有垂直單位法向量。 向量的方向會端視頂點的定義順序,以及採用左手或右手座標系統而定。 曲面法線會從曲面的正面向外指出。 在 Direct3D 中只能看到曲面的正面。 正面為頂點透過順時針順序進行定義之處。

下圖顯示了正面的法向量。

a normal vector for a front face

剔除背面

背面為任何曲面中不屬於正面的部分。 Direct3D 不一定會轉譯曲面;因此背面會遭到剔除。 背面剔除意味著不會轉譯背面。 如果想要,您可以變更剔除模式,以轉譯背面。 如需詳細資訊,請參閱剔除狀態

頂點單位法線

Direct3D 會使用頂點單位法線來執行 Gouraud 著色、照明和紋理效果。

下圖顯示頂點法線:

vertex normals

將 Gouraud 著色套用至多邊形時,Direct3D 會使用頂點法線來計算光源和表面之間的角度。 它會計算頂點的色彩和強度值,並針對所有原始物件表面的每個點來進行插補。 Direct3D 會使用角度來計算光線強度值。 角度越大,照亮表面的光線就越少。

平面

如果要建立平面物件,請設定頂點法線,以垂直指向表面。

下圖顯示由兩個三角形組成且隨附頂點法線的平面:

flat surface composed of two triangles with vertex normals

非平面物件上的平滑著色

您的物件可能會使用三角寬帶組成,而且三角形並未共面,因此並不屬於平面物件。 在寬帶的所有三角形上實現平滑著色的簡單方法之一,就是計算與頂點相關之每個多邊形曲面的表面法向量。 頂點法線可設定為讓每個表面法線採用相同的角度。 但對複雜的原始物件而言,這個方法可能缺乏效率。

這個方法會如下圖所示,當中顯示了從上方檢視兩個表面 S1 和 S2 的側面情況。 S1 和 S2 的法向量會顯示為藍色。 頂點法向量則顯示為紅色。 頂點法向量和 S1 表面法線所呈現的角度,會與頂點法線和 S2 表面法線之間的角度相同。 當這兩個表面使用 Gouraud 著色來照亮和著色時,就會產生介於兩者之間的平滑著色、平滑圓角邊緣。

下圖顯示了兩個表面 (S1 和 S2) 及其法向量和頂點法向量:

two surfaces (s1 and s2) and their normal vectors and vertex normal vector

如果頂點法線朝著其中一個相關的曲面傾斜,就會對該表面上的點造成光線強度方面的增減,而此一增減則取決於其與光源之間的角度。 下圖提供了一個範例。 這些表面是從側面加以檢視。 由於頂點法線朝著 S1 傾斜,導致其與光源的之間的角度,會比頂點法線與兩個表面法線保持相同角度時更小。

下圖顯示了兩個表面 (S1 和 S2),其頂點法向量則朝著其中一個曲面傾斜:

two surfaces (s1 and s2) with a vertex normal vector that leans toward one face

銳利邊緣

您可以使用 Gouraud 著色,在具有尖銳邊緣的 3D 場景中顯示部分物件。 若要進行這項操作,請複製位於需要尖銳邊緣之任何曲面交界的頂點法向量。

下圖顯示了在尖銳邊緣遭到複製的頂點法向量:

duplicated vertex normal vectors at sharp edges

如果您使用 DrawPrimitive 方法來轉譯場景,請將帶有尖銳邊緣的物件定義為三角形清單,而非三角形寬帶。 當您將物件定義為三角形寬帶時,Direct3D 會將其視為由多個三角曲面組成的單一多邊形。 Gouraud 著色會同時套用至多邊形的每個曲面,以及相鄰的曲面之間。

如此將會產生每個曲面皆平滑著色的物件。 由於三角形清單是由一系列不相交的三角形曲面所組成,Direct3D 會對多邊形的每個曲面套用 Gouraud 著色。 不過,該著色並不會套用至每個曲面。 如果三角形清單有兩個以上的三角形彼此相鄰,兩者之間就會顯示尖銳邊緣。

另一個替代方法,就是在轉譯帶有尖銳邊緣的物件時,變更為平面著色。 這是最具計算效率的方法,但由於物件已進行 Gouraud 著色,這可能會在場景中產生未以寫實方式轉譯的物件。

座標系統與幾何