Por que usar glReadBuffer / glReadPixels retorna uma imagem preta nas placas Intel?

8

Eu tenho esse pedaço de código

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

O que funciona perfeitamente em todas as GPUs da Nvidia e AMD que eu tentei, mas falha em quase todos os vídeos integrados da Intel que eu tentei. Na verdade, ele funciona em um 945GME muito antigo, mas falha em todos os outros. Em vez de obter uma captura de tela, estou recebendo uma tela preta.

Se ajudar, estou trabalhando com o Doom3 Engine e esse código é derivado do código de captura de tela embutido. A propósito, mesmo com o jogo original, não posso capturar a tela nesses dispositivos intel. Meu palpite é que eles não estão implementando o padrão corretamente ou algo assim. Existe uma solução alternativa para isso?

cloudraven
fonte
11
Você pode nos dar alguns exemplos específicos de chipsets de vídeo integrados da Intel que falham? Só para ter certeza de que estamos falando da mesma coisa. (Meu código parece muito com o seu, aliás)
Trevor Powell
Eu estava usando o Intel 945.965, GMA HD e nenhum deles funcionou. Eles estavam em alguns inspirons 1525, outro em um inspiron 1764. O que funcionou foi um Intel 950 muito antigo de um Acer Aspire One 110L. Você conseguiu consertar?
cloudraven
3
Talvez você precise ler o buffer GL_BACK? As páginas de manual do OpenGL dizem que esse é o padrão para o modo de buffer duplo. Mas, para referência, o código acima (com GL_FRONT ou GL_BACK) funcionou na minha placa Intel HD.
QuasarDonkey
Vou tentar isso amanhã. É estranho, isso não deveria ser um comportamento indefinido? Bem, eu posso fazer isso acontecer apenas em placas intel.
cloudraven
Cloudraven, eu verificaria RB_ExecuteBackEndCommands do tr_backend.cpp para os casos em que o backbuffer pode ser limpo antes da sua chamada de ReadPixels.
Jing

Respostas:

4

Os gráficos da Intel sempre tiveram problemas com a leitura ou o desenho do buffer frontal. Uma boa regra geral que sigo com a Intel é esta - se você não pode fazê-lo no D3D, nem tente fazê-lo no OpenGL, mesmo que as especificações digam que você deve ser capaz - e o D3D não permita acesso ao buffer frontal dessa maneira, então ... basta usar GL_BACK.

Maximus Minimus
fonte
Sim, eu preferiria usar GL_BACK, mas GL_FRONT. É que GL_BACK não funciona. Engraçado o bastante, o GL_FRONT parece funcionar, mas eu não o testei completamente.
cloudraven