I am using a barebones OpenGL app without a display. I am just using glReadPixels to get the rendered image.
I am dumping the result of glReadPixels after each frame is drawn, but the problem is that every other frame is completely black. This is fixed if I call glClear twice before drawing anything. Can anyone tell me what’s causing this problem? Thanks.
Source [runs in linux]:
#include <stdio.h>
#include <stdlib.h>
#include<X11/X.h>
#include<X11/Xlib.h>
#include<GL/gl.h>
#include<GL/glx.h>
#include<GL/glu.h>
Display *dpy;
Window root;
GLint att[] = { GLX_RGBA, true, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None };
XVisualInfo *vi;
GLXContext glc;
GLsizei width = 24;
GLsizei height =24;
GLfloat aspect = (float)width/height;
GLubyte *pixels;
void setup()
{
dpy = XOpenDisplay(NULL);
if ( !dpy ) {
printf("
cannot connect to X server
");
exit(0);
}
root = DefaultRootWindow(dpy);
vi = glXChooseVisual(dpy, 0, att);
if (!vi) {
printf("
no appropriate visual found
");
exit(0);
}
glc = glXCreateContext(dpy, vi, NULL, GL_TRUE);
glXMakeCurrent(dpy, root, glc);
printf("vendor: %s
", (const char*)glGetString(GL_VENDOR));
pixels = new GLubyte[3*(width+1)*(height+1)+3];
glViewport(0,0,width,height);
}
void draw()
{
float degrees = 0;
// Render some frames
for (int i=0; i<4; i++)
{
glClear(GL_COLOR_BUFFER_BIT);
//glClear(GL_COLOR_BUFFER_BIT); // uncommenting this fixes the problem...
// Set Projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, aspect, 0.1,1000);
// Set ModelView
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-3);
glRotatef(degrees,0,0,1);
// draw Square
glBegin(GL_QUADS);
glVertex3d(0,1,0);
glVertex3d(1,0,0);
glVertex3d(0,-1,0);
glVertex3d(-1,0,0);
glEnd();
// get pixels
glReadPixels(0,0,width,height,GL_RGB,GL_UNSIGNED_BYTE,(void*)pixels);
// print buffer to terminal using ascii characters
int count = 0;
for(int y=0;y<height;y++)
{
for(int x=0;x<width;x++)
printf("%02x", pixels[count+=3] & 0xFF);
puts("");
}
puts("");
// increase rotation
degrees += 10;
}
}
int main(int argc, const char* argv[]){
setup();
draw();
return 0;
}
Output:
Notice that every other frame is completely black.
vendor: NVIDIA Corporation
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
0000000000000000000000ffff0000000000000000000000
00000000000000000000ffffffff00000000000000000000
0000000000000000ffffffffffffff000000000000000000
00000000000000ffffffffffffffff000000000000000000
000000000000ffffffffffffffffffff0000000000000000
00000000ffffffffffffffffffffffffff00000000000000
000000ffffffffffffffffffffffffffffff000000000000
0000ffffffffffffffffffffffffffffffff000000000000
0000ffffffffffffffffffffffffffffffffff0000000000
000000ffffffffffffffffffffffffffffffffff00000000
00000000ffffffffffffffffffffffffffffffff00000000
00000000ffffffffffffffffffffffffffffff0000000000
0000000000ffffffffffffffffffffffffff000000000000
000000000000ffffffffffffffffffff0000000000000000
00000000000000ffffffffffffffff000000000000000000
00000000000000ffffffffffffff00000000000000000000
0000000000000000ffffffff000000000000000000000000
000000000000000000ffff00000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
00000000000000000000000000ffffff0000000000000000
000000000000000000ffffffffffffff0000000000000000
0000000000ffffffffffffffffffffffff00000000000000
000000ffffffffffffffffffffffffffff00000000000000
000000ffffffffffffffffffffffffffff00000000000000
000000ffffffffffffffffffffffffffff00000000000000
00000000ffffffffffffffffffffffffffff000000000000
00000000ffffffffffffffffffffffffffff000000000000
00000000ffffffffffffffffffffffffffff000000000000
00000000ffffffffffffffffffffffffffff000000000000
0000000000ffffffffffffffffffffffffffff0000000000
0000000000ffffffffffffffffffffffffffff0000000000
0000000000ffffffffffffffffffffffffffff0000000000
0000000000ffffffffffffffffffffffff00000000000000
000000000000ffffffffffffff0000000000000000000000
000000000000ffffff000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
Output after adding two glClear calls before drawing:
vendor: NVIDIA Corporation
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
00000000000000000000ffff000000000000000000000000
000000000000000000ffffffff0000000000000000000000
0000000000000000ffffffffffff00000000000000000000
00000000000000ffffffffffffffff000000000000000000
000000000000ffffffffffffffffffff0000000000000000
0000000000ffffffffffffffffffffffff00000000000000
00000000ffffffffffffffffffffffffffff000000000000
000000ffffffffffffffffffffffffffffffff0000000000
0000ffffffffffffffffffffffffffffffffffff00000000
0000ffffffffffffffffffffffffffffffffffff00000000
000000ffffffffffffffffffffffffffffffff0000000000
00000000ffffffffffffffffffffffffffff000000000000
0000000000ffffffffffffffffffffffff00000000000000
000000000000ffffffffffffffffffff0000000000000000
00000000000000ffffffffffffffff000000000000000000
0000000000000000ffffffffffff00000000000000000000
000000000000000000ffffffff0000000000000000000000
00000000000000000000ffff000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
0000000000000000000000ffff0000000000000000000000
00000000000000000000ffffffff00000000000000000000
0000000000000000ffffffffffffff000000000000000000
00000000000000ffffffffffffffff000000000000000000
000000000000ffffffffffffffffffff0000000000000000
00000000ffffffffffffffffffffffffff00000000000000
000000ffffffffffffffffffffffffffffff000000000000
0000ffffffffffffffffffffffffffffffff000000000000
0000ffffffffffffffffffffffffffffffffff0000000000
000000ffffffffffffffffffffffffffffffffff00000000
00000000ffffffffffffffffffffffffffffffff00000000
00000000ffffffffffffffffffffffffffffff0000000000
0000000000ffffffffffffffffffffffffff000000000000
000000000000ffffffffffffffffffff0000000000000000
00000000000000ffffffffffffffff000000000000000000
00000000000000ffffffffffffff00000000000000000000
0000000000000000ffffffff000000000000000000000000
000000000000000000ffff00000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
00000000000000000000000000ffff000000000000000000
0000000000000000000000ffffffff000000000000000000
000000000000000000ffffffffffffff0000000000000000
00000000000000ffffffffffffffffff0000000000000000
00000000ffffffffffffffffffffffff0000000000000000
0000ffffffffffffffffffffffffffffff00000000000000
0000ffffffffffffffffffffffffffffff00000000000000
000000ffffffffffffffffffffffffffffff000000000000
000000ffffffffffffffffffffffffffffff000000000000
00000000ffffffffffffffffffffffffffffff0000000000
00000000ffffffffffffffffffffffffffffff0000000000
0000000000ffffffffffffffffffffffffffffff00000000
0000000000ffffffffffffffffffffffffffffff00000000
000000000000ffffffffffffffffffffffff000000000000
000000000000ffffffffffffffffff000000000000000000
000000000000ffffffffffffff0000000000000000000000
00000000000000ffffffff00000000000000000000000000
00000000000000ffff000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
00000000000000000000000000ffffff0000000000000000
000000000000000000ffffffffffffff0000000000000000
0000000000ffffffffffffffffffffffff00000000000000
000000ffffffffffffffffffffffffffff00000000000000
000000ffffffffffffffffffffffffffff00000000000000
000000ffffffffffffffffffffffffffff00000000000000
00000000ffffffffffffffffffffffffffff000000000000
00000000ffffffffffffffffffffffffffff000000000000
00000000ffffffffffffffffffffffffffff000000000000
00000000ffffffffffffffffffffffffffff000000000000
0000000000ffffffffffffffffffffffffffff0000000000
0000000000ffffffffffffffffffffffffffff0000000000
0000000000ffffffffffffffffffffffffffff0000000000
0000000000ffffffffffffffffffffffff00000000000000
000000000000ffffffffffffff0000000000000000000000
000000000000ffffff000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000