这是我第一次使用网格。我正在关注 Sebastian Lague 关于程序行星的教程,但我不明白如何在没有网格的情况下制作海洋。我认为他以某种方式用后处理着色器做到了。
反正我做了一个脚本,生成一个海洋网格,分辨率和地球网格一样,只覆盖海洋应该存在的部分。问问题,因为我知道我没有解释好。我的问题是:网格没有出现。我几乎可以肯定是因为我没有正确填充 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;
}