2017-02-16 9 views
0

У меня есть приложение IOS, которая использует GLKViewController и настроить рендер буфер следующим образом:GLKView с glDrawElements результатами буфера трафарета в черно экране

внутри @interface RootViewController : GLKViewController<UIKeyInput>

- viewDidLoad { 
    [super viewDidLoad]; 

    _context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 

    GLKView* view = (GLKView*)self.view; 
    view.context = _context; 
    view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888; 
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24; 
    view.drawableStencilFormat = GLKViewDrawableStencilFormat8; 
    view.drawableMultisample = GLKViewDrawableMultisampleNone; 
    self.preferredFramesPerSecond = 60; 

    [EAGLContext setCurrentContext:_context]; 
} 

Однако, когда я звоню ничья позже:

glDrawElements(getGlPrimitiveType(ePrimType), numIndis, GL_UNSIGNED_SHORT, startIndis);

Это приводит к черному экрану и на Capture GPU Frame, эта ошибка появляется:

Your app rendered with STENCIL_TEST enabled into a framebuffer without an attached stencil buffer.

Есть ли что-нибудь, что я пропустил?

Я вспомнил, с той же проблемой, прежде чем из-за тестирование глубины, и я могу это исправить с view.drawableDepthFormat = GLKViewDrawableDepthFormat24; на viewDidLoad Я не уверен, что тестирование трафарета, документация Apple, либо очень минимальны или очень общие с теориями все вокруг (т.е. довольно много бесполезно).

ответ

0

Я нашел виновника,

Я потерял оригинальную FBO-ID уже установка на GLKView, когда я отрисовки в текстуру:

uint m_nFboId; 
glGenFramebuffers(1, &m_nFboId); 
glBindFramebuffer(GL_FRAMEBUFFER, m_nFboId); 

тогда, когда я пытаюсь сбросить обратно в Оригинальный FBO-ID:

GLint defaultFBO; 
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); 

здесь, то defaultFBO это значение m_nFboId генерируется до .. Таким образом, решение либо его резервную копию перед операцией, или перезвонить [GLKView bindDrawable];