Mantener los cálculos de iluminación en espacio lineal al usar texturas sRGB
Traducción automática del original (English, revisión 1); el original es la versión de referencia. Original
Sigue los valores de color desde el almacenamiento de la textura, pasando por el sombreado, hasta la codificación para pantalla, y distingue los mapas de color de los datos numéricos.
Contenido
Seguir el significado de un valor
Una imagen puede verse correcta en un visor y, aun así, producir una iluminación incorrecta en un juego. El valor almacenado en el canal puede ser un color codificado y no una cantidad proporcional a la luz. Las sumas de iluminación y las mezclas ponderadas de color requieren valores de luz lineal; cambiar la exposición no suele poder corregir una aritmética realizada sobre entradas codificadas. [1]
Considera cada frontera entre recursos como un contrato: qué significan los bytes, qué conversión se aplica al leerlos y qué espera la siguiente pasada.
Distinguir color de datos
Un formato de textura sRGB decodifica los canales de color al muestrearlos. El canal alfa no recibe la misma conversión de color. Un formato entero normalizado y un formato sRGB pueden almacenar los mismos bytes y, sin embargo, exponer al sombreado valores numéricos distintos. [2][3]
Las imágenes de color base suelen necesitar decodificación de color. La rugosidad, las máscaras, la profundidad y las componentes codificadas de las normales son datos numéricos y deben seguir su propia representación declarada. La extensión del archivo por sí sola no determina ese significado. Anota tanto la codificación original de la imagen como el formato de la vista en la GPU.
Calcular un ejemplo controlado
Tomemos, a modo de ilustración, un texel neutro con valor sRGB almacenado de 0,5. Al aplicar la función de transferencia sRGB, se obtiene aproximadamente 0,214 en luz lineal. Reducir esa luz a la mitad da cerca de 0,107; al codificar el resultado de nuevo a sRGB se obtiene aproximadamente 0,361. Estos valores se calculan a partir de la función de transferencia; no son luminancia medida en una pantalla. [2]
Crea un material de prueba que realice esta operación con un multiplicador constante. Compara su resultado con un parche de referencia precalculado. Si el shader además decodifica una textura que ya se decodifica automáticamente, o si la pasada final codifica un resultado ya codificado, los parches divergirán.
Auditar el recorrido completo
Empieza con parches sin iluminación y desactiva la gradación artística mientras pruebas. Inspecciona las vistas de textura, los resultados del muestreador, los destinos intermedios, la mezcla (blending) y la salida final. Asigna un único responsable a cada conversión necesaria; un shader y un formato de attachment no deben aplicar ambos la misma codificación.
A continuación, introduce dos luces controladas e inspecciona su resultado combinado antes de la conversión para pantalla. Comprueba por separado la generación de mipmaps, porque un muestreo correcto no puede reparar niveles de origen promediados de forma incorrecta. Por último, restablece la gradación y verifica los colores de la interfaz a través de su ruta real de composición.
Mantener separados los conceptos relacionados
La luz lineal describe la aritmética, mientras que las primarias de color definen un gamut y el almacenamiento en coma flotante define una representación numérica. Ninguna de las tres garantiza por sí sola las otras dos. Además, una conversión de salida a sRGB no es un tone mapper para valores HDR sin restricción.
Conserva capturas de diagnóstico antes y después del procesado de salida. Cuando un material se oscurece de repente tras un cambio en la importación, esas capturas ayudan a identificar el primer valor que cambió, en lugar de empujar a hacer ediciones compensatorias en todos los materiales.
Fuentes
- [1] The Importance of Being Linear — Larry Gritz y Eugene d’Eon, NVIDIA.
- [2] EXT_texture_sRGB specification — Khronos OpenGL Registry.
- [3] Data Conversion Rules — Microsoft.
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
- The Importance of Being Linear — Larry Gritz and Eugene d’Eon, NVIDIA — comprobado el 2026-10-12: accesible
- EXT_texture_sRGB specification — Khronos OpenGL Registry — no se pudo comprobar el 2026-10-30: el sitio no admite comprobaciones automáticas (HTTP 403)
- Data Conversion Rules — Microsoft — 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.