在我的HD4000(Windows 64bit,驱动程序版本15.28.20.64.3347)上运行我的应用程序时,我收到一个奇怪的OpenGL错误。
我把它归结为几个OpenGL调用来重现它:
重现错误需要步骤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做违法行为还是仅仅是一个驱动程序错误?
答案 0 :(得分:0)
我们向英特尔报告了此问题,似乎它实际上是一个错误。它已在当前驱动程序版本中修复。