【问题标题】:Unsmooth generated mesh in unity统一生成的网格不平滑
【发布时间】:2021-04-26 07:07:33
【问题描述】:

我正在尝试统一制作一个低多边形地形,但由于某些奇怪的原因,它一直在平滑它。我尝试删除重新计算法线,但这似乎没有帮助(也破坏了照明)。请不要在资产商店发布任何资产链接。

同样使用 unity 2020.2.1f1

【问题讨论】:

    标签: c# unity3d random rendering


    【解决方案1】:

    低多边形网格背后的想法是复制顶点以实现锐利边缘。当我们通常创建一个网格时,它有 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 中所述,您也可以尝试使用平面着色模型。但据我所知,某些平台可能不支持它。

    【讨论】:

    • 您可能要提到这取决于所使用的着色模型。 IE。 Gouraud 着色与平面着色。
    • @JonasH 我的错。事实上,您也可以使用平面着色。但由于我们不知道 OP 的目标平台是什么,而且不是每个平台都支持平面着色,所以分离顶点是更通用的解决方案。
    • 绝对正确。我只是认为提及这些术语是个好主意,因为 OP 似乎不知道它们。
    • 我知道这个命名悖论是由 OP 引入的......但是说你通过添加更多顶点来创建一个 low poly 网格听起来有点好笑;) ment 是当然是平坦/锐利的边缘渲染,但我猜复制地形的边缘会创建大量新的网格数据并大大减慢渲染速度
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2015-05-08
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多