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

标签 c++ opengl opengl-3

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

我通过

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

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

最佳答案

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

这是一个简单的问题:

How can I get the size of the first color attachment given only the framebuffer object id (fboId)?

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

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

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

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

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

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

一旦你有了纹理绑定(bind)并且它是 mipmap 级别,你 use glGetTexLevelParameter查询该级别的 GL_TEXTURE_WIDTHGL_TEXTURE_HEIGHT

现在,这是一个简单的问题。困难的问题是你的标题问什么:

I want to determine the size (width, height) of a framebuffer object.

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

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

一般来说,您不必询问您创建的 FBO 有多大。就像你不必问纹理有多大一样。你创造了它们;根据定义,您知道它们有多大。你把它们放在 FBO 里,所以你又知道它有多大了。

关于c++ - 如何仅给定相应的 id 来确定 GL 帧缓冲区对象的宽度和高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15140883/

相关文章:

c++ - 为什么我的 OpenGL 代码会产生黑屏?

c++ - 无论如何有一个 valgrind 消息 "Conditional jump or move depends on uninitialized value"可以是所谓的 'false positive'

c++ - 如何从 Windows 上的 c++ 控制台应用程序打印 UTF-8

c++ - 引导文件编译错误

c++ - 从过剩教程中了解宏测量数组计数

c# - VBO 或显示列表 - GPU 兼容性

c++ - ubuntu 上的 opengl 和 SDL 编译

c++ - glStencilFunc() : why is GL_ALWAYS ! = GL_EQUAL union GL_NOTEQUAL?

c++ - OpenGL glReadPixels 返回 0

c++ - 静态无效函数链接错误