我正在尝试在 Mac OS X(Mountian Lion)上使用 GLUT 编写一个简单的 OpenGL 3.2(带有 GLSL 1.5)程序,但我不断收到来自 glValidateProgram 的错误:
“验证失败:当前绘制帧缓冲区无效。”
什么可能导致发生此错误?
像 OP 一样,我遇到了一些使用它的代码,并且在不知道更好的情况下,我在程序链接步骤之后立即实现了它。得到同样的错误。
我在这里不是专家,但根据一些观察,我想我会澄清@robinjam 似乎在说什么(这与 GL 文档所说的相呼应glValidateProgram
)。
我使用的示例代码是 Apple 的 iOS 测试 OpenGL ES 2.0 演示项目,我还没有在设备上运行这段确切的代码,但是模拟器给了我这个Validation Failed: Current draw framebuffer is invalid.
错误。但是,需要注意的是,运行这个的方法- (BOOL)validateProgram:(GLuint)prog
,,包含在ViewController.mm
(不是.m
因为我很早就用 C++ 感染了它)但是这个示例代码没有提供实际调用它的代码。
所以 glValidateProgram 的目的不是在链接程序后将其用作添加的“检查”步骤,因为此时 GL 和应用程序状态几乎没有准备好实际使用该程序,可能甚至在我们开始初始化之前默认帧缓冲区(其位深度、多样本缓冲区等),这就是错误提示的内容。
在您进行真正的渲染调用之前,调用 glValidateProgram 的适当位置将是正确的。
这对调试很有用。这是我们的一种可选方式,可以让司机在出现问题时帮助我们。每次我们在一切都运行顺利的非调试情况下渲染时调用它是愚蠢的。
如果这有帮助,下面的代码会创建一个与默认屏幕渲染缓冲区不同的用于写入的有效帧缓冲区,写入它然后重置屏幕缓冲区。
// ************************************** Save the Current Viewport Size
GLint screenViewPort[4];
glGetIntegerv(GL_VIEWPORT, screenViewPort);
// ***************************** Define a Second Output Buffer and Bind it for Writing
glGenFramebuffersEXT(1, wispSecondOutputBuffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, wispSecondOutputBuffer[0]);
// ******************************* Set the Viewport to the Texture Size and Reshape
glViewport(0,0,TEXTUREWIDTH, TEXTUREHEIGHT);
[self resizeTextureGL]; // Calculates new Model, View and Projection Matrices
// ************************************** Create the Output Imgage Texture
glGenTextures( 1, wispOutputTexture);
glBindTexture(GL_TEXTURE_2D, wispOutputTexture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)TEXTUREWIDTH, (GLsizei)TEXTUREHEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// ********************************* Attach the Output Texture to the Frame Buffer
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, wispOutputTexture[0], 0);
GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, DrawBuffers);
// ************************************ Check that the Frame Buffer is Complete
GLenum frameBufferStatus;
frameBufferStatus = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
if(frameBufferStatus != GL_FRAMEBUFFER_COMPLETE_EXT) NSLog(@"There is a problem with the output frame buffer");
// ****************************************** Render to the Texture
[self runTextureShaders];
[self runTextureShaders2];
// ************************************ Reset the Viewport and Frame Buffer
glViewport(screenViewPort[0],screenViewPort[1],(GLsizei)screenViewPort[2], (GLsizei)screenViewPort[3]);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
这是个老问题。
当我在 iOS 中使用 GLKView 和 GLKViewcontroller 时,尝试在 viewDidLoad 中进行验证会导致此错误。
当帧缓冲区准备好时,在 ViewDidAppear 中执行此操作。