Probado en Godot 2.1 beta y 2.1 estable, Windows 10 de 64 bits
Al generar una superficie con SurfaceTool
y el método add_smooth_group(true)
, es imposible obtener normales suaves si se agregan UV a los vértices.
Descubrí que sucede específicamente cuando los rayos UV no aumentan de un vértice a otro. Entonces, si cada cuadrante de una superficie tiene UV que van de 0 a 1, el cuadrante se renderizará con normales de cara dura.
Debido a esto, me veo obligado a generar yo mismo normales.
No estoy seguro de si es un error porque creo que se implementó, así que lo hace. Pero como dije, es posible tener normales suaves incluso en ese caso, por lo que esto se puede mejorar.
Repro:
SurfaceToolSmoothShading.zip
Inicie la escena principal, vea que la superficie generada a la izquierda con rayos UV tiene caras duras, la de la derecha no y tiene caras suaves, mientras que ambas tienen un grupo suave.
Hola @Zylann Estaba buscando en Google la forma correcta de suavizar una malla generada por código y me encontré con esto.
Estoy usando godot 3.0.4 y, usando add_smooth_group como tú, lo obtengo correctamente, con UV.
[editar] Tengo que corregirme, el problema sigue ahí, pero tengo que especificar, como hizo Zylann en el código, que funciona solo si los rayos UV se extienden sobre la malla, pero no cuando se repite para cada cuadrante:
# 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 ¿Puede usted (o cualquier otra persona) reproducir este error en Godot 3.2.1 o 3.2.2beta4 ?
Todavía sucede:
SurfaceToolSmoothShading.zip
Creo que sucede porque SurfaceTool
asume que el suavizado solo puede ocurrir si los vértices son compartidos, y para ser compartidos, los vértices deben tener atributos iguales. Si bien es cierto que este caso hace que tengan diferentes UV, el suavizado debería ser posible con dos vértices con diferente UV, pero dando dos normales con el mismo valor.
Comentario más útil
Todavía sucede:
SurfaceToolSmoothShading.zip
Creo que sucede porque
SurfaceTool
asume que el suavizado solo puede ocurrir si los vértices son compartidos, y para ser compartidos, los vértices deben tener atributos iguales. Si bien es cierto que este caso hace que tengan diferentes UV, el suavizado debería ser posible con dos vértices con diferente UV, pero dando dos normales con el mismo valor.