我想屏幕从已在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。任何帮助或建议表示赞赏。
答案 0 :(得分:2)
该代码最后错过了free(buffer)
,因此每次重绘都会消耗越来越多的内存,直到进程耗尽内存和/或地址空间(后者仅在32位系统上,因为64在合理的时间内,很少有地址空间用于小额分配。)
答案 1 :(得分:1)
让我重新解释这个半翘起的答案。我认为堆正在被删除,可能是由于缺少 free()和连续分配,可能是glReadPixels覆盖了你的目标缓冲区。
大多数帧缓冲区至少是32位/双字对齐,这表明,正如这里的评论所说,w * h * 4字节可能只是与内部表示匹配。
将对齐设置为1个字节(就像另一个答案所说)对我来说似乎也很好。
答案 2 :(得分:1)
在调用glReadPixels之前尝试glPixelStorei(GL_PACK_ALIGNMENT, 1);
。