将 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 错误的主要内容,如果未能解决你的问题,请参考以下文章