Godot: Нормали SurfaceTool не могут быть сглаженными при добавлении UV

Созданный на 13 авг. 2016  ·  3Комментарии  ·  Источник: godotengine/godot

Протестировано на Godot 2.1 beta и 2.1 стабильной, Windows 10 64 бит

При создании поверхности с помощью SurfaceTool и метода add_smooth_group(true) невозможно получить гладкие нормали, если к вершинам добавлены UV.
Я обнаружил, что это происходит, когда UV-развертка не увеличивается от одной вершины к другой. Таким образом, если каждый четырехугольник поверхности имеет UV-развертку от 0 до 1, четырехугольник будет визуализирован с нормалями твердых поверхностей.
Из-за этого я вынужден сам генерировать нормали.

Не уверен, что это ошибка, потому что я считаю, что она была реализована, поэтому она это делает. Но, как я уже сказал, даже в этом случае можно получить гладкие нормали, так что это можно улучшить.

Репродукция:
SurfaceToolSmoothShading.zip
Запустите основную сцену, увидите, что сгенерированная поверхность слева с UV-разверткой имеет твердые грани, правая - нет и имеет гладкие грани, в то время как обе имеют гладкую группу.

bug confirmed core

Самый полезный комментарий

Еще бывает:
SurfaceToolSmoothShading.zip

Я считаю, что это происходит потому, что SurfaceTool предполагает, что сглаживание может происходить только в том случае, если вершины являются общими, и чтобы они были общими, вершины должны иметь одинаковые атрибуты. Хотя это правда, что в этом случае они имеют разные UV-развертки, сглаживание должно быть возможно с двумя вершинами с разными UV, но с получением двух нормалей, имеющих одинаковое значение.

Все 3 Комментарий

Привет @Zylann. Я
Я использую godot 3.0.4 и, используя add_smooth_group, как вы, я получаю его правильно с UV.
[править] Я должен исправить себя, проблема все еще существует, но я должен указать, как это сделал Зиланн в коде, что это работает, только если 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, но с получением двух нормалей, имеющих одинаковое значение.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги