在Mac OS X上,OpenGL glValidateProgram错误

3

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

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

这个错误可能是由什么引起的?


1
这听起来可能有点轻率,但是……无效的绘制帧缓冲区就是导致这种情况发生的原因。你改过它吗?它目前是什么? - Nicol Bolas
1
尼科尔一如既往地正确。此外,glCheckFramebufferStatus可能会成为你在这里最好的朋友。 - Robinson
1
glCheckFramebuffertatus返回GL_FRAMEBUFFER_UNDEFINED,根据OpenGL参考意味着:"如果目标是默认帧缓冲区,但默认帧缓冲区不存在,则返回。"我可以如何定义默认帧缓冲区? - user2156225
为什么编译程序需要使用帧缓冲?我要大声抱怨“苹果驱动程序的错误”,这个问题很容易复现,只需在OSX和iOS上启动额外的线程并进行多线程渲染。渲染本身没有问题,但是苹果(据我所知)错误地报错。 - Adam
@Adam:这是一个验证错误,而不是编译或链接错误。验证的目的是确定程序是否与当前的OpenGL状态兼容。在OP的情况下,没有有效的绘制帧缓冲绑定,因此验证失败。这不是一个“Apple driver bug”,这是正确的行为。 - user269597
3个回答

2
像OP一样,我也遇到了一些使用这种方法的代码,并且在不知道更好的方法的情况下,在程序链接步骤之后立即实现了它。结果得到了相同的错误。
我不是专家,但基于一些观察,我想澄清@robinjam似乎在说什么(这与GL文档中关于glValidateProgram的说法相吻合)。
我使用的示例代码是苹果的iOS测试OpenGL ES 2.0演示项目,我还没有在设备上运行这个代码片段,但模拟器给我返回了“验证失败:当前绘图帧缓存无效”的错误。然而,值得注意的是,运行这个方法的 - (BOOL)validateProgram:(GLuint)prog 包含在 ViewController.mm (不是 .m 因为我早期感染了C ++),但是这个示例代码并没有提供任何调用它的代码。
因此,glValidateProgram的目的不是将其用作链接程序后的附加“检查”步骤,因为此时GL和应用程序状态几乎没有准备好实际使用该程序,可能甚至在我们开始初始化默认帧缓存(其位深度,多重采样缓冲区等)之前,这就是错误的提示。
适当调用glValidateProgram的地方是在进行真正的渲染调用之前。
它对于调试很有用。这是一种可选的方式,让驱动程序在出现问题时帮助我们。在一切顺利的非调试情况下每次渲染都调用它是愚蠢的。

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

0

这是个老问题。

在iOS中使用GLKView和GLKViewController时,尝试在viewDidLoad中进行验证会导致此错误。

当framebuffer准备就绪时,在ViewDidAppear中进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接