デバイスが新しい高さと幅で回転するたびに、フレームバッファを破棄して再構築する必要があります。layoutsubviewsを使用して、これらすべてをトリガーします。これは、向きが変わると呼び出されます。
- (void)layoutSubviews {
NSLog(@"layoutSubviews");
[EAGLContext setCurrentContext:_context];
[self destroyFramebuffer];
[self createFramebuffer];
}
- (void)destroyFramebuffer {
NSLog(@"destroy buffer");
glDeleteFramebuffers(1, &viewFramebuffer);
viewFramebuffer = 0;
glDeleteRenderbuffers(1, &viewRenderbuffer);
viewRenderbuffer = 0;
glDeleteRenderbuffers(1, &depthRenderbuffer);
depthRenderbuffer = 0;
}
- (BOOL)createFramebuffer {
NSLog(@"creating buffer");
glGenFramebuffers(1, &viewFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer);
glGenRenderbuffers(1, &viewRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
// setup the renderbuffer to the context
[[EAGLContext currentContext] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer);
// Allocate color buffer backing based on the current layer size (get the current layer size)
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight);
NSLog(@"backing width: %d height: %d",backingWidth, backingHeight);
// set up the depth buffer
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
[self setupView];
return YES;
}
次に、backingWidthとbackingHeightを使用して、射影行列を再作成します。