Godot: Las normales de SurfaceTool no pueden ser suaves cuando se agregan rayos UV

Creado en 13 ago. 2016  ·  3Comentarios  ·  Fuente: godotengine/godot

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.

bug confirmed core

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.

Todos 3 comentarios

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.

¿Fue útil esta página
0 / 5 - 0 calificaciones