简体   繁体   中英

GLKView with stencil buffer's glDrawElements results in black screen

I have an iOS app that uses GLKViewController and I set up the render buffer as follows:

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

However, when I call draw later:

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

It results in black screen and upon Capture GPU Frame , this error shows up:

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

Is there anything that I missed?

I remembered having the same problem before due to depth testing, and I fix it with the view.drawableDepthFormat = GLKViewDrawableDepthFormat24; on viewDidLoad I am not sure about stencil testing, Apple's documentation is either very minimal or very general with theories all around (ie: pretty much useless).

I found the culprit,

I've lost the original FBO-ID already setup by GLKView when I do render to texture:

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

then, when I try to reset back to the original FBO-ID:

GLint defaultFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO);

here, the defaultFBO is the value of m_nFboId generated before.. So the solution is to either back it up before the operation, or call back [GLKView bindDrawable];

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM