【发布时间】:2021-04-26 07:07:33
【问题描述】:
我正在尝试统一制作一个低多边形地形,但由于某些奇怪的原因,它一直在平滑它。我尝试删除重新计算法线,但这似乎没有帮助(也破坏了照明)。请不要在资产商店发布任何资产链接。
同样使用 unity 2020.2.1f1
【问题讨论】:
标签: c# unity3d random rendering
我正在尝试统一制作一个低多边形地形,但由于某些奇怪的原因,它一直在平滑它。我尝试删除重新计算法线,但这似乎没有帮助(也破坏了照明)。请不要在资产商店发布任何资产链接。
同样使用 unity 2020.2.1f1
【问题讨论】:
标签: c# unity3d random rendering
低多边形网格背后的想法是复制顶点以实现锐利边缘。当我们通常创建一个网格时,它有 N 个顶点。当您重新计算法线时,Unity 会准确生成 N 个法线。这意味着对于网格中的每个角度,只有一个法线向量,3D 引擎会尝试对其进行平滑处理。所以假设一个简化的 2D 示例,它看起来像这样:
相反,您的目标是为每个三角形复制顶点,该顶点属于该顶点,以便每条边不相交,这将导致 Unity 为每条边生成单独的法线并锐化角度。像这样:
不幸的是,没有办法为一个顶点创建多个法线,因为您必须复制它们。因此,例如,您想创建一个包含两个边缘锐利的三角形的网格。在代码中会是这样的:
var mesh = new Mesh();
// Basically amount of your vertices is equal to amount of indices.
var vertices = new Vector3[6];
var triangles = new int[] { 0, 1, 2, 3, 4, 5 };
// Define first triangle.
vertices[0] = new Vector3(1, 0, 0);
vertices[1] = new Vector3(0, -1, 0);
vertices[2] = new Vector3(0, 0, 0);
// Define second triangle
vertices[3] = vertices[2]; // Duplicating vertex #2.
vertices[4] = vertices[1]; // Duplicating vertex #1.
vertices[5] = new Vector3(-1, 0, 1);
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.RecalculateNormals();
还可以查看这篇文章,它很好地描述了 3D 引擎中的着色行为,具体取决于共享和分离的顶点:Tutorial 9: VBO Indexing
更新:如 cmets 中所述,您也可以尝试使用平面着色模型。但据我所知,某些平台可能不支持它。
【讨论】: