2016-04-11 1 views
0

J'ai un problème étrange où appeler glReadPixels semble changer les données des pixels lus. Je lis deux textures RGBA sur un framebuffer, qui sont utilisées pour encoder la position et la vitesse des particules. Pendant le débogage, j'utilise glReadPixels pour sortir les données de certains des pixels, et j'ai remarqué que mon système de particules se comportait différemment quand je les lisais.glReadPixels changer les données du tampon?

Le code incriminé est la suivante:

glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); 
glReadBuffer(GL_COLOR_ATTACHMENT0); 
GLfloat *pixels = new GLfloat[ width * height * 4]; 
glReadPixels(0, 0, width, height , GL_RGBA, GL_FLOAT, pixels); 
std::cout << "Position:  " << pixels[0] << " " << pixels[1] << " " << pixels[2] << " " << pixels[3] << std::endl; 
glReadBuffer(GL_COLOR_ATTACHMENT1); 
glReadPixels(0, 0, width, height, GL_RGBA, GL_FLOAT, pixels); 
std::cout << "Velocity:  " << pixels[0] << " " << pixels[1] << " " << pixels[2] << " " << pixels[3] << std::endl; 
delete pixels; 
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); 

Je lis de la fbo framebuffer, qui était auparavant lié et rendu comme un GL_DRAW_FRAMEBUFFER (si elle était non liée avant d'atteindre ce code).

La lecture d'un nombre de pixels plus grand ou plus petit a également un impact plus ou moins important sur les résultats du système de particules.

Qu'est-ce que je fais mal ici?

Répondre

0

Il s'est avéré que le problème n'était pas directement avec le code affiché. C'était juste un symptôme.

Cela avait à voir avec la façon dont je calculais le temps écoulé entre les images. Puisque j'ai calculé le temps écoulé dans la boucle après en lisant les pixels, je me retrouverais avec une grande valeur de temps initiale lors du calcul de la première image car la lecture des pixels est coûteuse. Obtenir une valeur initiale élevée a un impact important sur mes résultats. Cela a aussi du sens, car la lecture d'un plus grand nombre de pixels élimine plus de choses (parce que cela prend plus de temps).

Le calcul du temps écoulé avant que ce point dans le code résout le problème. Le problème pourrait également être évité en ne lisant pas les valeurs de pixel sur la première image.