OpenGL ES 道場(1)
最新の iPhone 開発環境(Xcode 3.2+ for iOS 4.2+)での OpenGL ES Application テンプレートは,市販の参考書やネット上のチュートリアルが参照しているテンプレートとかなり異なるようです.そこで,最新のテンプレートを少し改造して,容易に自習できるようにしてみます.
【GLBase テンプレート】
GLBase テンプレートは,Xcode 3.2+ 標準の OpenGL ES Application テンプレートに若干の変更を加えたものです.変更点は,(1) OpenGL ES 1.1 のみを利用,(2) 深度バッファを利用,(3) サンプルを3Dのものに変更の3点です.以下に詳しく説明します.
EAGLView.h の編集
深度バッファのインスタンス変数を追加します.
@interface EAGLView : UIView
{
...
GLuint defaultFramebuffer, colorRenderbuffer;
GLuint depthRenderbuffer;
}
EAGLView.m の編集
深度バッファも生成・設定します.
- (void)createFramebuffer
{
...
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER, colorRenderbuffer );
// Add depth buffer
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER, depthRenderbuffer );
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
self.bounds.size.width, self.bounds.size.height );
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
...
}
フレームバッファの解放時に,深度バッファも解放するようにします.
- (void)deleteFramebuffer
{
...
if (depthRenderbuffer)
{
glDeleteRenderbuffers(1, &depthRenderbuffer);
depthRenderbuffer = 0;
}
}
}
GLBaseViewController.m の編集
OpenGL ES 1.1 のみを使うように設定します.
- (void)awakeFromNib
{
//EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
//
//if (!aContext)
//{
// aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
//}
EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!aContext)
....
- (void)drawFrame のなかで if ... else までをザックリ削除します.
これで完了です.あとは -drawFrame の描画部分(下図のハイライト部分)を好きなように書き換えて,いろいろな実験をしてみてください.(下の例は,GLBase に含まれている -drawFrame の場合です.)