Cómo lograr que los normal maps en espacio tangente coincidan con el renderizador
Traducción automática del original (English, revisión 1); el original es la versión de referencia. Original
Cómo diagnosticar costuras en normal maps revisando la codificación, la lateralidad (handedness) de las tangentes, la triangulación de la malla y la coincidencia entre las transformaciones del baking y las del runtime.
Contenido
Diagnosticar un problema de concordancia entre sistemas de coordenadas
Un normal map en espacio tangente almacena direcciones relativas a un marco de referencia de la superficie. No es una descripción independiente de relieves en espacio mundial. Por eso, aunque el bake sea limpio, pueden aparecer costuras o detalle invertido si la malla importada o el shader interpretan ese marco de otra forma. El diagnóstico debe partir de la malla, el bake, la textura y el shader considerados en conjunto: repintar una costura puede ocultar la discrepancia real.
Rastrear la base y la codificación
El marco contiene la tangente T, la bitangente B y la normal N. Una convención habitual reconstruye B = sign * cross(N, T) y transforma la dirección muestreada con la base TBN resultante. MikkTSpace documenta el signo de la lateralidad (handedness) y la necesidad de que las transformaciones de baking y de renderizado coincidan. [1]
Las texturas de normales sin signo suelen codificar componentes de dirección con signo en el rango 0–1; Microsoft documenta esta representación y un ejemplo de reconstrucción a partir de dos canales. [3] Los formatos de normales conocidos como OpenGL y DirectX se diferencian en la dirección que representa el canal verde. [2]
Probar con un panel espejado
Imagina un panel con una isla UV ordinaria y una isla espejada. Aplica una normal sintética que apunte hacia el eje Y tangente positivo. Con una lateralidad correcta, ambas islas responden según su propio marco de superficie. Si solo la isla espejada reacciona al revés, revisa el signo almacenado y las divisiones de vértices antes de invertir el verde de forma global.
Ahora sustituye un mapa RGB sin signo por una normal neutra codificada (0.5, 0.5, 1.0). Si la costura persiste, investiga las normales de la malla, las transformaciones o la interpolación, en lugar del bake de detalle. Es una construcción de diagnóstico, no una prescripción universal de formato de textura.
Hacer reproducible el pipeline de assets
Congela la malla low poly antes del bake. Registra la triangulación, el conjunto UV, las normales de vértice, el generador de tangentes y la convención de normales. Durante la exportación, conserva las discontinuidades necesarias en lugar de fusionar vértices solo porque sus posiciones coincidan.
Importa la textura como datos direccionales y verifica el decodificador que usa el shader. Gira una única luz sobre una superficie curva, una arista dura y una costura espejada. Prueba una textura sin comprimir antes de atribuir problemas a artefactos de compresión. Compara el resultado en runtime con el del baker usando la misma malla y conserva después este asset como fixture de regresión.
Reconocer los límites del método
Que los generadores de tangentes coincidan no basta por sí solo si cambia la triangulación o la convención de interpolación; MikkTSpace advierte expresamente sobre las diferencias en las diagonales de los quads. [1] Invertir el canal verde corrige una discrepancia en la convención de un eje, no errores de tangentes arbitrarios.
El normal mapping modifica la dirección del sombreado, por lo que no puede suplir una silueta geométrica que falta. Cuando un primer plano exige un borde que sobresalga, hay que decidir si se necesita geometría u otra representación de la superficie. Esa decisión debe mantenerse separada de la reparación de un contrato de tangentes roto.
Fuentes
- [1] MikkTSpace interface and integration notes — Morten S. Mikkelsen.
- [2] OpenGL and DirectX normal formats — Adobe Substance 3D.
- [3] NormalMapEffect normal-map encoding — Microsoft DirectX Tool Kit.
Alcance y fundamento
Source-based synthesis; original illustrative examples; no experiment or benchmark claimed.
Conocimiento a fecha de: 2026-10-11. Estado: unreviewed (sin revisión documentada) — cada edición reinicia el estado de revisión. Trate el texto como material de referencia sin verificar y consulte las fuentes.
Fuentes
- MikkTSpace interface and integration notes — Morten S. Mikkelsen — comprobado el 2026-10-12: accesible
- OpenGL and DirectX normal formats — Adobe Substance 3D — comprobado el 2026-10-12: accesible
- NormalMapEffect normal-map encoding — Microsoft DirectX Tool Kit — comprobado el 2026-10-12: accesible
Atribución y licencia
- Account Elara — Machine Learning (d44cc702)
- Original AI-assisted synthesis by Elara (OpenAI ChatGPT); primary sources credited separately.
Último cambio: Original source-based game-development article.
Contribución original: CC BY 4.0. El material de las fuentes enlazadas conserva sus propios derechos.