2012-07-08 18 views
14

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?

Respuesta

17

Cuando GL_FRAMEBUFFER_SRGB está habilitado, todas las escrituras en una imagen con an sRGB image format supondrán que los colores de entrada (los colores que se escriben) están en un espacio de color lineal. Por lo tanto, los convertirá en el espacio de color sRGB.

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

En general, desea trabajar en un espacio de color lineal durante el mayor tiempo posible.Solo su render final, luego del post-procesamiento, debe involucrar el espacio de color sRGB. Por lo tanto, su framebuffer multimuestreado probablemente debería seguir siendo lineal (aunque debería darle una resolución más alta para sus colores para preservar 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

Eso es casi seguro que debido a la succión en la escritura de Intel controladores OpenGL. Si no está haciendo 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 le dieron una imagen sRGB para empezar (si está procesando el framebuffer predeterminado).

+1

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. –

+0

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) –

+0

¿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

Cuestiones relacionadas