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

Ver*_*ahn 4 c++ opengl opengl-3

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

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

// create the FBO. 
glGenFramebuffers(1, &fboId);
Run Code Online (Sandbox Code Playgroud)

如果只给出framebuffer对象id(fboId),我如何获得第一个颜色附件的大小?这是可能的,还是我可以在外部变量中存储颜色附件的大小,以便稍后了解FBO的大小?

Nic*_*las 18

你的问题有点困惑,因为你要求两个不同的东西.

这是一个简单的问题:

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

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

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

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

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

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

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

一旦你有纹理的约束和它的纹理贴图的水平,您使用glGetTexLevelParameter查询GL_TEXTURE_WIDTHGL_TEXTURE_HEIGHT该级别.

现在,这是一个容易的问题.困难的问题是你的标题要求:

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

一个FBO的渲染区域的大小是不一样的大小GL_COLOR_ATTACHMENT0.FBO的可渲染区域是连接到FBO的所有图像的所有大小的交集.

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

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

  • 谢谢你的答案(顺便说一句,每次我问一个OpenGL问题时,我都会找到你的答案之一:我不知道你花了多少时间在SO上,但你确定你应该得到每一个代表点:)) (2认同)