带有模板缓冲区的glDrawElements的GLKView导致黑屏

时间:2017-02-16 01:50:18

标签: ios opengl-es glkit glkview

我有一个使用GLKViewController的iOS应用程序,我按如下方式设置渲染缓冲区:

内部 @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];
}

然而,当我稍后调用draw时:

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的文档要么非常小,要么非常一般周围的理论(即:几乎没用)。

1 个答案:

答案 0 :(得分:0)

我找到了罪魁祸首,

当我渲染纹理时,我已经丢失了GLKView已经设置的原始FBO-ID:

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];