我正在渲染到OpenGL屏幕外的帧缓冲对象,并喜欢将其保存为图像。请注意, FBO 大于显示尺寸。我可以渲染到屏幕外缓冲区并将其用作纹理,这是有效的。我可以使用偏移量在显示屏上“滚动”这个更大的纹理,这让我有信心,我渲染到比窗口更大的上下文。
如果我将屏幕外缓冲区保存到图像文件,它总是会被裁剪。保存的代码片段是:
void ofFBOTexture::saveImage(string fileName) {
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
// get the raw buffer from ofImage
unsigned char* pixels = imageSaver.getPixels();
glReadPixels(0, 0, 1024, 1024, GL_RGB, GL_UNSIGNED_BYTE, pixels);
imageSaver.saveImage(fileName);
}
请注意,图像内容被裁剪,可见部分保存正确(这意味着像素格式没有错误,GL_RGB问题等),但剩余空间用一种颜色填充。
所以,我的问题是 - 我做错了什么?
答案 0 :(得分:11)
最后我解决了这个问题。
我必须激活fbo以保存其内容:
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
// save code
...
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
虽然只通过
选择glReadPixels
的fbo
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
不够。
(所有其他正确和经过测试的东西,例如视口大小,缓冲区的宽度和高度,图像纹理等。)
答案 1 :(得分:0)
要开始的两个问题:如何创建imageSaver并且您确定宽度和高度是否正确(例如,您是否尝试保存1024 x 1024图像?您获得的尺寸是多少?)
答案 2 :(得分:0)
你没有做错任何事情,这在很长一段时间内一直是OpenGL图形驱动程序的常见行为 - 我记得至少在十年前在nVidia Geforce 3卡上遇到了完全相同的问题,我采用了类似的解决方案 - 渲染到屏幕外纹理。
答案 3 :(得分:0)
这听起来像你有错误的视口大小或类似的东西。