4

我想确定帧缓冲区对象的大小(宽度、高度)。

我通过创建了一个帧缓冲区对象

// create the FBO. 
glGenFramebuffers(1, &fboId);

仅给定帧缓冲区对象 id ( ),如何获取第一个颜色附件的大小fboId?这是可能的还是我必须将颜色附件的大小存储在外部变量中以便以后知道 FBO 的大小?

4

1 回答 1

19

您的问题有些困惑,因为您要求两种不同的东西。

这是一个简单的问题:

仅给定帧缓冲区对象 id (fboId),如何获取第一个颜色附件的大小?

这很简单:获取附加到该附件的纹理/渲染缓冲区,获取附加的 mipmap 级别和数组层,然后查询纹理/渲染缓冲区的大小。

前两个步骤是使用glGetFramebufferAttachmentParameter(注意关键字“附件”)完成的GL_COLOR_ATTACHMENT0。您查询GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE以获取它是渲染缓冲区还是纹理。您可以使用GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME.

如果对象是渲染缓冲区,则可以绑定渲染缓冲区并用于glGetRenderbufferParameter获取渲染缓冲区GL_RENDERBUFFER_WIDTHGL_RENDERBUFFER_HEIGHT.

如果对象是纹理,则需要做更多的工作。您需要查询附件参数GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL以获取 mipmap 级别。

当然,现在你需要知道如何绑定它。如果您使用的是 4.4 之前的 OpenGL 版本或没有某些扩展,那么这很复杂。看,您需要知道要使用哪种纹理目标类型。虽然这看起来很愚蠢和烦人,但仅从纹理对象名称来确定目标的唯一方法是……尝试一切。遍历每个目标并检查glGetErrorGL_INVALID_OPERATION 没有返回的那个是正确的。

如果您有可用的 GL 4.4 或ARB_multi_bind,则可以使用glBindTextures(注意“s”),这不需要您指定目标。如果您有 4.5 或ARB_direct_state_access,则根本不需要绑定纹理。DSA 风格的函数不需要纹理目标,它还提供了glBindTextureUnit将纹理绑定到其自然内部目标的 。

一旦你绑定了纹理并且它是 mipmap 级别,你就可以glGetTexLevelParameter用来查询那个级别的GL_TEXTURE_WIDTHand GL_TEXTURE_HEIGHT

现在,这是一个简单的问题。难题是您的标题要求什么:

我想确定帧缓冲区对象的大小(宽度、高度)。

FBO 的可渲染区域的大小GL_COLOR_ATTACHMENT0. FBO 的可渲染区域是附加到 FBO 的所有图像的所有尺寸的交集。

除非你对这个 FBO 有特殊的了解,否则你不能假设 FBO 只包含一个图像或者所有的图像都具有相同的大小(如果你对 FBO 有特殊的了解,那么坦率地说你应该有特殊的知道它有多大)。因此,您需要对每个附件重复上述过程(如果类型为GL_NONE,则不附加任何内容)。然后取返回值的交集(即:最小的宽度和高度)。

一般来说,您不必询问您创建的 FBO 有多大。就像你不必问纹理它们有多大一样。你创造了它们;根据定义,您知道它们有多大。您将它们放在 FBO 中,因此您再次知道它有多大。

于 2013-03-03T13:53:38.810 回答