OpenGL如何创建和渲染';它比窗户大吗?

OpenGL如何创建和渲染';它比窗户大吗?,opengl,Opengl,我想我可以创建一个带有Renderbuffer和纹理附件的帧缓冲区,大小可以任意(卡支持)。然而,当glViewport受到GL\u MAX\u VIEWPORT\u DIMS的限制时,我如何才能真正画出整个画面,它至少需要与窗口一样大,在我的情况下,也不需要更大 在我的用例中,我希望为一个点光源创建一个阴影立方体贴图,这个点光源的尺寸非常大。我的窗户是1600x900。由于一些渲染到四边形的后处理影响(下采样),我以前调用了glViewport,将大小设置为各种各样的内容 但是我不能使它比窗口

我想我可以创建一个带有Renderbuffer和纹理附件的帧缓冲区,大小可以任意(卡支持)。然而,当
glViewport
受到
GL\u MAX\u VIEWPORT\u DIMS
的限制时,我如何才能真正画出整个画面,它至少需要与窗口一样大,在我的情况下,也不需要更大

在我的用例中,我希望为一个点光源创建一个阴影立方体贴图,这个点光源的尺寸非常大。我的窗户是1600x900。由于一些渲染到四边形的后处理影响(下采样),我以前调用了
glViewport
,将大小设置为各种各样的内容

但是我不能使它比窗口大,所以我不能画到帧缓冲区的外部区域


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

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

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

这意味着
GL\u MAX\u VIEWPORT\u DIMS
也将至少与
GL\u MAX\u RENDERBUFFER\u SIZE
一样大。该限制的保证最小值取决于版本。例如OpenGL3.3中的1024和OpenGL4.5中的16384

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

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


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

glGet()
for
GL\u MAX\u VIEWPORT\u DIMS
为您提供1600x900?这是什么样的装置?这似乎很不寻常。它通常类似于最大纹理大小。在较新的设备上类似4096x4096或8192x8192的东西。@RetoKoradi它几乎肯定不是我的卡。我正在使用AMD Radeon HD 7980和最新的驱动程序。我正在我的应用程序中运行OpenGL4。这张卡(查询OpenGL)的最大tex大小是16384,当您查询
GL\u Max\u VIEWPORT\u DIMS
时,您真的会得到1600x900?您知道,我做了一个假设。不,
GLGETINGERV
也给了我16384。但我已经仔细检查过了,在我将其设置为帧缓冲区大小后,没有其他glViewport调用……而且它不会渲染到整个FBO?不知道你的案子到底发生了什么。我在下面的答案中解释了它的行为。砰,问题出在
glScissor
上。在我设置OpenGL上下文等的课程中,我正在
glEnable
ing
GL_剪刀测试
并将其设置为我的视口大小。再次感谢您的帮助@RetoKoradi,我相信您已经回答了我之前的问题。