Pourquoi l'utilisation de glReadBuffer / glReadPixels renvoie une image noire sur les cartes Intel?

8

J'ai ce morceau de code

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

Ce qui fonctionne parfaitement dans tous les GPU Nvidia et AMD que j'ai essayés, mais il échoue dans presque toutes les vidéos intégrées Intel que j'ai essayées. Il fonctionne en fait dans un très ancien 945GME, mais échoue dans tous les autres. Au lieu d'obtenir une capture d'écran, j'obtiens en fait un écran noir.

Si cela aide, je travaille avec le moteur Doom3 et ce code est dérivé du code de capture d'écran intégré. Soit dit en passant, même avec le jeu d'origine, je ne peux pas faire de capture d'écran sur ces appareils Intel de toute façon. Je suppose qu'ils n'implémentent pas correctement la norme ou quelque chose. Y a-t-il une solution à cela?

cloudraven
la source
1
Pouvez-vous nous donner quelques exemples spécifiques de chipsets vidéo intégrés Intel qui échouent? Juste pour que nous soyons tous sûrs que nous parlons de la même chose. (Mon code ressemble beaucoup au vôtre, d'ailleurs)
Trevor Powell
J'utilisais Intel 945 965, GMA HD et aucun d'eux ne fonctionnait. Ils étaient dans certains inspirons 1525, un autre d'un inspiron 1764. Celui qui a fonctionné était un très ancien Intel 950 d'un Acer Aspire One 110L. Avez-vous pu y remédier?
cloudraven
3
Peut-être avez-vous besoin de lire à partir du tampon GL_BACK? Les pages de manuel OpenGL indiquent que c'est la valeur par défaut pour le mode à double tampon. Mais pour référence, le code ci-dessus (avec GL_FRONT ou GL_BACK) fonctionnait sur ma carte Intel HD.
QuasarDonkey
Je vais essayer ça demain. C'est étrange, n'est-ce pas censé être un comportement indéfini? Eh bien, je ne peux y arriver que sur des cartes Intel.
cloudraven
Cloudraven, je vérifierais RB_ExecuteBackEndCommands de tr_backend.cpp pour les cas où le backbuffer peut être effacé avant votre appel de ReadPixels.
Jing

Réponses:

4

Les graphiques Intel ont toujours eu des problèmes de lecture ou de dessin dans le tampon avant. Une bonne règle d'or avec Intel est la suivante: si vous ne pouvez pas le faire dans D3D, n'essayez même pas de le faire dans OpenGL, même si la spécification dit que vous devriez pouvoir le faire - et D3D ne le fait pas autorisez l'accès au tampon frontal de cette manière, alors ... utilisez simplement GL_BACK à la place.

Maximus Minimus
la source
Oui, je préférerais utiliser GL_BACK, mais GL_FRONT. C'est juste que GL_BACK ne fonctionne pas. Assez drôle, GL_FRONT semble fonctionner, mais je ne l'ai pas testé à fond.
cloudraven