glCheckFramebufferStatus之后无效的帧缓冲操作

时间:2014-01-20 18:48:04

标签: opengl intel opengl-3

在我的HD4000(Windows 64bit,驱动程序版本15.28.20.64.3347)上运行我的应用程序时,我收到一个奇怪的OpenGL错误。

我把它归结为几个OpenGL调用来重现它:

  1. 创建两个framebuffer对象。
  2. 创建纹理并将其作为GL_COLOR_ATTACHMENT0绑定到两个FBO。
  3. 第二次在纹理上调用glTexImage2D
  4. 绑定第一个FBO并调用glCheckFramebufferStatus(返回GL_FRAMEBUFFER_COMPLETE)。
  5. 绑定第二个FBO并致电glClear。 glClear提供GL_INVALID_FRAMEBUFFER_OPERATION。
  6. 重现错误需要步骤3和4,我发现glCheckFramebufferStatus调用特别令人不安。其他显卡(包括同一台机器上的Nvidia卡)也不会出现此问题。

    如果在第二个FBO上调用glCheckFramebufferStatus,它也会返回GL_FRAMEBUFFER_COMPLETE。但是,在使用apitrace检查内部OpenGL状态时,它表示第二个FBO现在具有对象名称为零的颜色附件。

    glCheckFramebufferStatus调用解决错误后,将纹理重新绑定到第二个FBO。目前这是一种解决方法,但我认为将纹理绑定到每个帧的各种FBO并不是一个好主意。

    以下是重现错误的C ++代码:

    // Create a texture and bind it to two FBOs
    GLuint textureName;
    glGenTextures(1, &textureName); 
    glBindTexture(GL_TEXTURE_RECTANGLE, textureName); 
    glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    
    GLuint fboNames[2];
    glGenFramebuffers(2, fboNames); 
    glBindFramebuffer(GL_FRAMEBUFFER, fboNames[0]); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE, textureName, 0); 
    
    glBindFramebuffer(GL_FRAMEBUFFER, fboNames[1]);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE, textureName, 0);
    
    glBindTexture(GL_TEXTURE_RECTANGLE, textureName); 
    glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    
    glBindFramebuffer(GL_FRAMEBUFFER, fboNames[0]); 
    
    // Removing this line resolves the error
    glCheckFramebufferStatus(GL_FRAMEBUFFER); // Returns GL_FRAMEBUFFER_COMPLETE
    
    glBindFramebuffer(GL_FRAMEBUFFER, fboNames[1]);
    GLenum bufferTarget = GL_COLOR_ATTACHMENT0;
    glDrawBuffers(1, &bufferTarget);
    
    // Adding this line resolves the error 
    // glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_RECTANGLE, 1, 0); 
    
    glCheckFramebufferStatus(GL_FRAMEBUFFER); // Returns GL_FRAMEBUFFER_COMPLETE
    
    //This call causes a GL_INVALID_FRAMEBUFFER_OPERATION error.
    glClear(GL_COLOR_BUFFER_BIT);
    

    以下是重现它的最小Visual Studio 2013项目:https://www.dropbox.com/s/5142j26d839gkp9/HD4000Error.zip

    现在,我的问题是:我在这里使用OpenGL做违法行为还是仅仅是一个驱动程序错误?

1 个答案:

答案 0 :(得分:0)

我们向英特尔报告了此问题,似乎它实际上是一个错误。它已在当前驱动程序版本中修复。