Volver al Blog
Tutoriales

Convenciones de Mapas Normales: OpenGL vs DirectX Explicado

Por qué tu mapa normal se ve invertido en Unreal pero bien en Unity — una explicación clara de las convenciones del eje Y en espacio tangente, con soluciones concretas.

Admin23 de abril de 20263 min de lectura11

Conectas un mapa normal en Unreal y la superficie se ilumina como si el sol viniera desde abajo. Conectas el mismo archivo en Unity o Blender — se ve bien. La malla es idéntica. La textura es idéntica. ¿Qué está pasando?

Dos Industrias, Un Eje de Desacuerdo

Los mapas normales almacenan una dirección de superficie en sus canales RGB. Rojo = X, verde = Y, azul = Z. Cada motor PBR los decodifica igual excepto por una cosa: el signo de Y.

Convención OpenGL (Y+): un canal verde más brillante significa que la superficie apunta hacia arriba. Usada por Unity, Godot, Blender (Cycles y Eevee), la exportación predeterminada de Substance Painter y todos los motores basados en WebGL.

Convención DirectX (Y−): verde más brillante significa que la superficie apunta hacia abajo. Usada por Unreal Engine, la cadena de herramientas Direct3D heredada y algunos activos de la era CryEngine/Xbox.

Los mismos bytes en el PNG. Significado físico opuesto.

Cómo Reconocerlo de un Vistazo

Mira un relieve hemisférico (como un botón o una cúpula) en tu mapa normal. En convención OpenGL, la parte inferior del relieve será verde más oscuro porque la superficie se rota hacia Y−, alejándose de la luz. En convención DirectX, la parte inferior es verde más brillante.

Si tu iluminación se siente invertida en el motor — brillos donde deberían haber sombras — tienes un desajuste de convención.

La Solución Toma 5 Segundos

En Unreal, el diálogo de importación de texturas tiene una casilla Flip Green Channel. Actívala y el motor invierte el canal G en tiempo de muestreo. No necesitas re-exportar tu fuente.

En Unity, establece el tipo de textura a Normal map y el importador se encarga de todo — Unity espera OpenGL, pero te advertirá si el archivo se ve mal. En Blender, usa una cadena de nodos Separate Color → Invert G → Combine Color, o simplemente elige entrada estilo DirectX directamente en el nodo Normal Map.

¿Por Qué Dos Estándares en Primer Lugar?

En los años 90, OpenGL y DirectX definieron espacios de coordenadas de textura opuestos — OpenGL tenía Y aumentando hacia arriba, DirectX tenía Y aumentando hacia abajo. Cuando los mapas normales se volvieron comunes a mediados de los 2000, cada cadena de herramientas codificó su espacio en sus salidas. La divergencia se mantuvo porque invertir una tubería establecida es costoso.

Generando Mapas Normales Sin la Confusión

El Generador de Mapas Normales aukimi te permite elegir la convención explícitamente al exportar. Ejecuta un gradiente Sobel en la luminancia de tu mapa de alturas, luego empaqueta (−dx·s, −dy·s, 1) en RGB — con Y invertido cuando eliges DirectX. Puedes alternar la convención después de la generación y descargar nuevamente sin volver a subir nada.

Internamente la fórmula es idéntica. La única diferencia es el signo que aplicamos al componente Y antes de escribir el canal verde. Sabiendo eso, puedes convertir un archivo entre convenciones con cualquier editor de imágenes: abre el PNG, selecciona el canal verde, invierte, guarda. Eso es todo lo que hace "Flip Green Channel" en Unreal.

Referencia Rápida

  • Unity, Godot, Blender, Substance Painter (predeterminado): OpenGL (Y+).
  • Unreal Engine, Direct3D heredado: DirectX (Y−).
  • ¿Se ve mal en Unreal? Activa Flip Green Channel en las opciones de importación.
  • ¿Se ve mal en Unity? Probablemente exportaste desde una herramienta con convención DirectX — invierte el canal verde o re-exporta.

Una vez que interiorizas la convención, la solución es trivial. La parte más difícil es reconocerla la primera vez.

#normal-map#3d#pbr#shaders#opengl#directx

¿Te gustó este artículo?

ShareHN