为什么这个 OpenGL 帧缓冲区颜色附件不完整?
Why is this OpenGL framebuffer color attachment incomplete?
我一直在关注 this 渲染到 off-screen 纹理的教程,但我在创建渲染目标时遇到了困难。
我已经注册了一个错误回调函数,我得到了一个 GL_DEBUG_TYPE_OTHER
错误返回 GL_DEBUG_SOURCE_API
源,它被 glCheckNamedFramebufferStatus()
吐出并显示消息:
FBO incomplete: color attachment incomplete[0].
我很难看到我在这里遗漏了什么,我仔细检查了我传递给 OpenGL 函数的参数并尝试删除 glTexParameteri
调用但无济于事。
如有任何帮助,我们将不胜感激。
GLuint framebuffer = 0;
GLuint renderedTexture;
GLenum drawBuffers[1] = {GL_COLOR_ATTACHMENTS0};
bool buildOffscreenBuffer()
{
// creating frame & render texture to draw picker buffer to
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080,
0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
// configuring framebuffer
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
renderedTexture, 0);
glDrawBuffers(1, drawBuffers);
return glCheckNamedFramebufferStatus(framebuffer, GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE;
}
更新:
根据 derhass' ,规范似乎不需要 GL_RGB。我已尝试将其更新为 GL_RGBA,但我遇到了同样的错误。由于这可能与实施相关,我将列出我的卡和 driver:
显卡:RX Vega 56
Driver: mesa/amdgpu
根据 GL 规范,GL_RGB
不在 必需的可呈现格式 集合中,因此实现可以自由选择不支持它。请尝试 GL_RGBA
。
设法弄清了这个问题。我实际上修复了简化 post.
示例的错误
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080,
0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
实际上是从平台层的辅助函数获取宽度和高度,但是该函数返回了我存储在 struct {float, float}
中的 struct {int, int}
。这导致垃圾作为宽度和高度传递给 glTexImage2D
。
我一直在关注 this 渲染到 off-screen 纹理的教程,但我在创建渲染目标时遇到了困难。
我已经注册了一个错误回调函数,我得到了一个 GL_DEBUG_TYPE_OTHER
错误返回 GL_DEBUG_SOURCE_API
源,它被 glCheckNamedFramebufferStatus()
吐出并显示消息:
FBO incomplete: color attachment incomplete[0].
我很难看到我在这里遗漏了什么,我仔细检查了我传递给 OpenGL 函数的参数并尝试删除 glTexParameteri
调用但无济于事。
如有任何帮助,我们将不胜感激。
GLuint framebuffer = 0;
GLuint renderedTexture;
GLenum drawBuffers[1] = {GL_COLOR_ATTACHMENTS0};
bool buildOffscreenBuffer()
{
// creating frame & render texture to draw picker buffer to
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080,
0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
// configuring framebuffer
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
renderedTexture, 0);
glDrawBuffers(1, drawBuffers);
return glCheckNamedFramebufferStatus(framebuffer, GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE;
}
更新:
根据 derhass'
显卡:RX Vega 56
Driver: mesa/amdgpu
根据 GL 规范,GL_RGB
不在 必需的可呈现格式 集合中,因此实现可以自由选择不支持它。请尝试 GL_RGBA
。
设法弄清了这个问题。我实际上修复了简化 post.
示例的错误 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080,
0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
实际上是从平台层的辅助函数获取宽度和高度,但是该函数返回了我存储在 struct {float, float}
中的 struct {int, int}
。这导致垃圾作为宽度和高度传递给 glTexImage2D
。