Tengo un sistema de renderizado en el que dibujo un FBO con un renderbuffer de múltiples muestreos, luego lo coloco en otro FBO con una textura para resolver las muestras para leer la textura y realizar el sombreado de postproceso mientras dibujo al backbuffer (índice 0 de FBO).¿Cuándo llamar a glEnable (GL_FRAMEBUFFER_SRGB)?
Ahora me gustaría obtener una salida sRGB correcta ... El problema es que el comportamiento del programa es bastante inconsistente entre cuando lo ejecuto en OS X y Windows y esto también cambia dependiendo de 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í. En Intel HD 3000 en OS X, también lo aplicará.
Así que esto probablemente significa que no estoy estableciendo mi GL_FRAMEBUFFER_SRGB
estado de habilitación en los puntos adecuados en el programa. Sin embargo, parece que no puedo encontrar ningún tutorial que realmente me diga cuándo debo habilitarlo, solo mencionan que es muy fácil y no tiene costo de rendimiento.
actualmente no estoy de carga en cualquier texturas así que no he tenido la necesidad de hacer frente a linealizar sus colores aún.
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 significa que esta configuración está habilitada para toda la tubería y realmente la forzo a volver en 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 aplicará dos veces (lo que sería malo). Podría aplicar el gamma cuando lo renderice en mi primer FBO. Podría hacerlo cuando coloque el primer FBO en el segundo FBO. Por qué no?
He ido tan lejos como para tomar capturas de pantalla de mi cuadro final y compara los valores de color de píxeles en bruto a los colores que las puso en el programa:
fijo el color de entrada a RGB (1, 2,3) y la salida es RGB (13,22,28).
Eso parece como un buen montón de compresión de color en el extremo inferior y me lleva a cuestionar si el gamma se está aplicado varias veces.
Acabo de pasar por la ecuación sRGB y puedo verificar que la conversión parece aplicarse solo una vez, ya que los lineales 1/255, 2/255 y 3/255 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 bajos de color, realmente debería ser obvio si la transformación de color sRGB se aplica más de una vez.
Por lo tanto, todavía no he determinado qué es lo correcto. ¿glEnable(GL_FRAMEBUFFER_SRGB)
solo se aplica a los valores finales del framebuffer, en cuyo caso puedo simplemente configurar esto durante mi rutina de inicio GL y olvidarme de ello en lo sucesivo?
Bueno, aquí está la cosa. Cuando habilito 'GL_FRAMEBUFFER_SRGB' en la inicialización y no lo toco para siempre, incluso en el Intel HD 3000 en Windows, hará la transformación correcta. Es solo que parece requerir que se habilite para más de la ruta del código que en Nvidia. –
Lo que dice tiene mucho sentido que el formato sRGB de los buffers debe determinar si se escriben valores sRGB en ellos. Voy a probar esto para ver si esto se implementa correctamente, y definitivamente me permitirá obtener mucho más kilometraje de 8 bits por canal. Espero que el paso de resolución multimuestra también haga esto correctamente: me encontré con resultados de resolución de multimuestra incorrectos antes, pero puede que haya estado trabajando en el modo incorrecto en ese momento. (Consulte este tema en http://www.opengl.org/discussion_boards/showthread.php/165081-Multisample-resolve-is-not-gamma-correct-with-FBOs) –
¿Intel mantiene el controlador OpenGL para sus procesadores en Apple? máquinas? Tenía la impresión de que Apple lo había escrito todo (lo que, en mi experiencia, explicaría por qué su controlador AMD está tan plagado de errores). – Philip