设置 GL_RGBA16F 纹理格式时获取不完整的 FBO

Posted

技术标签:

【中文标题】设置 GL_RGBA16F 纹理格式时获取不完整的 FBO【英文标题】:Getting incomplete FBO when setting GL_RGBA16F texture format 【发布时间】:2012-07-20 15:06:21 【问题描述】:

我正在使用用于 OpenGL 的 Java 包装器(LWJGL)我得到了

 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

如果我将 FBO 纹理附件格式设置为 GL_RGBA16F 的状态。事实上,除了 GL_RGBA 之外的任何内容都会导致此错误。 这是我的 FBO 纹理设置:

glBindTexture(GL_TEXTURE_2D, texId);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, _width, _height, 0, GL_RGBA, GL_FLOAT, (ByteBuffer) null);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texId, 0);
glDrawBuffers(GL_COLOR_ATTACHMENT0);

这里是深度附件:

_depthBuffer = glGenRenderbuffers();
glBindRenderbuffer(GL_RENDERBUFFER, _depthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, _width, _height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthBuffer);

更新:

事实上,如果我像这样交换内部格式和格式的位置: GL_RGBA,GL_RGBA16F 比 FBO 完成还好。但是在我看到的示例中,使用的是 GL_RGBA16F 先执行。

更新1: 到目前为止,LWJGL 论坛上没有任何人回答。也将此问题作为错误提交,但也没有得到开发团队的回答。如果其他人可以测试带有纹理附件的 FBO,使用浮点格式并报告完整性是否实现这可能很棒。目前我认为我的代码没有错误。而且我已经在 2 台机器上对其进行了测试并得到了相同的结果。

【问题讨论】:

【参考方案1】:

那是我的错误。我在传递 GL_RGBA 作为格式时错误地将 GL_RGBA16F 作为内部格式参数。问题解决了。

【讨论】:

有什么特别的原因你没有把这个奖励给帮助你找到问题的人吗?那不是你很运动。 如果你仔细阅读他和我的答案,你会发现他提出的解决方案不是正确的。而且我还是失去了奖项,所以我没有兴趣从任何人那里“窃取”它:) 正如他所说,“GL_RGBA16F 在 OpenGL 3.3 中不可用,也许这是你的问题?”对我来说似乎很清楚。他帮助你找到你的问题。给他点似乎是公平的。但无论如何。 亲爱的尼克,是的,这个问题与 GL_RGBA16F 有关,但它与上面的答案完全无关。我在这个项目中使用了 GL4.0(见我在他的答案下面的评论)所以我有这个参数API。问题是我错误地放入了内部格式的参数槽,而不是 GL API 规定的格式。正如您所看到的答案的作者没有提供任何提示。【参考方案2】:

您命名的纹理是“tex”,但您绑定到颜色附件的纹理是“texId”。

编辑:

我正在使用 FBO,当我在 Intel HD3000 上尝试我的应用程序时得到 GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT,但在 AMD 或 NVIDIA (OpenGL 4.2) 上没有。不同的是,Intel HD3000 只支持 OpenGL 3.1。 GL_RGBA16F 在 OpenGL 3.3 中不可用,也许这是你的问题?

【讨论】:

这是我在帖子中的错字。在源代码中,设置分为两个功能。首先创建纹理,然后将其附加到 FBO。所以纹理名称是可以的,因为在这个代码示例中我将这两种方法的代码放在一起,只是忘记将 tex 重命名为 texId。你在 LWJGL 中尝试过这样的设置吗? 在 LWJGL 中,GL 版本基于您选择的 API 方法。但通常我使用 GL 4.0。我有 2 台机器使用 NVidia GeForce 620GT 和 GeForce 550GT。两者都给出相同的结果。事实上,使用除 RGBA 之外的任何东西都会在 FBO 中给我这个错误。即使我使用 GL_RGBA8。

以上是关于设置 GL_RGBA16F 纹理格式时获取不完整的 FBO的主要内容,如果未能解决你的问题,请参考以下文章

内部格式为 GL_RGBA8 的纹理在片段着色器中显示为浮点数

QGLFramebufferObject浮点纹理

使用相同的着色器处理 GL_RGBA 和 GL_ALPHA 纹理?

通过使用 eglExportDMABUFImageQueryMESA 和 GL_RGBA(A 结束)在两个应用程序之间的纹理共享问题

如何在 OpenGL ES 2.0 中使用 GL_FLOAT 创建纹理?

在 glTexImage2D() 中指定 GL_RGBA32F 时输出奇怪