Warum gibt die Verwendung von glReadBuffer / glReadPixels auf Intel-Karten ein schwarzes Bild zurück?

8

Ich habe diesen Code

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

Das funktioniert perfekt in allen Nvidia- und AMD-GPUs, die ich ausprobiert habe, aber es schlägt in fast jedem einzelnen integrierten Intel-Video fehl, das ich ausprobiert habe. Es funktioniert tatsächlich in einem sehr alten 945GME, schlägt aber in allen anderen fehl. Anstatt einen Screenshot zu bekommen, bekomme ich tatsächlich einen schwarzen Bildschirm.

Wenn es hilft, arbeite ich mit der Doom3-Engine, und dieser Code wird aus dem integrierten Bildschirmaufnahmecode abgeleitet. Übrigens, selbst mit dem Originalspiel kann ich auf diesen Intel-Geräten sowieso keine Bildschirmaufnahme machen. Ich vermute, dass sie den Standard nicht richtig implementieren oder so. Gibt es eine Problemumgehung dafür?

Wolkenraben
quelle
1
Können Sie uns einige konkrete Beispiele für integrierte Intel-Video-Chipsätze nennen, die ausfallen? Nur damit wir alle sicher sind, dass wir über dasselbe reden. (Mein Code sieht übrigens Ihrem sehr ähnlich)
Trevor Powell
Ich habe Intel 945.965, GMA HD verwendet und keiner von beiden hat funktioniert. Sie befanden sich in einigen Inspirons 1525, einem anderen aus einem Inspiron 1764. Derjenige, der funktionierte, war ein sehr alter Intel 950 aus einem Acer Aspire One 110L. Konnten Sie das Problem beheben?
Cloudraven
3
Vielleicht müssen Sie aus dem GL_BACK-Puffer lesen? Die OpenGL-Manpages geben an, dass dies die Standardeinstellung für den doppelt gepufferten Modus ist. Als Referenz funktionierte der obige Code (mit GL_FRONT oder GL_BACK) auf meiner Intel HD-Karte.
QuasarDonkey
Ich werde das morgen versuchen. Es ist seltsam, soll das nicht undefiniertes Verhalten sein? Nun, ich kann es nur auf Intel-Karten schaffen.
Cloudraven
Cloudraven, ich würde RB_ExecuteBackEndCommands von tr_backend.cpp auf Fälle überprüfen, in denen der Backbuffer vor dem Aufruf von ReadPixels gelöscht werden könnte.
Jing

Antworten:

4

Intel-Grafiken hatten in der Vergangenheit immer Probleme beim Lesen oder Zeichnen aus dem Frontpuffer. Eine gute Faustregel, die ich bei Intel befolge, lautet: Wenn Sie dies in D3D nicht können, versuchen Sie es nicht einmal in OpenGL, auch wenn die Spezifikation besagt, dass Sie dazu in der Lage sein sollten - und D3D nicht Ermöglichen Sie auf diese Weise den Zugriff auf den Frontpuffer. Verwenden Sie stattdessen einfach GL_BACK.

Maximus Minimus
quelle
Ja, ich würde lieber GL_BACK verwenden, aber GL_FRONT. Es ist nur so, dass GL_BACK nicht funktioniert. Komischerweise scheint GL_FRONT zu funktionieren, aber ich habe es nicht gründlich getestet.
Cloudraven