在 Godot 2.1 beta 和 2.1 stable、Windows 10 64 位上测试
使用SurfaceTool
和add_smooth_group(true)
方法生成曲面时,如果将 UV 添加到顶点,则不可能获得平滑的法线。
我发现当 UV 没有从一个顶点增加到另一个顶点时,它会特别发生。 因此,如果曲面的每个四边形都有从 0 到 1 的 UV,则四边形将使用硬面法线进行渲染。
因此,我被迫自己生成法线。
不确定这是否是一个错误,因为我相信它已实现,因此它会这样做。 但正如我所说,即使在这种情况下也可能具有平滑的法线,因此可以增强这一点。
复述:
SurfaceToolSmoothShading.zip
启动主场景,看到左边的UVs生成的表面有硬面,右边没有,有光滑的面,而两者都有一个smooth group。
嗨@Zylann我正在谷歌搜索以寻找平滑代码生成的网格的正确方法,我偶然发现了这一点。
我正在使用 godot 3.0.4,并且像你一样使用 add_smooth_group 我得到它正确渲染,使用 UV。
[编辑] 我必须纠正自己,问题仍然存在,但我必须指定,正如 Zylann 在代码中所做的那样,它仅在 UV 散布在网格上时才有效,但在对每个四边形重复时无效:
# If UVs are spread, normals are smooth.
var t00 = Vector2(p00.x, p00.z) / Vector2(sx,sy)
var t10 = Vector2(p10.x, p10.z) / Vector2(sx,sy)
var t11 = Vector2(p11.x, p11.z) / Vector2(sx,sy)
var t01 = Vector2(p01.x, p01.z) / Vector2(sx,sy)
@Zylann您(或其他任何人)还能在 Godot 3.2.1 或3.2.2beta4 中重现此错误吗?
它仍然发生:
SurfaceToolSmoothShading.zip
我相信它会发生,因为SurfaceTool
假设平滑只能在共享顶点时发生,并且要共享的顶点必须具有相同的属性。 虽然这种情况确实使它们具有不同的 UV,但仍然可以使用具有不同 UV 的两个顶点进行平滑,但提供具有相同值的两个法线。
最有用的评论
它仍然发生:
SurfaceToolSmoothShading.zip
我相信它会发生,因为
SurfaceTool
假设平滑只能在共享顶点时发生,并且要共享的顶点必须具有相同的属性。 虽然这种情况确实使它们具有不同的 UV,但仍然可以使用具有不同 UV 的两个顶点进行平滑,但提供具有相同值的两个法线。