glReadPixels读取“帧外”区域

时间:2012-08-01 07:04:34

标签: objective-c opengl glreadpixels off-screen

我绘制OpenGL 3200x2000尺寸纹理四边形。 OpenGLView框架大小设置为940x560。它应该绘制四边形。发髻当我尝试将其保存为图像(使用glReadPixels)并将glReadPixels区域设置为(0,0)到(3200,2000)。它创建像素数据3200x2000,但当我将其保存到文件时,我看到小图像部分(从左下角940x560),整个其他区域是黑色。那么如何阅读屏幕外区域呢?我尝试使用Framebuffer,但它非常复杂,创建它时出错等等......还有其他解决方案吗?


情境可视化:

原始图像看起来像这样(3200x2000): enter image description here

OpenGLView看起来像这样(940x560): enter image description here

保存的图像看起来像那样(3200x2000): enter image description here

2 个答案:

答案 0 :(得分:4)

所以你要渲染到窗口。嗯,窗户有一个特定的大小。并且之外没有任何东西存在。

这是OpenGL称之为“像素所有权测试”的一部分。如果像素不属于上下文,则其内容未定义。窗口外的像素不属于上下文,因此其内容未定义。

这是framebuffer objects存在的一个原因:这样您就可以渲染窗口大小。虽然有人建议:最大视口大小限制。

或者,您可以渲染屏幕大小的片段,在每次渲染后下载每个片段,然后移动相机以渲染下一个片段。

答案 1 :(得分:1)

您在代码或平台方面没有提供太多细节。

但我认为您应该使用屏幕外渲染,而不仅仅是从渲染窗口中读取。如果您不熟悉使用帧缓冲区对象,这里有一个最小的例子:

https://github.com/datenwolf/codesamples/tree/master/samples/OpenGL/minimalfbo

编辑#1:

由于OP提到该平台是OS X,我在下面发布我的代码,这显示了iOS中最小的FBO示例:

https://github.com/glman74/simpleFBO