iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
描画で必要な状態やデータをオブジェクトという塊で扱っている。前回のコードで利用していたオブジェクトは以下のとおり。
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);