卜若的代码笔记-unityshader系列-第八章:复杂Mesh

这一章我们讲复杂的mesh为下一章的材质准备一些材料

8.1 创建一个矩形面片

本质就是绘制两个三角形面片,如图8-1.其代码有注释了就不做太多解释了。

 

   public virtual Mesh createMesh()
    {

        Mesh mesh = new Mesh();

        Vector3[] v3s = new Vector3[4];
        v3s[0] = new Vector3(0,  0,0);
        v3s[1] = new Vector3(0,  0,1);
        v3s[2] = new Vector3(1,  0,0);
        v3s[3] = new Vector3(1,  0,1);
        mesh.vertices = v3s;

        //绘制方向是顺时针
        int[] index = new int[6];
        //绘制第一个三角形是0->1->2
        index[0] = 0;
        index[1] = 1;
        index[2] = 2;
        //绘制第二个三角形是3->2->1
        /*
         * 1------------3
         * |            |
         * |            |
         * |            |
         * |            |
         * |            |
         * |            |
         * 0------------2 
         */
        index[3] = 3;
        index[4] = 2;
        index[5] = 1;
        mesh.triangles = index;


        Vector2[] uvs = new Vector2[4];
        uvs[0] = new Vector2(0, 0);
        uvs[1] = new Vector2(1, 0);
        uvs[2] = new Vector2(0, 1);
        uvs[3] = new Vector2(1, 1);
        mesh.uv = uvs;

        mesh.RecalculateBounds();
        mesh.RecalculateNormals();
        return mesh;

8.2 创建一个由矩形面片联合而成的超长矩形面片

其代码如下,太简单了,不做解释

 public override Mesh createMesh()
    {


        Mesh mesh = new Mesh();
        int sc = 100;
        
        //每四个点可以构成一个矩形面片
        //本教程是构建一排矩形面片
        Vector3[] v3s = new Vector3[sc * 4];

        //绘制一个矩形面片需要指定6个绘制顺序
        int[] index = new int[6* sc];
        Vector2[] uvs = new Vector2[4* sc];
       

        for (int i = 0; i < sc; i++) {

            v3s[i * 4 + 0] = new Vector3(i, 0, 0);
            v3s[i * 4 + 1] = new Vector3(i, 0,  1);
            v3s[i * 4 + 2] = new Vector3(i + 1, 0, 0);
            v3s[i * 4 + 3] = new Vector3(i + 1, 0, 1);

            uvs[i*4+0]     = new Vector2(i, 0);
            uvs[i * 4 + 1] = new Vector2(1+1, 0);
            uvs[i * 4 + 2] = new Vector2(i, 1);
            uvs[i * 4 + 3] = new Vector2(1+1, 1);
        }

        for (int i = 0; i < sc; i++)
        {

            index[i * 6 + 0] = i*4;
            index[i * 6 + 1] = i*4+1;
            index[i * 6 + 2] = i*4+2;
            index[i * 6 + 3] = i*4+3;
            index[i * 6 + 4] = i*4+2;
            index[i * 6 + 5] = i * 4 + 1;
        }

     
        mesh.vertices = v3s;
        mesh.triangles = index;


        
        mesh.uv = uvs;



        return mesh;

}

8.3 创建一个由100*4*100个顶点的矩形面片

 public override Mesh createMesh()
    {
        Mesh mesh = new Mesh();
        int sc = 100;
        int sr = 100;

        //每四个点可以构成一个矩形面片
        //本教程是构建一排矩形面片
        Vector3[] v3s = new Vector3[sc * 4 * sr];

        //绘制一个矩形面片需要指定6个绘制顺序
        int[] index = new int[6 * sc * sr];
        Vector2[] uvs = new Vector2[4 * sc * sr];


        for (int i = 0; i < sc; i++)
        {

            for (int j = 0; j < sr; j++)
            {
                v3s[(i * sr + j) * 4 + 0] = new Vector3(i, 0, j);
                v3s[(i * sr + j) * 4 + 1] = new Vector3(i, 0, 1 + j);
                v3s[(i * sr + j) * 4 + 2] = new Vector3(i + 1, 0, j);
                v3s[(i * sr + j) * 4 + 3] = new Vector3(i + 1, 0, 1 + j);

                uvs[(i * sr + j) * 4+ 0] = new Vector2(i, j)/sc;
                uvs[(i * sr + j) * 4+ 1] = new Vector2(1 + 1, j) / sc;
                uvs[(i * sr + j) * 4+ 2] = new Vector2(i, 1 + j) / sc;
                uvs[(i * sr + j) * 4 + 3] = new Vector2(1 + 1, 1 + j) / sc;
            }

        }

        for (int i = 0; i < sc * sr; i++)
        {

            index[i * 6 + 0] = i * 4;
            index[i * 6 + 1] = i * 4 + 1;
            index[i * 6 + 2] = i * 4 + 2;
            index[i * 6 + 3] = i * 4 + 3;
            index[i * 6 + 4] = i * 4 + 2;
            index[i * 6 + 5] = i * 4 + 1;
        }


        mesh.vertices = v3s;
        mesh.triangles = index;
        mesh.uv = uvs;

        return mesh;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值