aho*_*fer 1 opengl glreadpixels cimg
我希望捕获我在openGL中渲染的图像.我使用glReadPixels,然后使用CImg保存图像.不幸的是,结果是错误的.见下文.左边的图像是正确的.我用GadWin PrintScreen捕获了它.右侧的图像不正确.我用glReadPixels和CImg创建了它:

我已经做了很多关于可能出错的网络研究,但是我没有办法去追求.这里捕获图像的代码:
void snapshot() {
int width = glutGet(GLUT_WINDOW_WIDTH);
int height = glutGet(GLUT_WINDOW_HEIGHT);
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
int bytes = width*height*3; //Color space is RGB
GLubyte *buffer = (GLubyte *)malloc(bytes);
glFinish();
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer);
glFinish();
CImg<GLubyte> img(buffer,width,height,1,3,false);
img.save("ScreenShot.ppm");
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
这是我调用快照方法的地方:
void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawIndividual(0);
snapshot();
glutSwapBuffers();
}
Run Code Online (Sandbox Code Playgroud)
跟进评论,我抓住了位深度并打印到控制台.结果如下:
redbits=8
greenbits=8
bluebits=8
depthbits=24
Run Code Online (Sandbox Code Playgroud)
你清楚地从帧缓冲区获取图像,但行长似乎是关闭的.您设置打包对齐(好),但有更多可设置的参数:
将它们设置为0以进行紧密包装.glReadPixels()之后的glFinish()也是超级的.glReadPixels不能异步工作 - 只有在将读取数据复制到目标缓冲区后才会返回(或者在写入PBO的情况下,从PBO获取数据将等待操作完成).