CAEAGLLayer *eagl_layer = (CAEAGLLayer *) view.layer;
eagl_layer.opaque = TRUE;
eagl_layer.drawableProperties =
[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
nil];
ogl_ctx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
...
[EAGLContext setCurrentContext: ogl_ctx];
double s = self.contentScaleFactor;
int w = s * [self frame].size.width;
int h = s * [self frame].size.height;
glGenFramebuffersOES (1, &gl_framebuffer);
glBindFramebufferOES (GL_FRAMEBUFFER_OES, gl_framebuffer);
glGenRenderbuffersOES (1, &gl_renderbuffer);
glBindRenderbufferOES (GL_RENDERBUFFER_OES, gl_renderbuffer);
glRenderbufferStorageOES (GL_RENDERBUFFER_OES, GL_RGBA8_OES, w, h);
glFramebufferRenderbufferOES (GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES,
GL_RENDERBUFFER_OES, gl_renderbuffer);
#if 1 // #### why you no worky
glGenRenderbuffersOES (1, &gl_depthbuffer);
glBindRenderbufferOES (GL_RENDERBUFFER_OES, gl_depthbuffer);
glRenderbufferStorageOES (GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES,
w, h);
glFramebufferRenderbufferOES (GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES,
GL_RENDERBUFFER_OES, gl_depthbuffer);
#endif
[ogl_ctx renderbufferStorage:GL_RENDERBUFFER_OES
fromDrawable:(CAEAGLLayer*)self.layer];
switch (glCheckFramebufferStatusOES (GL_FRAMEBUFFER_OES)) {
...
I'm getting GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES. If I don't allocate the depth buffer, I get no error, but of course neither does depth testing work.
I used something like this in my last opengles2 iOS app:
(...)
self.glContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
(...)
[EAGLContext setCurrentContext:self.glContext];
glGenFramebuffers(1, &_glDefaultFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _glDefaultFramebuffer);
glGenRenderbuffers(1, &_glColorRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _glColorRenderBuffer);
[self.glContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_glFramebufferWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_glFramebufferHeight);
glGenRenderbuffers(1, &_glDepthRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _glDepthRenderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _glFramebufferWidth, _glFramebufferHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _glColorRenderBuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _glDepthRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _glColorRenderBuffer);
GLenum glFramebufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
Thanks! Looks like what I had wrong was that
[ogl_ctx renderbufferStorage: ..etc...]
has to come before
glBindRenderbufferOES (GL_RENDERBUFFER_OES, gl_depthbuffer)
and (I think?) the
glRenderbufferStorageOES (GL_RENDERBUFFER_OES, GL_RGBA8_OES, w, h)
is redundant with it.
Yeah that was really helpful. I'd somehow managed to get the
glGenRenderbuffers(1, &_glDepthRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _glDepthRenderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _glFramebufferWidth, _glFramebufferHeight);
bit before the
glGenRenderbuffers(1, &_glColorRenderBuffer);
and then totally miss out the
glBindRenderbuffer(GL_RENDERBUFFER, _glColorRenderBuffer);
... and still get an image (but with no depth buffer which really confused me when I tried using it in a shader).