Unity法线翻转(flip normal)

直接上干货

        Vector3[] normals = line.GetComponent().mesh.normals;
        for (int i = 0; i < normals.Length; i++) {
            normals[i] = -normals[i];
        }
        line.GetComponent().mesh.normals = normals;

        int[] triangles = line.GetComponent().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().mesh.triangles = triangles;

刚开始想到做法线翻转,只想到了直接把法线取负值,就是第一段代码

        Vector3[] normals = line.GetComponent().mesh.normals;
        for (int i = 0; i < normals.Length; i++) {
            normals[i] = -normals[i];
        }
        line.GetComponent().mesh.normals = normals;

结果是这样子:

Unity法线翻转(flip normal)_第1张图片

就是一个没有任何光线信息的样子(纯黑

然后呢,我就一直百度,以求找到解决办法,百度了一个晚上,都是说,“为什么不到3dmax/MAYA中翻转法线呢”,你大爷的!

然后转战Google,5分钟后解决问题= =

        int[] triangles = line.GetComponent().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().mesh.triangles = triangles;

加上了第二段代码之后,是这样子的:

Unity法线翻转(flip normal)_第2张图片

(是的,我做的是卡通渲染的描边,没使用shader)

Mesh.vertices中,保存的是图形的顶点信息。
Mesh.triangles中,保存的是对应于Mesh.vertices的顶点的索引。就是一个三角形在渲染中的三个顶点的顺序,所以Mesh.triangles的长度应该是3的倍数(Mesh.triangles的类型为int[])
那为什么要交换第一点跟第三点的位置呢?


Unity法线翻转(flip normal)_第3张图片

假如现在一个三角形是由P0、P1、P2,三个点组成的一个三角形。
那么,他的绘制的顺序应该是这样子的:

Unity法线翻转(flip normal)_第4张图片

呈现一个逆时针的样子。图形学中(前几天看蓝宝书看到的,忘了是OpenGL中的还是说图形学中都是这样,请指正。Ps. 应该是逆时针吧)将拥有逆时针环绕的多边形为正面。
即上面这个三角形为正面
若我们从屏幕后面那个方向看这个三角形的话,那你看到的是他的背面。
当我们交换三角形的第一点跟第三点后,他的渲染顺序将变成这样子:

Unity法线翻转(flip normal)_第5张图片

变成了从P2到P1再到P0的这么一个顺序。即这个三角形现在是一个顺时针环绕,我们看到的这个面,是他的背面。
在Unity中,默认的渲染是不会渲染背面的。
这样子就会出现刚才的这个效果

Unity法线翻转(flip normal)_第6张图片

这是本人写的第一个文章,有什么不足之处,请指正。
写本文的目的在于,苦苦寻找解决解决方法的您不会像我一样,找了一晚上的百度,啥都没找到。(Ps.这样应该能百度得到吧

你可能感兴趣的:(Unity法线翻转(flip normal))