如何仅给定相应的id来确定GL帧缓冲对象的宽度和高度

时间:2013-02-28 16:40:42

标签: c++ opengl opengl-3

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

我通过

创建了一个帧缓冲对象
// create the FBO. 
glGenFramebuffers(1, &fboId);

如果仅给出帧缓冲对象ID(fboId),我如何获得第一个颜色附件的大小? 这是可能的,还是我可以在外部变量中存储颜色附件的大小,以便稍后知道FBO的大小?

1 个答案:

答案 0 :(得分:18)

你的问题有些混乱,因为你要求两件不同的东西。

这是一个简单的问题:

  

如果只给出帧缓冲对象id(fboId),如何获得第一个颜色附件的大小?

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

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

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

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

当然,现在您需要知道如何绑定它。如果您在4.4之前使用OpenGL版本或没有某些扩展,那么这很复杂。请注意,您需要知道要使用哪个texture target type。这看起来很傻和烦人,从纹理对象名称确定目标的唯一方法是......尝试一切。浏览每个目标并检查glGetErrorGL_INVALID_OPERATION 未返回的那个是正确的。

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

一旦你有纹理绑定和它的mipmap级别,你use glGetTexLevelParameter就可以查询该级别的GL_TEXTURE_WIDTHGL_TEXTURE_HEIGHT

现在,这就是 easy 问题。困难的问题是你的标题要求:

  

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

FBO的可渲染区域的大小GL_COLOR_ATTACHMENT0的大小不同。 FBO的可渲染区域是连接到FBO的所有图像的所有大小的交集。

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

一般来说,你不应该问一个FBO,你创造了它有多大。就像你不必询问纹理它们有多大。你造了它们;根据定义,你知道它们有多大。你把它们放在FBO中,所以你再次知道它有多大。