OpenGL 如何创建并渲染到大于 window 的帧缓冲区?

OpenGL how to create, and render to, a framebuffer that's larger than the window?

我收集到我可以创建一个带有 Renderbuffer 和 Texture 附件的帧缓冲区,大小不限(显卡支持)。但是,当 glViewport 受到 GL_MAX_VIEWPORT_DIMS 的限制时,我如何实际绘制整个事物,它需要 至少 与 [=26] 一样大=],就我而言,并不大。 https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml

在我的用例中,我希望为点光源创建一个阴影立方体贴图,它的尺寸非常大。我的 window 是 1600x900。由于某些 post 处理影响渲染到四边形,这些四边形被下采样,我之前调用 glViewport 将大小设置为各种东西。

但是我不能让它比 window 大,所以我不能绘制到我的帧缓冲区的外部区域?

或者游戏在创建帧缓冲区时永远不会超过 window 的大小?

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

The maximum viewport dimensions must be greater than or equal to the larger of the visible dimensions of the display being rendered to (if a display exists), and the largest renderbuffer image which can be successfully created and attached to a framebuffer object [..]

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

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

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

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