直接上干貨
Vector3[] normals = line.GetComponent<MeshFilter>().mesh.normals;
for (int i = 0; i < normals.Length; i++) {
normals[i] = -normals[i];
}
line.GetComponent<MeshFilter>().mesh.normals = normals;
int[] triangles = line.GetComponent<MeshFilter>().mesh.triangles;
for (int i = 0; i < triangles.Length; i += 3) {
int t = triangles[i];
triangles[i] = triangles[i + 2];
triangles[i + 2] = t;
}
line.GetComponent<MeshFilter>().mesh.triangles = triangles;
剛開始想到做法線翻轉,只想到了直接把法線取負值,就是第一段代碼
Vector3[] normals = line.GetComponent<MeshFilter>().mesh.normals;
for (int i = 0; i < normals.Length; i++) {
normals[i] = -normals[i];
}
line.GetComponent<MeshFilter>().mesh.normals = normals;
結果是這樣子:
就是一個沒有任何光線信息的樣子(純黑)
然后呢,我就一直百度,以求找到解決辦法,百度了一個晚上,都是說,“為什么不到3dmax/MAYA中翻轉法線呢”,你大爺?shù)模?/del>
然后轉戰(zhàn)Google,5分鐘后解決問題= =
int[] triangles = line.GetComponent<MeshFilter>().mesh.triangles;
for (int i = 0; i < triangles.Length; i += 3) {
int t = triangles[i];
triangles[i] = triangles[i + 2];
triangles[i + 2] = t;
}
line.GetComponent<MeshFilter>().mesh.triangles = triangles;
加上了第二段代碼之后,是這樣子的:
(是的,我做的是卡通渲染的描邊,沒使用shader)
Mesh.vertices
中,保存的是圖形的頂點信息。
Mesh.triangles
中,保存的是對應于Mesh.vertices
的頂點的索引。就是一個三角形在渲染中的三個頂點的順序,所以Mesh.triangles
的長度應該是3的倍數(shù)(Mesh.triangles
的類型為int[])
那為什么要交換第一點跟第三點的位置呢?
假如現(xiàn)在一個三角形是由P0、P1、P2,三個點組成的一個三角形。
那么,他的繪制的順序應該是這樣子的:
呈現(xiàn)一個逆時針的樣子。圖形學中(前幾天看藍寶書看到的,忘了是OpenGL中的還是說圖形學中都是這樣,請指正。Ps. 應該是逆時針吧)將擁有逆時針環(huán)繞的多邊形為正面。
即上面這個三角形為正面
若我們從屏幕后面那個方向看這個三角形的話,那你看到的是他的背面。
當我們交換三角形的第一點跟第三點后,他的渲染順序將變成這樣子:
變成了從P2到P1再到P0的這么一個順序。即這個三角形現(xiàn)在是一個順時針環(huán)繞,我們看到的這個面,是他的背面。
在Unity中,默認的渲染是不會渲染背面的。
這樣子就會出現(xiàn)剛才的這個效果
這是本人寫的第一個文章,有什么不足之處,請指正。
寫本文的目的在于,苦苦尋找解決解決方法的您不會像我一樣,找了一晚上的百度,啥都沒找到。(Ps.這樣應該能百度得到吧)