小嶋秀樹 | 研究室
日本語 | English
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.h の編集

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)
        ...
}
EAGLView.m の編集

フレームバッファの解放時に,深度バッファも解放するようにします.

- (void)deleteFramebuffer
{
        ...

        if (depthRenderbuffer)
        {
            glDeleteRenderbuffers(1, &depthRenderbuffer);
            depthRenderbuffer = 0;
        }
    }
}
EAGLView.m の編集

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)
    ....
GLBaseViewController.m の編集

- (void)drawFrame のなかで if ... else までをザックリ削除します.

GLBaseViewController.m の編集

これで完了です.あとは -drawFrame の描画部分(下図のハイライト部分)を好きなように書き換えて,いろいろな実験をしてみてください.(下の例は,GLBase に含まれている -drawFrame の場合です.)

GLBaseViewController.m の編集