¿Por qué el uso de glReadBuffer / glReadPixels devuelve una imagen negra en las tarjetas Intel?

8

Tengo esta pieza de codigo

glReadBuffer( GL_FRONT );
glReadPixels( 0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer ); 

Que funciona perfectamente en todas las GPU Nvidia y AMD que he probado, pero falla en casi todos los videos integrados de Intel que he probado. Realmente funciona en un viejo 945GME, pero falla en todos los demás. En lugar de obtener una captura de pantalla, en realidad obtengo una pantalla negra.

Si ayuda, estoy trabajando con Doom3 Engine, y ese código se deriva del código de captura de pantalla incorporado. Por cierto, incluso con el juego original, no puedo hacer capturas de pantalla en esos dispositivos Intel de todos modos. Supongo que no están implementando el estándar correctamente o algo así. ¿Hay una solución para esto?

Cloudraven
fuente
1
¿Puede darnos algunos ejemplos específicos de conjuntos de chips de video integrados de Intel que fallan? Solo para que todos estemos seguros de que estamos hablando de lo mismo. (Por cierto, mi código se parece mucho al suyo)
Trevor Powell
Estaba usando Intel 945,965, GMA HD y ninguno de ellos funcionó. Estaban en algunas inspiraciones 1525, otra de un inspiron 1764. El que sí funcionó fue un Intel 950 muy antiguo de un Acer Aspire One 110L. ¿Pudiste arreglarlo?
cloudraven
3
¿Quizás necesita leer desde el búfer GL_BACK? Las páginas de manual de OpenGL dicen que ese es el valor predeterminado para el modo de doble búfer. Pero como referencia, el código anterior (con GL_FRONT o GL_BACK) funcionó en mi tarjeta Intel HD.
QuasarDonkey
Lo intentaré mañana. Es extraño, ¿no se supone que eso es un comportamiento indefinido? Bueno, puedo hacer que suceda solo en las tarjetas de inteligencia.
cloudraven
Cloudraven, verificaría RB_ExecuteBackEndCommands de tr_backend.cpp para los casos en que el backbuffer se puede borrar antes de su llamada de ReadPixels.
Jing

Respuestas:

4

Históricamente, los gráficos de Intel siempre han tenido problemas para leer o dibujar desde el búfer frontal. Una buena regla general que sigo con Intel es esta: si no puede hacerlo en D3D, entonces ni siquiera intente hacerlo en OpenGL, incluso si la especificación dice que debería poder hacerlo, y D3D no permite el acceso al búfer frontal de esta manera, así que ... solo usa GL_BACK en su lugar.

Maximus Minimus
fuente
Sí, preferiría usar GL_BACK, pero GL_FRONT. Es solo que GL_BACK no funciona. Curiosamente, GL_FRONT parece funcionar, pero no lo he probado a fondo.
cloudraven