0

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


情况可视化:

原始图像如下所示(3200x2000): 在此处输入图像描述

OpenGLView 看起来像这样(940x560): 在此处输入图像描述

保存的图像看起来像这样(3200x2000): 在此处输入图像描述

4

2 回答 2

4

所以你正在渲染到窗口。嗯,窗口有一个特定的大小。除了那个大小之外,什么都不存在。

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

这是帧缓冲区对象存在的原因之一:这样您就可以在窗口大小之外进行渲染。尽管被告知:有一个最大视口大小限制。

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

于 2012-08-01T08:22:52.650 回答
1

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

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

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

编辑#1:

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

https://github.com/glman74/simpleFBO

于 2012-08-01T07:18:17.723 回答