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