glReadPixels - 图像看起来很抖动

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)

dat*_*olf 5

你清楚地从帧缓冲区获取图像,但行长似乎是关闭的.您设置打包对齐(好),但有更多可设置的参数:

  • GL_PACK_ROW_LENGTH
  • GL_PACK_SKIP_PIXELS
  • GL_PACK_SKIP_ROWS

将它们设置为0以进行紧密包装.glReadPixels()之后的glFinish()也是超级的.glReadPixels不能异步工作 - 只有在将读取数据复制到目标缓冲区后才会返回(或者在写入PBO的情况下,从PBO获取数据将等待操作完成).