Unity Flat Shading实现低多边形(low-poly)效果


首先要确保模型是低模,如果模型精度较高只通过这样改变mesh的顶点三角索引效果就不明显

获取模型的mesh网格,非蒙皮模型通过获取MeshFilter组件得到Mesh,带有蒙皮的模型通过Skinned Mesh Renderer组件获取Mesh。

MeshFilter meshFilter = GetComponent<MeshFilter>();
Mesh mesh = meshFilter.mesh;

修改模型mesh顶点索引然后重新计算法线,使三角面上三个顶点的法线与三角面的法线平行,这样整个三角面光照效果相同(颜色相同),就有了Low Poly效果:

Vector3[] oldVerts = mesh.vertices;//保存当前Mesh顶点
        int[] triangles = mesh.triangles;//三角索引数组

        Vector3[] verts = new Vector3[triangles.Length];//用于保存新的顶点信息

        for (int i = 0; i < triangles.Length; i++)
        {
            verts[i] = oldVerts[triangles[i]];
            triangles[i] = i;
        }

        mesh.vertices = verts;//更新Mesh顶点
        mesh.triangles = triangles;//更新索引
        mesh.RecalculateBounds();//重新计算边界
        mesh.RecalculateNormals();//重新计算法线

将脚本赋予模型,运行即可得到low poly效果。为了避免每次执行进行顶点的计算以及修改,可以加上下面代码将修改后的Mesh保存成文件:

string fileName = "Assets/FileName.asset";//要保存成的文件路径及文件名 文件格式为.asset
        AssetDatabase.CreateAsset(meshFilter.sharedMesh, fileName);//创建文件
        AssetDatabase.SaveAssets();//保存数据

运行程序后会在Assets下生成Mesh文件,将此文件拖到该模型Mesh Filter组件下的Mesh,此时生成low poly的脚本组件已经无用了,记得移除



完整代码:

using UnityEngine;
using System.Collections;
using UnityEditor;
public class FlatShading : MonoBehaviour
{

    private Mesh mesh;
    void Start()
    {
        var meshFilter = GetComponent<MeshFilter>();
        mesh = meshFilter.mesh;
        Vector3[] oldVerts = mesh.vertices;
        int[] triangles = mesh.triangles;

        Vector3[] verts = new Vector3[triangles.Length];

        for (int i = 0; i < triangles.Length; i++)
        {
            verts[i] = oldVerts[triangles[i]];
            triangles[i] = i;
        }

        mesh.vertices = verts;
        mesh.triangles = triangles;
        mesh.RecalculateBounds();
        mesh.RecalculateNormals();

        //save file
        string fileName = "Assets/" + System.DateTime.Now.Year.ToString()+ System.DateTime.Now.Month.ToString()+ System.DateTime.Now.Day.ToString()+ System.DateTime.Now.Hour.ToString()+ System.DateTime.Now.Minute.ToString()+ System.DateTime.Now.Second.ToString() + ".asset";
        AssetDatabase.CreateAsset(meshFilter.sharedMesh, fileName);
        AssetDatabase.SaveAssets();
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值