Mac OS X上的OpenGL glValidateProgram错误

时间:2013-03-11 09:52:15

标签: macos opengl glsl

我正在尝试在Mac OS X(Mountian Lion)上使用GLUT编写一个简单的OpenGL 3.2(使用GLSL 1.5)程序,但我一直从glValidateProgram中得到错误:

'验证失败:当前绘制帧缓冲区无效。'

什么可能导致此错误发生?

3 个答案:

答案 0 :(得分:1)

与OP一样,我遇到了一些使用它的代码,并且在不知道任何更好的情况下,我在程序链接步骤之后立即实现了它。得到了同样的错误。

我不是这里的专家,但基于一些观察,我认为我已经澄清了@robinjam似乎在说什么(这与GL文档对glValidateProgram的说法相呼应。)

我使用的示例代码是Apple的iOS测试OpenGL ES 2.0演示项目,我还没有在设备上运行这段代码,但模拟器给了我这个{{1}错误。但是,需要注意的是,运行此方法的方法Validation Failed: Current draw framebuffer is invalid.包含在- (BOOL)validateProgram:(GLuint)prog中(不是ViewController.mm,因为我早期用C ++感染了它)但是那里没有提供实际调用它的示例代码的代码

因此glValidateProgram的目的不是将其用作添加的"检查"链接程序后的步骤,因为此时GL和应用程序状态几乎没有准备好使用该程序,甚至可能在我们开始初始化默认帧缓冲区之前(其bitdepth) ,它的多重采样缓冲区等),以及错误提示的内容。

在进行真正的渲染调用之前,调用glValidateProgram的适当位置是正确的。

这对调试很有用。这是一种可选的方式,让我们为司机提供一种方法,帮助我们解决问题。每次我们在非调试情况下渲染时都会调用它,这一切都很愚蠢。

答案 1 :(得分:0)

如果这有帮助,下面的代码会创建一个有效的帧缓冲区,用于写入与默认的屏幕渲染缓冲区不同,写入它然后重置屏幕缓冲区。

// ************************************** 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);

答案 2 :(得分:0)

这是一个老问题。

当我在iOS中使用GLKView和GLKViewcontroller时,在viewDidLoad中尝试验证会产生此错误。

当帧缓冲区准备就绪时,在ViewDidAppear中执行此操作。