设置GL_RGBA16F纹理格式时出现不完整的FBO。

3

我正在使用Java封装的OpenGL (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个回答

2

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


1
你为什么不把这个奖项授予帮助你找到问题的那个人呢?这样做不太公平。 - Engineer
如果你仔细阅读他的回答和我的回答,你会发现他提出的解决方案并不正确。而且无论如何我都没有获奖,所以我也没有兴趣从任何人那里“窃取”它 :) - Michael IV
正如他所说,“在OpenGL 3.3中没有GL_RGBA16F,也许这就是你的问题?” 对我来说似乎很清楚。他帮助你找到了问题。给他点数似乎是公平的。但无论如何。 - Engineer
亲爱的Nick,是的,问题与GL_RGBA16F有关,但与上面的答案完全无关。我在这个项目中使用了GL4.0(请参见我的评论),因此我在API中使用了这个参数。问题是我错误地将其放入内部格式的参数槽中,而不是按照GL API规定的格式。正如您所看到的,答案的作者没有提供任何提示。 - Michael IV

1

你的命名纹理是“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中使用这样的设置吗? - Michael IV
在LWJGL中,GL版本基于您选择的API方法。但通常我使用GL 4.0。我有两台NVidia GeForce 620GT和GeForce 550GT的机器,它们都提供相同的结果。事实上,只要不使用RGBA,就会在FBO中出现此错误。即使我使用GL_RGBA8。 - Michael IV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接