网格中三角形的顺序

问题描述 投票:0回答:0

这是我第一次使用网格。我正在关注 Sebastian Lague 关于程序行星的教程,但我不明白如何在没有网格的情况下制作海洋。我认为他以某种方式用后处理着色器做到了。

https://www.youtube.com/watch?v=OULxvDLojic&list=PLFt_AvWsXl0cONs3T0By4puYy6GM22ko8&index=7&ab_channel=SebastianLague

反正我做了一个脚本,生成一个海洋网格,分辨率和地球网格一样,只覆盖海洋应该存在的部分。问问题,因为我知道我没有解释好。我的问题是:网格没有出现。我几乎可以肯定是因为我没有正确填充 mesh.triangles 数组。有人可以解释一下如何正确地做吗?

(也许我用错误的方式生成了海洋。如果是这样,我应该怎么做?)

代码如下:

public OceanFace(Mesh mesh, TerrainFace face, int resolution, float elevation )
    {
        this.mesh = mesh;
        terrainFace = face;
        this.resolution = resolution;
        this.elevation = elevation ;
        decrements = new int[6,2] {
            
            {-resolution - 1, -resolution },
            { -resolution,1} ,
            {1,resolution+1},
            {resolution+1,resolution},
            {resolution,-1},
            {-1,resolution-1}
        };

    }
    public void ConstructMesh()
    {
        List<Vector3> myVerts = new();
        Vector3[] terrainVerts = terrainFace.Mesh.vertices;
        bool notGood = false;
        //Adds one layer of vertecies around to avoid artifacts
        foreach (int oceanVertIndex in terrainFace.bellowZeroVertsIndexes)
        {
            bool logic = false;
            for (int i = 0; i < decrements.GetLength(0); i++)
            {
                if (logic)
                {
                    logic = false;
                    continue;
                }
                for(int j = i==0?0:1; j < decrements.GetLength(1); j++)
                {
                    int pointToCheck = oceanVertIndex + decrements[i,j];
                
                    logic = !InsideArray(pointToCheck, resolution) 
                        || 
                    (terrainFace.bellowZeroVertsIndexes.Contains(pointToCheck) && pointToCheck < oceanVertIndex );
                    if (logic)
                    {
                        notGood = true;
                        break;
                    }
                }
                if (notGood) continue;
                //the order matters
                myVerts.Add(terrainVerts[oceanVertIndex + decrements[i,0]]);
                myVerts.Add(terrainVerts[oceanVertIndex + decrements[i, 1]]);
                myVerts.Add(terrainVerts[oceanVertIndex ]);
                
            }
                
        }
        int vertsCount = myVerts.Count;
        mesh.Clear();
        mesh.vertices = myVerts.ToArray();
        mesh.triangles = From0ToLength(vertsCount);//from 0 to vert.length
        mesh.RecalculateNormals();
        mesh.uv = (mesh.uv.Length == vertsCount) ? mesh.uv : new Vector2[vertsCount];


    }
    int[] From0ToLength(int length)
    {
        int[] arr = new int[length];
        for (int i = 0; i < length; i++)
            arr[i] = i;
        return arr;
    }
c# unity3d graphics mesh
© www.soinside.com 2019 - 2024. All rights reserved.