OpenGL如何创建和渲染一个比窗口大的帧缓冲区?

时间:2015-04-13 04:46:23

标签: opengl

我认为我可以创建一个带有Renderbuffer和纹理附件的Framebuffer,无论我想要什么尺寸(卡都支持)。但是,当glViewport受到GL_MAX_VIEWPORT_DIMS的限制时,我怎么能实际绘制到整个事物,glViewport需要至少与窗口一样大,在我的情况下,并不大。 https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml

在我的用例中,我正在为点光源创建一个阴影立方体贴图,这是一个非常大的性感尺寸。我的窗口是1600x900。由于一些后处理影响渲染到四边形,这是下采样的,我以前调用{{1}},将大小设置为各种各样的东西。

但是我不能让它比窗口大,所以我不能画到我的Framebuffer的外面区域?

或者在创建帧缓冲区时游戏是否永远不会超过窗口大小?

1 个答案:

答案 0 :(得分:2)

规范中关于屏幕大小的语言只是实现需要支持的保证最小值的一部分。规范说:

  

最大视口尺寸必须大于或等于正在渲染的显示的可见尺寸(如果存在显示)中的较大者,以及可以成功创建并附加到帧缓冲对象的最大渲染缓冲图像[ ..]

这意味着GL_MAX_VIEWPORT_DIMS也至少与GL_MAX_RENDERBUFFER_SIZE一样大。该限制的保证最小值取决于版本。例如,OpenGL 3.3中为1024,OpenGL 4.5中为16,384。

如果您查询GL_MAX_VIEWPORT_DIMS,您通常会发现它比屏幕尺寸大得多。它与最大纹理大小相同是很常见的。因此,它通常不会阻止您渲染到您可以创建的任何纹理/渲染缓冲区。

在渲染到FBO之前,您需要确保使用FBO中渲染目标的大小调用glViewport()。请注意,视口大小不是FBO状态的一部分,因此在开始渲染到另一个帧缓冲区(FBO或默认帧缓冲区)之前,您必须每次执行

如果您启用了剪刀测试,则在切换到大于默认帧缓冲区的FBO时,还需要确保禁用它或更新剪刀矩形。