查看: 1654|回复: 0
收起左侧

[开发经验] Unity 法线翻转

[复制链接]

[开发经验] Unity 法线翻转[复制链接]

luckyStar 发表于 2018-1-5 13:09:50 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式 回复:  0 浏览:  1654
  直接上干货
        
[C#] 纯文本查看 复制代码
Vector3[] normals = line.GetComponent<MeshFilter>().mesh.normals;
        for (int i = 0; i < normals.Length; i++) {
            normals = -normals;
        }
        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;
            triangles = triangles[i + 2];
            triangles[i + 2] = t;
        }
        line.GetComponent<MeshFilter>().mesh.triangles = triangles;

  刚开始想到做法线翻转,只想到了直接把法线取负值,就是第一段代码
[C#] 纯文本查看 复制代码
Vector3[] normals = line.GetComponent<MeshFilter>().mesh.normals;
        for (int i = 0; i < normals.Length; i++) {
            normals = -normals;
        }
        line.GetComponent<MeshFilter>().mesh.normals = normals;

  结果是这样子:

Unity 法线翻转

Unity 法线翻转
就是一个没有任何光线信息的样子(纯黑)
  然后呢,我就一直百度,以求找到解决办法,百度了一个晚上,都是说,“为什么不到3dmax/MAYA中翻转法线呢”,你大爷的!
  然后转战Google,5分钟后解决问题= =
[C#] 纯文本查看 复制代码
 int[] triangles = line.GetComponent<MeshFilter>().mesh.triangles;
        for (int i = 0; i < triangles.Length; i += 3) {
            int t = triangles;
            triangles = triangles[i + 2];
            triangles[i + 2] = t;
        }
        line.GetComponent<MeshFilter>().mesh.triangles = triangles;
加上了第二段代码之后,是这样子的:

Unity 法线翻转

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

Unity 法线翻转

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

Unity 法线翻转

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

Unity 法线翻转

Unity 法线翻转
变成了从P2到P1再到P0的这么一个顺序。即这个三角形现在是一个顺时针环绕,我们看到的这个面,是他的背面。
在Unity中,默认的渲染是不会渲染背面的。
这样子就会出现刚才的这个效果
这是本人写的第一个文章,有什么不足之处,请指正。
写本文的目的在于,苦苦寻找解决解决方法的您不会像我一样,找了一晚上的百度,啥都没找到。(Ps.这样应该能百度得到吧)
                        
原文链接 :http://blog.csdn.net/ch080239/article/details/52099544
+1
1646°C
沙发哦 ^ ^ 马上
因分享而快乐,学习以自强!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 沪ICP备14023207号-9 )|网站地图

© 2001-2013 Comsenz Inc.  Powered by Discuz! X3.4

1
QQ