significa qué modelos espacio colores color cantidad opengl rgb gamma srgb gamma-distribution

opengl - qué - Espacios de color, gamma y mejora de imagen



srgb photoshop (2)

Espera, toda esta información para qué? Si puedo usar el framebuffer sRGB y cargar texturas sRGB, procesar esas texturas sin conversiones sRGB ... ¿por qué debería corregir gamma?

Generalmente, no lo haces. El propósito de la texturización sRGB y de los framebuffers es que no tenga que realizar manualmente la corrección gamma. Las lecturas de las texturas sRGB se convierten en un espacio de color lineal, y las escrituras en los framebuffers sRGB toman valores RGB lineales y los convierten en valores sRGB. Esto es todo automático, y más al punto libre , en cuanto al rendimiento.

La única vez que tendrá que hacer una corrección gamma es si la gamma del monitor no coincide con la aproximación gamma sRGB de 2.2 gamma. Raro es el monitor que hace esto.

Tus texturas no tienen que estar en el espacio de color sRGB. Sin embargo, la mayoría de las aplicaciones de creación de imágenes guardarán imágenes en sRGB y trabajarán con colores en sRGB, por lo que es probable que la mayoría de las texturas ya estén en sRGB, ya sea que quieras o no. La función de textura sRGB simplemente le permite obtener los valores de color correctos , en lugar de los valores de color que ha estado obteniendo hasta ahora.

Y brillo y contraste: ¿deben aplicarse antes o después de la corrección gamma?

No sé a qué te refieres con brillo y contraste. Eso es algo que debe establecer el monitor, no su aplicación. Pero prácticamente todas las operaciones matemáticas que deseará hacer en los datos de imagen se deben hacer en un espacio de color lineal. Por lo tanto, si se le proporciona una imagen en el espacio de color sRGB, debe linealizarla antes de poder realizar cálculos matemáticos. La función de textura sRGB hace esto gratis, en lugar de tener que hacer complejas operaciones de sombreado.

Espacio de color Bueno, todo el mundo sabe sobre RGB: tres valores normalizados en el rango [0.0,1.0], que tienen el significado de la intensidad de los componentes de color Rojo Verde Azul; esta intensidad se entiende como lineal, ¿verdad?

Gamma . Hasta donde puedo entender, gamma es una función que mapea componentes de color RGB a otro valor. Haciendo búsquedas de Google en esto, he visto funciones lineales y funciones no lineales ... Las funciones lineales parecen escalar los componentes RGB, por lo que parece ajustar el brillo de la imagen; funciones no lineales parecen "descomprimir" componentes más oscuros / más claros.

Ahora, estoy empezando a implementar un visor de imágenes, que mostrará diferentes formatos de imagen como textura. Me gustaría modificar la gama de estas imágenes, así que debería crear un sombreador de fragmentos y ejecutar el cuadriculado texturizado. Bien, pero ¿cómo determino la corrección gamma correcta?

OpenGL funciona utilizando un espacio de color RGB lineal, utilizando componentes de coma flotante. De hecho, podría calcular los valores corregidos gamma a partir de esos valores (con precisión especial de punto flotante), de modo que se muestren después de haber fijado el valor corregido gamma.

Primero, determinaré la rampa gamma. ¿Cómo podría determinarlo? (analíticamente o usando tablas de búsqueda)

Luego, vine a investigar en la extensión de OpenGL EXT_framebuffer_sRGB, que parece muy relacionada con la extensión EXT_texture_sRGB .

EXT_texture_sRGB introduce un nuevo formato de textura que se utiliza para linealizar los valores textel en el espacio lineal RGB. (nota al pie 1) De esta forma, conozco el espacio de color sRGB y lo uso como espacio de color RGB lineal.

En cambio, la extensión EXT_framebuffer_sRGB me permite codificar valores RGB lineales en el framebuffer sRGB, sin preocuparse por ello.

...

Espera, toda esta información para qué? Si puedo usar el framebuffer sRGB y cargar texturas sRGB, procesar esas texturas sin conversiones sRGB ... ¿por qué debería corregir gamma?

¿Tal vez puedo corregir gamma de todos modos, incluso en un buffer sRGB? ¿O será mejor que no? Y brillo y contraste: ¿deben aplicarse antes o después de la corrección gamma?

Es mucha información, ahora estoy confundido. Espero que alguien de ustedes pueda explicarme más todos estos conceptos! Gracias.

...

Hay otra pregunta. En el caso de que el dispositivo gamma sea diferente del 2.2 "estándar", ¿cómo "acumulo" diferentes correcciones gamma? No sé si está claro: en el caso de que los valores RGB de la imagen ya estén corregidos para un monitor con un valor gamma de 2.2, pero el monitor tiene un valor gamma de 2.8, ¿cómo puedo corregir la gamma?

(1) Aquí hay algunos extractos para resaltar lo que quiero decir:

El espacio de color sRGB se basa en características de monitor típicas (no lineales) que se esperan en una oficina poco iluminada. Ha sido estandarizado por la Comisión Electrotécnica Internacional (IEC) como IEC 61966-2-1. El espacio de color sRGB corresponde aproximadamente a 2.2 corrección gamma.


¿Esta extensión proporciona algún tipo de formato de framebuffer sRGB o garantiza que las imágenes renderizadas con texturas sRGB se "verán bien" cuando salgan a un dispositivo compatible con un espacio de color sRGB?

RESOLVED: No. Whether the displayed framebuffer is displayed to a monitor that faithfully reproduces the sRGB color space is beyond the scope of this extension. This involves the gamma correction and color calibration of the physical display device. With this extension, artists can author content in an sRGB color space and provide that sRGB content for use as texture imagery that can be properly converted to linear RGB and filtered as part of texturing in a way that preserves the sRGB distribution of precision, but that does NOT mean sRGB pixels are output to the framebuffer. Indeed, this extension provides texture formats that convert sRGB to linear RGB as part of filtering. With programmable shading, an application could perform a linear RGB to sRGB conversion just prior to emitting color values from the shader. Even so, OpenGL blending (other than simple modulation) will perform linear math operations on values stored in a non-linear space which is technically incorrect for sRGB-encoded colors. One way to think about these sRGB texture formats is that they simply provide color components with a distribution of values distributed to favor precision towards 0 rather than evenly distributing the precision with conventional non-sRGB formats such as GL_RGB8.


Lamentablemente, OpenGL por sí mismo no define un espacio de color. Simplemente se define que los valores RGB pasados ​​a OpenGL forman un espacio vectorial lineal. Los valores del framebuffer renderizado se envían al dispositivo de visualización tal como están. OpenGL solo pasa por el valor.

Gamma tiene dos propósitos:

  • La percepción sensorial no es lineal
  • En los viejos tiempos, los dispositivos de visualización tenían una respuesta no lineal

La corrección gamma se usa para compensar ambos.

La transformación es solo "valor lineal V a alguna potencia Gamma", es decir, y (v) = v ^ gamma

Las transformaciones de espacio de colores implican la cadena completa desde los valores de entrada hasta lo que se envía a la pantalla, por lo que esto incluye la corrección de gamma. Esto también implica que no debes manipular la rampa gamma tú mismo.

Durante mucho tiempo, el valor Gamma típico solía ser 2.2. Sin embargo, esto causó una cuantificación indeseable de valores bajos, por lo que Adobe introdujo un nuevo espacio de color, llamado sRGB que tiene una parte lineal para valores bajos y una función de encendido con exponencial ~ 2.3 para los valores más altos. La mayoría de los dispositivos de visualización actualmente usan sRGB. Además, la mayoría de los archivos de imagen actualmente están en sRGB.

Entonces, si tiene una imagen sRGB y la muestra tal como está en un dispositivo de visualización sRGB con una rampa gamma lineal configurada en el dispositivo (es decir, controlador de video gamma = 1), es bueno simplemente usando texturas sRGB y framebuffer y no haciendo Algo más.

EDITAR debido a los comentarios

Solo para resumir:

Si su sistema no es compatible con framebuffers sRGB:

  • Establezca una rampa de color lineal en su dispositivo de visualización.

  • crear objetos de framebuffer (lineales), en representación lineal en el objeto framebuffer. El uso de un FBO es, para mezclar correctamente, que solo funciona en el espacio de color lineal.

  • dibuja el resultado del renderizado final del FBO a la ventana usando un sombreador de fragmentos que aplica las correcciones de color (gamma y otras) deseadas.