Есть идеи, что может вызвать EAGLContext presentRenderbuffer
к ошибке GL_INVALID_OPERATION
, даже если вызов возвращает ДА, а в буфере, похоже, правильное содержимое?
Некоторые детали:
Я использую стороннюю библиотеку для рендеринга текстуры в закадровый кадровый буфер.Поскольку сторонние рендеры работают медленно, это делается асинхронно в фоновом потоке с использованием отдельной 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);
И затем для каждой новой текстуры, отображаемой сторонней библиотекой,новая текстура создается, чтобы получить окончательную визуализированную текстуру:
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
Это сработало бы на первый взгляд;Я обнаружил ошибку только после включения точки останова «Ошибка ES OpenGL» в XCode ранее сегодня, чтобы выследить другую ошибку;XCode прервется в последней строке, показанной с GL_INVALID_OPERATION
, а последующий вызов glGetError
вернет 1282. Перед вызовом presentRenderbuffer не было ошибок GL (я поместил вызовы glGetError
, но опущенздесь они для краткости.)
Любопытно, что вызов presentRenderbuffer
возвращает YES (успех), даже если точка останова показывает недопустимую ошибку операции при вызове.Каждая новая текстура представлена и используется в нисходящем направлении для рендеринга на экран.
Тем не менее, я хотел бы знать, что является причиной этого, и исправить это, чтобы это не вызывало других ошибок в дальнейшем.