直接上干货
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中翻转法线呢”,你大爷的!
然后转战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的倍数(Mesh.triangles
的类型为int[])
那为什么要交换第一点跟第三点的位置呢?
假如现在一个三角形是由P0、P1、P2,三个点组成的一个三角形。
那么,他的绘制的顺序应该是这样子的:
呈现一个逆时针的样子。图形学中(前几天看蓝宝书看到的,忘了是OpenGL中的还是说图形学中都是这样,请指正。Ps. 应该是逆时针吧)将拥有逆时针环绕的多边形为正面。
即上面这个三角形为正面
若我们从屏幕后面那个方向看这个三角形的话,那你看到的是他的背面。
当我们交换三角形的第一点跟第三点后,他的渲染顺序将变成这样子:
变成了从P2到P1再到P0的这么一个顺序。即这个三角形现在是一个顺时针环绕,我们看到的这个面,是他的背面。
在Unity中,默认的渲染是不会渲染背面的。
这样子就会出现刚才的这个效果
这是本人写的第一个文章,有什么不足之处,请指正。
写本文的目的在于,苦苦寻找解决解决方法的您不会像我一样,找了一晚上的百度,啥都没找到。(Ps.这样应该能百度得到吧)