トップ «前の日記(2012-07-04) 最新 次の日記(2012-07-06)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|

2012-07-05 [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

_ 【Cocoa練習帳】

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

トップ «前の日記(2012-07-04) 最新 次の日記(2012-07-06)» 編集