Что может вызвать ошибку GL_INVALID_OPERTATION при вызове EAGLContext presentRenderBuffer? - PullRequest
0 голосов
/ 28 сентября 2018

Есть идеи, что может вызвать 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 (успех), даже если точка останова показывает недопустимую ошибку операции при вызове.Каждая новая текстура представлена ​​и используется в нисходящем направлении для рендеринга на экран.

Тем не менее, я хотел бы знать, что является причиной этого, и исправить это, чтобы это не вызывало других ошибок в дальнейшем.

...