有什么想法可能导致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(成功)。每个新的纹理都会呈现出来,并在下游用于渲染到屏幕。
还是,我想知道是什么原因造成的,并加以解决,以免造成其他错误。