Bonjour, j'ai un problème assez bizarre avec glReadPixels, je n'ai malheureusement pas mon code sous la main mais je vais essayer de décrire le problème de façon précise et si jamais ce n'est pas suffisant je pourrai poster mon code demain.

Ça fait pas mal de temps que j'utilise cette fonction pour faire des captures d’écran et jusqu’à présent je n'ai jamais eu de soucis. Récemment j'ai commence a travailler sur les heightmap, j'ai fais un shader en glsl pour recuperer le z du vertex courant et lui assigner une couleur correspondant a sa position par rapport a la camera. J'obtiens donc une bonne heightmap (j'ai vérifié en l'affichant a l’écran, tout est correct) mais lorsque je fais ensuite un glreadpixels pour sauvegarder les pixels et les exporter dans une bitmap, le quart superieur de l'image est décalé vers la droite. J'ai essaye plein de possibilités et tant que je n'utilise pas le z du vertex en entrée (dans mon vertex shader) tout fonctionne normalement et j'obtiens une image normale. Mais des que j'utilise le z du vertex pour déterminer sa couleur j'ai de nouveau ce problème de décalage (je re-précise que l'image s'affiche normalement a l’écran, le problème ne se manifeste qu'au niveau de la capture des pixels).

Voila un petit code d'exemple que j'ai fais de memoire :

vertex shader :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
varying vec4 couleur;
 
void main()
{
   float z = gl_Vertex.z;
 
   // traitements divers sur z, pour faire des tests j'ai simplifie au maximum 
   // en divisant simplement z par 3000 pour ne pas qu'il depasse 1
   // je me suis egalement assure qu'il ne soit pas negatif en le mettant a 0 le cas echeant
 
   couleur = vec4( z, z, z, 1 );
 
}
pixel shader :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
varying vec4 couleur;
void main()
{
   gl_FragColor = couleur;
}
et mon code (j'ai simplifie pour les tests) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
vector< unsigned char > vPixels;
vPixels.resize( 3 * 1280 * 1024 );
glReadPixels(0, 0, 1280, 1024, GL_BGR, GL_UNSIGNED_BYTE, &vPixels[0] ); // j'utilise GL_BGR car j'exporte ensuite les donnees dans une bitmap et ca lit les couleurs a l'envers
SaveBitmap("test.bmp", vPixels ); // fonction perso, ca m'etonnerais que le probleme vienne de la car je n'ai jamais eu de soucis avec
Je precise que ma CG n'est pas toute recente, c'est une geforce 7950 GT au cas ou le probleme viendrait de la.

Est-ce que quelqu'un a déjà rencontre ce type de problème ? Est-ce que ça pourrait venir d'un soucis avec glReadPixels qui ne se manifesterait que dans certaines conditions ? Merci.

EDIT : j'ai oublié de préciser que j'utilise opengl 1.4

EDIT 2 : Je précise également que j'appelle glPixelStorei(GL_PACK_ALIGNMENT, 1) avant de faire mon glReadPixel mais ça ne change rien.