[iOS]OpenGL ES(2) | Cocoa練習帳

[iOS]OpenGL ES(2)

描画で必要な状態やデータをオブジェクトという塊で扱っている。前回のコードで利用していたオブジェクトは以下のとおり。





バッファオブジェクト
その名のとおりメモリの塊。

レンダバッファ
色データと深度データ、ステンシスデータがある。

フレームバッファ
描画対象のバッファ。




OpenGL ESの状態は、レンダリングコンテキストと呼ばれるものに格納されている。これがあるため、他のアプリケーションから独立して描画する事が出来るのだが、そのために、上記のオブジェクトはバインドと呼ばれるコマンドで、コンテキストと関係づけて利用する。




iOSでは、EAGLContextクラスを通してレンダリングコンテキストを操作する事になる。




/* GLKViewControllerのサブクラス */
 
/* OpenGL ES 1.1コンテキストを作成 */
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
 
/* GLKitViewに設定 */
GLKView *view = (GLKView *)self.view;
view.context = self.context;
view.drawableDepthFormat = GLKViewDrawableDepthFormatNone;
 
/* 現在のコンテキストに設定 */
[EAGLContext setCurrentContext:self.context];



フレームバッファを1個生成して、それを現在のコンテキストに関連づける。




glGenFramebuffersOES(1, &_defaultFramebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, self.defaultFramebuffer);



レンダバッファを1個生成して、それを現在のコンテキストに関連づける。レンダバッファ領域をビューの大きさ分生成し、それをさっき生成したレンダバッファに色データとして設定する。




glGenRenderbuffersOES(1, &_colorRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, self.colorRenderbuffer);
glRenderbufferStorageOES(
    GL_RENDERBUFFER_OES,
    GL_RGBA8_OES,
    self.view.bounds.size.width,
    self.view.bounds.size.height);
glFramebufferRenderbufferOES(
    GL_FRAMEBUFFER_OES,
    GL_COLOR_ATTACHMENT0_OES,
    GL_RENDERBUFFER_OES,
    self.colorRenderbuffer);



フレームバッファの状態に問題がないか確認する。




GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) ;
if (status != GL_FRAMEBUFFER_COMPLETE_OES) {
    DBGMSG(@"failed to make complete framebuffer object %x", status);
}



これで準備が整ったので、描画をとりかかる。




レンダバッファの消去。今回は色のレンダバッファのみだ。




glClear(GL_COLOR_BUFFER_BIT);



頂点配列とカラー配列を有効にする。




glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);



頂点配列を設定する。




GLfloat vertices[] = {
    -0.5f, -0.5f,
    0.5f, -0.5f,
    0.0f, 0.5f,
};
glVertexPointer(2 , GL_FLOAT , 0 , vertices);



第一引数はxとy座標のデータなので2を指定。第二引数は浮動小数点を指定。




色配列を設定する。




GLubyte colors[] = {
    255, 0, 0, 255,
    255, 0, 0, 255,
    255, 0, 0, 255,
};
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors);



第一引数はRGBAなので4を指定。第二引数はバイト単位を指定。




そして、三角形を描画。




glDrawArrays(GL_TRIANGLES, 0, 3);



ソースコード
GitHubからどうぞ。

https://github.com/murakami/workbook/tree/master/ios/IRIS - GitHub


関連情報
OpenGL ES Programming Guide for iOS

OpenGLの神髄



【Cocoa練習帳】
http://www.bitz.co.jp/weblog/

http://ameblo.jp/bitz/(ミラー・サイト)