将 RGBA32F 纹理与帧缓冲区一起使用会引发 INVALID_ENUM 错误

Posted

技术标签:

【中文标题】将 RGBA32F 纹理与帧缓冲区一起使用会引发 INVALID_ENUM 错误【英文标题】:Using RGBA32F Texture with framebuffer throw INVALID_ENUM error 【发布时间】:2014-12-27 18:43:47 【问题描述】:

我正在尝试使用附加到帧缓冲区的每通道 32F 纹理来渲染纹理。我使用正常的无符号 RGBA 纹理正确地做到了这一点,但我需要每个通道的分辨率更高。

我更改了纹理的内部格式,但在执行附件时,应用程序抛出了 INVALID_ENUM 错误。我读到可以使用这种格式linklink 附加纹理。所以错误可能在其他地方。

这里是sn-ps的代码:

glGenTextures(1, &mTexId);
glBindTexture(GL_TEXTURE_2D, mTexId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, _width, _height, 0, GL_RGBA32F , GL_UNSIGNED_BYTE, nullptr);

glBindFramebuffer(GL_FRAMEBUFFER, mBufferId);
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexId, 0);

checkErrors();      // <<--- Here I check the possible errors and it's where i got the INVALID_ENUM

有人可以帮助我吗? 非常感谢。

【问题讨论】:

【参考方案1】:

您的glTexImage2D 呼叫无效。

GL_RGBA32F 是有效的 internal 格式,但不是有效的客户端格式枚举。由于您只是创建纹理而不从客户端内存复制像素数据,因此您在此处指定的格式甚至无关紧要,但它必须仍然有效。

使用

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, _width, _height, 0, GL_RGBA, GL_FLOAT, nullptr);

改为。

【讨论】:

哦!我错过了那个参数,它现在可以工作了。非常感谢。

以上是关于将 RGBA32F 纹理与帧缓冲区一起使用会引发 INVALID_ENUM 错误的主要内容,如果未能解决你的问题,请参考以下文章

QGLFramebufferObject浮点纹理

将负值混合到帧缓冲区 0 opengl

Opengl渲染到纹理,但纹理为空

将 UInt8 组件类型的纹理传递给 Metal 计算着色器

RGBA 整数值到 OpenGL 纹理

如何在 1D 缓冲区中生成 2D 纹理并将其加载到 OpenGL 中?