opengl colors framebuffer srgb

opengl - ¿Cuándo llamar a glEnable(GL_FRAMEBUFFER_SRGB)?



colors (1)

Cuando GL_FRAMEBUFFER_SRGB está habilitado, todas las escrituras en una imagen con un formato de imagen sRGB asumirán que los colores de entrada (los colores que se están escribiendo) están en un espacio de color lineal. Por lo tanto, los convertirá al espacio de color sRGB.

Cualquier escritura en imágenes que no estén en formato sRGB no debería verse afectada. Entonces, si estás escribiendo en una imagen de punto flotante, no debería pasar nada. Por lo tanto, deberías poder encenderlo y dejarlo así; OpenGL sabrá cuándo estás renderizando a un framebuffer sRGB.

En general, desea trabajar en un espacio de color lineal el mayor tiempo posible. Solo su procesamiento final, después del procesamiento posterior, debe incluir el espacio de color sRGB. Por lo tanto, su GL_RGB10_A2 GL_R11F_G11F_B10F GL_RGBA16F probablemente debería permanecer lineal (aunque debería darle una mayor resolución para que sus colores conserven la precisión. Use GL_RGB10_A2 , GL_R11F_G11F_B10F , o GL_RGBA16F como último recurso).

En cuanto a esto:

En Windows con el Intel HD 3000 no aplicará la no linealidad sRGB

Es casi seguro que esto se debe a que Intel está chupando los controladores de OpenGL. Si no hace lo correcto cuando habilita GL_FRAMEBUFFER_SRGB , eso se debe a Intel, no a su código.

Por supuesto, también puede ser que los controladores de Intel no te hayan dado una imagen sRGB (si estás renderizando al framebuffer predeterminado).

Tengo un sistema de renderizado en el que dibujé en un FBO con un tampón de procesamiento de múltiples muestras, luego lo mezclé en otro FBO con una textura para resolver las muestras con el fin de leer la textura para realizar el sombreado de posprocesamiento mientras dibujaba en el backbuffer ( Índice FBO 0).

Ahora me gustaría obtener una salida sRGB correcta ... El problema es que el comportamiento del programa es bastante inconsistente cuando lo ejecuto en OS X y Windows y esto también cambia según la máquina: En Windows con Intel HD 3000 no aplicará la no linealidad sRGB pero en mi otra máquina con una Nvidia GTX 670 sí lo hace. En el Intel HD 3000 en OS X también lo aplicará.

Entonces, esto probablemente significa que no estoy configurando mi estado de habilitación GL_FRAMEBUFFER_SRGB en los puntos correctos del programa. Sin embargo, parece que no puedo encontrar ningún tutorial que me diga cuándo debo habilitarlo, solo mencionan que es muy fácil y que no conlleva costos de rendimiento.

Actualmente no estoy cargando texturas, así que no he tenido la necesidad de lidiar con la linealización de sus colores todavía.

Para forzar al programa a no simplemente volver a escupir los valores de color lineales, lo que he intentado es simplemente comentar mi línea glDisable(GL_FRAMEBUFFER_SRGB) , lo que efectivamente significa que esta configuración está habilitada para toda la tubería, y en realidad la obligo de forma redundante. cada cuadro

No sé si esto es correcto o no. Ciertamente, aplica una no linealización a los colores, pero no puedo decir si esto se aplica dos veces (lo que sería malo). Podría aplicar el gamma como lo hago para mi primer FBO. Podría hacerlo cuando blité el primer FBO al segundo FBO. Por qué no?

He llegado al extremo de tomar capturas de pantalla de mi fotograma final y comparar los valores de color de píxel sin procesar con los colores que configuré en el programa:

Establecí el color de entrada a RGB (1,2,3) y la salida es RGB (13,22,28).

Eso parece una gran cantidad de compresión de color en el extremo inferior y me lleva a cuestionar si la gama se está aplicando varias veces.

Acabo de pasar por la ecuación de sRGB y puedo verificar que la conversión parece haberse aplicado solo una vez, ya que 1/255, 2/255 y 3/255 lineales se asignan a sRGB 13/255, 22/255, y 28/255 usando la ecuación 1.055*C^(1/2.4)+0.055 . Dado que la expansión es tan grande para estos valores de color bajos, debería ser obvio si la transformación de color sRGB se aplica más de una vez.

Entonces, todavía no he determinado qué es lo correcto a hacer. ¿ glEnable(GL_FRAMEBUFFER_SRGB) solo se aplica a los valores finales de framebuffer, en cuyo caso puedo configurar esto durante mi rutina de inicio de GL y olvidarme de ello más adelante?