【问题标题】:OpenGL how to create, and render to, a framebuffer that's larger than the window?OpenGL如何创建和渲染比窗口大的帧缓冲区?
【发布时间】:2015-06-18 07:57:24
【问题描述】:

我收集到我可以创建一个带有渲染缓冲区和纹理附件的帧缓冲区,大小为我想要的任何大小(卡支持)。但是,当glViewport 受到GL_MAX_VIEWPORT_DIMS 的限制时,我如何才能真正绘制到整个东西,GL_MAX_VIEWPORT_DIMS 需要至少与窗口一样大,并且在我的情况下,不会更大. https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml

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

但我不能让它比窗口大,所以我永远无法绘制到帧缓冲区的外部区域?

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

【问题讨论】:

  • glGet() for GL_MAX_VIEWPORT_DIMS 给你 1600x900?这是什么设备?这似乎很不寻常。它通常类似于最大纹理大小。在较新的设备上类似 4096x4096 或 8192x8192。
  • @RetoKoradi 这几乎肯定不是我的卡。我正在使用带有最新驱动程序的 AMD Radeon HD 7980。我在我的应用程序中运行 OpenGL 4。此卡的最大 tex 大小(查询 OpenGL)为 16384
  • 当你查询GL_MAX_VIEWPORT_DIMS时你真的得到了1600x900?
  • 你知道,我做了一个假设。不,glGetIntergerv 也给了我 16384。但是我已经仔细检查过,在我将它设置为我的帧缓冲区的大小后,没有其他 glViewport 调用......
  • 它没有渲染到整个FBO?不确定您的情况到底是怎么回事。我在下面的答案中解释了它应该如何表现。

标签: opengl


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • Bam,glScissor 是问题所在。在我设置 OpenGL 上下文等的课程中,我是 glEnableing GL_SCISSOR_TEST 并将其设置为我的视口大小。再次感谢您的帮助@RetoKoradi,我相信您已经回答了我以前的问题。
猜你喜欢
  • 2013-05-25
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多