En gráficos por computadora , la composición alfa o combinación alfa es el proceso de combinar una imagen con un fondo para crear la apariencia de transparencia parcial o total . [1] A menudo es útil renderizar elementos de imagen (píxeles) en pases o capas separados y luego combinar las imágenes 2D resultantes en una única imagen final llamada composición . La composición se usa ampliamente en películas cuando se combinan elementos de imagen renderizados por computadora con metraje en vivo . La combinación alfa también se usa en gráficos por computadora 2D para colocar elementos de primer plano rasterizados sobre un fondo.
Para combinar correctamente los elementos de las imágenes, es necesario mantener una capa mate asociada a cada elemento, además de su color. Esta capa mate contiene la información de cobertura (la forma de la geometría que se está dibujando), lo que permite distinguir entre las partes de la imagen en las que se dibujó algo y las partes que están vacías.
Aunque la operación más básica para combinar dos imágenes es poner una sobre la otra, existen muchas operaciones, o modos de fusión , que se utilizan.
El concepto de canal alfa fue introducido por Alvy Ray Smith y Ed Catmull a fines de la década de 1970 en el Laboratorio de Gráficos Informáticos del Instituto de Tecnología de Nueva York . Bruce A. Wallace derivó el mismo operador de canal alfa basado en un modelo físico de reflectancia / transmitancia en 1981. [2] Un artículo de 1984 de Thomas Porter y Tom Duff introdujo el alfa premultiplicado utilizando un enfoque geométrico. [3]
Smith explica el uso del término alfa de la siguiente manera: "Lo llamamos así debido a la fórmula clásica de interpolación lineal que utiliza la letra griega (alfa) para controlar la cantidad de interpolación entre, en este caso, dos imágenes A y B". [4] Es decir, al componer la imagen A encima de la imagen B, el valor de en la fórmula se toma directamente del canal alfa de A.
En una imagen 2D, se almacena una combinación de colores para cada elemento de la imagen (píxel), a menudo una combinación de rojo, verde y azul ( RGB ). Cuando se utiliza la composición alfa, cada píxel tiene un valor numérico adicional almacenado en su canal alfa , con un valor que varía de 0 a 1. Un valor de 0 significa que el píxel es completamente transparente y el color del píxel que se encuentra debajo se verá a través de él. Un valor de 1 significa que el píxel es completamente opaco.
Con la existencia de un canal alfa, es posible expresar operaciones de composición de imágenes utilizando un álgebra de composición . Por ejemplo, dadas dos imágenes A y B , la operación de composición más común es combinar las imágenes de modo que A aparezca en primer plano y B aparezca en segundo plano. Esto se puede expresar como A sobre B. Además de sobre , Porter y Duff [3] definieron los operadores de composición en , mantenido por (la frase se refiere al enmarañado de retención y generalmente se abrevia como out ), encima y xor (y los operadores inversos rover , rin , rout y ratop ) a partir de una consideración de las opciones en la combinación de los colores de dos píxeles cuando su cobertura se superpone, conceptualmente, ortogonalmente:
A modo de ejemplo, el operador over se puede lograr aplicando la siguiente fórmula a cada píxel: [2]
Aquí , y representan los componentes de color de los píxeles en el resultado de la "superposición", imagen A e imagen B respectivamente, aplicados a cada canal de color (rojo/verde/azul) individualmente, mientras que , y son los valores alfa de los respectivos píxeles.
El operador over es, en efecto, la operación de pintura normal (véase el algoritmo de Painter ). Los operadores in y out son el equivalente de recorte en la composición alfa . Los dos utilizan solo el canal alfa de la segunda imagen e ignoran los componentes de color. Además, plus define la combinación aditiva. [3]
Si se utiliza un canal alfa en una imagen, hay dos representaciones comunes disponibles: alfa recta (no asociada) y alfa premultiplicada (asociada).
La ventaja más importante del alfa premultiplicado es que permite una combinación, interpolación y filtrado correctos . La interpolación ordinaria sin alfa premultiplicado hace que la información RGB se filtre fuera de las regiones completamente transparentes (A=0), aunque esta información RGB es idealmente invisible. Al interpolar o filtrar imágenes con bordes abruptos entre regiones transparentes y opacas, esto puede dar como resultado bordes de colores que no eran visibles en la imagen original. También ocurren errores en áreas de semitransparencia porque los componentes RGB no están correctamente ponderados, lo que da una ponderación incorrectamente alta al color de los píxeles más transparentes (alfa más bajo). [5]
El alfa premultiplicado también se puede utilizar para permitir que regiones de mezcla alfa regular (por ejemplo, humo) y regiones con modo de mezcla aditivo (por ejemplo, efectos de llama y brillo) se codifiquen dentro de la misma imagen. [6] [7] Esto se representa mediante un triplete RGBA que expresa emisión sin oclusión, como (0,4, 0,3, 0,2, 0,0).
Otra ventaja del alfa premultiplicado es el rendimiento; en ciertas situaciones, puede reducir la cantidad de operaciones de multiplicación (por ejemplo, si la imagen se usa muchas veces durante la composición posterior). Las operaciones de Porter-Duff tienen una forma simple solo en alfa premultiplicado. [3] Algunas canalizaciones de renderizado exponen una superficie API de "alfa directa", pero las convierten en alfa premultiplicado para mejorar el rendimiento. [8]
Una desventaja del alfa premultiplicado es que puede reducir la precisión relativa disponible en los valores RGB cuando se utiliza una representación de enteros o de punto fijo para los componentes de color. Esto puede provocar una pérdida notable de calidad si la información de color se aclara posteriormente o si se elimina el canal alfa. En la práctica, esto no suele notarse porque durante las operaciones de composición típicas, como OVER, la influencia de la información de color de baja precisión en las áreas de bajo alfa en la imagen de salida final (después de la composición) se reduce correspondientemente. Esta pérdida de precisión también hace que las imágenes premultiplicadas sean más fáciles de comprimir utilizando ciertos esquemas de compresión, ya que no registran las variaciones de color ocultas dentro de las regiones transparentes y pueden asignar menos bits para codificar áreas de bajo alfa. Las mismas "limitaciones" de las profundidades de bits de cuantificación más bajas, como 8 bits por canal, también están presentes en las imágenes sin alfa, y este argumento es problemático como resultado.
Suponiendo que el color del píxel se expresa utilizando tuplas RGBA rectas (no premultiplicadas) , un valor de píxel de (0, 0,7, 0, 0,5) implica un píxel que tiene el 70 % de la intensidad máxima de verde y el 50 % de opacidad. Si el color fuera completamente verde, su RGBA sería (0, 1, 0, 0,5). Sin embargo, si este píxel utiliza alfa premultiplicado, todos los valores RGB (0, 0,7, 0) se multiplican o se escalan para la oclusión por el valor alfa 0,5, que se agrega para obtener (0, 0,35, 0, 0,5). En este caso, el valor 0,35 para el canal G indica en realidad una intensidad de emisión verde del 70 % (con una oclusión del 50 %). Una emisión verde pura se codificaría como (0, 0,5, 0, 0,5). Saber si un archivo utiliza alfa directo o premultiplicado es esencial para procesarlo o componerlo correctamente, ya que se requiere un cálculo diferente.
La emisión sin oclusión no se puede representar en alfa directa. No hay conversión disponible en este caso.
Los formatos de imagen más populares que admiten el canal alfa son PNG y TIFF . GIF admite canales alfa, pero se considera ineficiente en lo que respecta al tamaño del archivo. La compatibilidad con canales alfa está presente en algunos códecs de vídeo, como Animation y Apple ProRes 4444 del formato QuickTime, o en el códec multiformato Techsmith.
El formato de archivo BMP generalmente no soporta este canal; sin embargo, en diferentes formatos como 32 bits (888–8) o 16 bits (444–4) es posible guardar el canal alfa, aunque no todos los sistemas o programas son capaces de leerlo: es explotado principalmente en algunos videojuegos [9] o aplicaciones particulares; [10] también se han creado programas específicos para la creación de estos BMP.
Formato de archivo/códec [11] | Profundidad máxima | Tipo | Compatibilidad con navegadores | Tipo de medio | Notas |
---|---|---|---|---|---|
Apple ProRes 4444 | 16 bits | Ninguno | Vídeo (.mov) | ProRes es el sucesor del Apple Intermediate Codec [12] | |
HEVC / h.265 | 10 bits | Limitado a Safari | Vídeo (.hevc) | Sucesor previsto de H.264 [13] [14] [15] | |
WebM (códec de vídeo VP8, VP9 o AV1) | 12 bits | Todos los navegadores modernos | Vídeo (.webm) | Si bien VP8/VP9 es ampliamente compatible con los navegadores modernos, AV1 aún tiene un soporte limitado. [16] Solo los navegadores basados en Chromium mostrarán capas alfa. | |
Abrir EXR | 32 bits | Ninguno | Imagen (.exr) | Tiene la mayor dispersión HDR. | |
PNG | 16 bits | derecho | Todos los navegadores modernos | Imagen (.png) | |
APNG | 24 bits | derecho | Soporte moderado | Imagen (.apng) | Admite animación. [17] |
PELEA | 32 bits | ambos | Ninguno | Imagen (.tiff) | |
GIF | 8 bits | Todos los navegadores modernos | Imagen (.gif) | Los navegadores generalmente no admiten capas alfa GIF. | |
SVG | 32 bits | derecho | Todos los navegadores modernos | Imagen (.svg) | Basado en color CSS. [18] |
JPEG-XL | 32 bits | ambos | Soporte moderado | Imagen (.jxl) | Permite pérdida y HDR. [19] |
Los valores RGB de las imágenes digitales típicas no corresponden directamente a las intensidades de la luz física, sino que están comprimidos por una función de corrección gamma :
Esta transformación utiliza mejor el número limitado de bits en la imagen codificada al elegir el que mejor se adapta a la percepción humana no lineal de la luminancia.
En consecuencia, los programas informáticos que tratan con dichas imágenes deben decodificar los valores RGB en un espacio lineal (deshaciendo la compresión gamma), combinar las intensidades de luz lineales y volver a aplicar la compresión gamma al resultado: [20] [21] [ verificación fallida ]
Cuando se combina con alfa premultiplicado, la premultiplicación se realiza en el espacio lineal, antes de la compresión gamma. [22] Esto da como resultado la siguiente fórmula:
Tenga en cuenta que el canal alfa puede o no sufrir corrección gamma, incluso cuando los canales de color sí lo hacen.
Aunque se utilizan para fines similares, los colores transparentes y las máscaras de imagen no permiten una combinación suave de los píxeles de la imagen superpuesta con los del fondo (solo se permiten píxeles de la imagen completa o píxeles de fondo completos).
Se puede lograr un efecto similar con un canal alfa de 1 bit, como el que se encuentra en el modo de color de alta definición RGBA de 16 bits del formato de archivo de imagen Truevision TGA y el modo gráfico de color de alta definición de los adaptadores de pantalla TARGA y AT-Vista/NU-Vista relacionados . Este modo dedica 5 bits a cada color RGB primario ( RGB de 15 bits ) más un bit restante como "canal alfa".
El tramado se puede utilizar para simular una oclusión parcial donde solo está disponible un alfa de 1 bit.
Para algunas aplicaciones, un único canal alfa no es suficiente: una vidriera , por ejemplo, requiere un canal de transparencia independiente para cada canal RGB para modelar la transparencia del rojo, el verde y el azul por separado. Se pueden agregar más canales alfa para aplicaciones de filtrado de color espectral precisas.
Algunos métodos de transparencia independientes del orden reemplazan el operador sobre con una aproximación conmutativa. [23]
Sin embargo, sucede algo interesante cuando generamos el siguiente nivel de mapa MIP...
Al cambiar al modo de fusión premultiplicada para todos los efectos de partículas, se puede hacer toda la escena con una llamada de dibujo (suponiendo que se usa un atlas/matriz 2D para las texturas)... Otro truco interesante con alfa premultiplicada es que si tienes texturas superpuestas que están en posiciones conocidas, puedes preprocesarlas todas hasta obtener una sola textura.
Win2D utiliza alfa directo en su superficie API, pero alfa premultiplicado para operaciones de renderizado internas.