2

我想从 OpenGL 中渲染的 GLUT 窗口中截取图像。在显示回调的一侧,我插入了以下代码:

display() {
        drawTriangle(); //Renders the image
        if(shouldDisplay) {
            shouldDisplay=0;
            bytes = width*height*3; //Color space is RGB
            buffer = (GLubyte *)malloc(bytes); //buffer is global var for now
                glFinish();
            glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer);

        }
        glutSwapBuffers();
    }

此代码运行后,malloc 开始失败。它因 ENOMEM 失败,错误 12。我对操作系统或 GLUT 了解不足,无法理解为什么会发生这种情况。我只是想在一台 3 GB 的机器上分配 17K。我正在使用 Windows XP 和 Visual Studio C++ 2010 Express。任何帮助或建议表示赞赏。

4

3 回答 3

2

该代码最后错过了 a free(buffer),因此每次重绘都会消耗越来越多的内存,直到进程耗尽内存和/或地址空间(后者仅在 32 位系统上,因为 64 位地址空间几乎不会耗尽在合理的时间内分配少量)。

于 2011-07-30T17:07:44.193 回答
1

让我改写这个半吊子的答案。我认为堆正在被丢弃,可能是由于缺少free() 而连续分配可能是由于 glReadPixels 覆盖了您的目标缓冲区。

大多数帧缓冲区至少是 32 位/双字对齐的,这表明,正如这里的评论所说,w*h*4 字节可能只是工作,因为它与内部表示匹配。

将对齐设置为 1 个字节(就像另一个答案所说)对我来说也很好。

于 2011-07-30T16:46:07.750 回答
1

glPixelStorei(GL_PACK_ALIGNMENT, 1);在调用 glReadPixels 之前尝试。

于 2011-07-30T16:54:21.993 回答