【问题标题】:Why is this OpenGL framebuffer color attachment incomplete?为什么这个 OpenGL 帧缓冲区颜色附件不完整?
【发布时间】:2021-03-09 16:58:15
【问题描述】:

我一直在关注this 关于渲染到屏幕外纹理的教程,但我在创建渲染目标时遇到了困难。 我已经注册了一个错误回调函数,我收到了一个带有GL_DEBUG_SOURCE_API 源的GL_DEBUG_TYPE_OTHER 错误,glCheckNamedFramebufferStatus() 吐出的消息是:

FBO 不完整:颜色附件不完整[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'answer,根据规范似乎不需要 GL_RGB。我尝试将其更新为 GL_RGBA 但我遇到了同样的错误。由于这可能与实现相关,我将列出我的卡和驱动程序:

卡:RX Vega 56

司机:mesa/amdgpu

【问题讨论】:

  • 请提供一个实际产生问题的示例。顺便说一句,您可以检查my dirty FBO example(通过gcc HelloFBO.c -lglfw -lGLEW -lGL 编译),如果它不能在mesa/amdgpu 上运行,我会感到惊讶。只需添加帧缓冲区完整性检查,并根据需要更改 FBO 尺寸。

标签: c opengl framebuffer


【解决方案1】:

根据 GL 规范,GL_RGB 不在必需的可渲染格式集合中,因此实现可以不支持它。请改用GL_RGBA

【讨论】:

  • 恐怕与 GL_RGBA 相同的错误。我没有意识到规范不需要 GL_RGB。我会用一些驱动程序信息更新问题
  • 你还没有更新纹理格式的源代码。
  • 我的错,早上看这个第一件事,我错过了更新
【解决方案2】:

设法查明真相。实际上,我已经修复了简化帖子示例的错误。

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080,
            0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

实际上是从平台层的辅助函数获取宽度和高度,但是该函数返回了我存储在 struct {float, float} 中的 struct {int, int} 。这导致垃圾作为宽度和高度传递给glTexImage2D

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多