デプスバッファ
Xcodeの新規プロジェクトのOpenGLESのテンプレートがいつの間にか変わっていた。
RootViewControllerが増えたことに伴う変更のようだけれども、責任分担なども前と違っているのと、ES1.1用とES2.0用のコードを二重に用意するやりかたも変わっているようです。
フレームバッファ周りの部分も1.1と2.0でAPIが違う都合、以前は二重になっていたのだけど、今回のは二重になっていなくてES2.0用の命令のみ使用している。結局内部で同じ関数呼び出してるってことなのかもしれないけど、ドキュメントでこれで大丈夫って明記してあるところでも見つけない限り、どことなく気持ち悪い。
今回のテンプレートは、自分的には、以前の日記でマックのGLの別のやり方として書いたものに近いなーと思ってたりします。
それ以前のものはあるところで書いたサンプルに近かった(ES2.0対応テンプレートやES2.0のサンプルが登場する前の話し)。
で、デプスバッファですが、以前の流儀に従って追加していくとすると、こんな感じかなと。
4.0以降ってことでpresentFramebufferメソッドにも更に細工を追加したいところ。けど今回は割愛。
10/6 一部修正
EAGLView.h
@interface EAGLView : UIView { // 省略 GLuint depthRenderbuffer; // これを足す。 } //省略 @end
EAGLView.m
ファイルの頭の方に、マクロを足します。
#import <QuartzCore/QuartzCore.h> #import "EAGLView.h" //追加 #define USE_DEPTH_BUFFER 1
メソッド二つを変更します。
- (void)createFramebuffer { if (context && !defaultFramebuffer) { [EAGLContext setCurrentContext:context]; // Create default framebuffer object. glGenFramebuffers(1, &defaultFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); // Create color render buffer and allocate backing store. glGenRenderbuffers(1, &colorRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer]; glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer); // 追加の始まり if ( USE_DEPTH_BUFFER ) { glGenRenderbuffers(1, &depthRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight); } // 追加の終わり if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); } } - (void)deleteFramebuffer { if (context) { [EAGLContext setCurrentContext:context]; if (defaultFramebuffer) { glDeleteFramebuffers(1, &defaultFramebuffer); defaultFramebuffer = 0; } if (colorRenderbuffer) { glDeleteRenderbuffers(1, &colorRenderbuffer); colorRenderbuffer = 0; } //追加の始まり if (depthRenderbuffer) { glDeleteRenderbuffers(1, &depthRenderbuffer); depthRenderbuffer = 0; } //追加の終わり } }
gist作りました。内容が若干違いますが、ほぼ同じものです。
https://gist.github.com/923096
それか、以下をどうぞ
https://gist.github.com/923107