是什么导致对EAGLContext presentRenderBuffer的调用出现GL_INVALID_OPERTATION错误?

时间:2018-09-28 00:04:47

标签: ios opengl-es opengl-es-2.0

有什么想法可能导致EAGLContext presentRenderbuffer导致GL_INVALID_OPERATION错误,即使调用返回YES并且缓冲区似乎具有正确的内容?

一些细节:

我正在使用第3方库将纹理渲染到屏幕外的帧缓冲区。由于第三方渲染速度较慢,因此可以在后台线程上使用单独的EAGLContext异步完成此操作,但要使用与主线程渲染上下文相同的共享组,以便可以从那里获取最终纹理用于屏幕渲染。

只有一个帧缓冲区可以设置一次并重新使用:

GLuint _frameBuffer = 0;
GLuint _stencilRenderBuffer = 0;

glGenFramebuffers(1, &_frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);

glGenRenderbuffers(1, &_stencilRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, stencilRenderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencilRenderBuffer);

然后,对于第3方库渲染的每个新纹理,将创建一个新纹理以接收最终渲染的纹理:

GLuint _texture = 0;
glGenTextures(1, &_texture);
glBindTexture(GL_TEXTURE_2D, _texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _frameBufferTexture, 0);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ;
if(status != GL_FRAMEBUFFER_COMPLETE) {
    // handle it
}

glClearColor( 1, 1, 1, 1 );
glClear( GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

// {CALL TO 3rd PARTY LIBRARY IS MADE HERE}

glFinish(); // ensure third-party library is finished

BOOL result = [context presentRenderbuffer:GL_RENDERBUFFER];  // XCode breaks on this line

这看起来似乎很好;我只是在今天早些时候在XCode中启用“ OpenGL ES错误”断点以查找其他错误之后才发现该错误; XCode将在GL_INVALID_OPERATION显示的最后一行中断,随后对glGetError的调用将返回1282。对presentRenderbuffer的调用之前没有显示GL错误(我已将{{1}放入}电话,但为简洁起见在此省略。)

奇怪的是,即使断点在调用中显示无效的操作错误,glGetError调用也返回YES(成功)。每个新的纹理都会呈现出来,并在下游用于渲染到屏幕。

还是,我想知道是什么原因造成的,并加以解决,以免造成其他错误。

0 个答案:

没有答案