ドキュメントにOESはサフィックスだとかなんとか書いてるんで思いついたのが、glBindFramebufferOESじゃなくBind Framebufferとか、いくつかに分けての検索方法。
ヒットしました。
glBindFramebuffer
って、
OpenGL ES 2.0 Reference Pages
に載ってるんじゃ~ん。
これによると
glGenFramebuffers フレームバッファの固有名を作成
glBindFramebuffer 与えられた固有名をもつフレームバッファを作成
となるみたいです。
実際のソースでは
と書かれてます。ここで、glGenFramebuffersOESの1は、固有名を1個くれという意味。欲しければ2個でも3個でも要求できる。その場合viewFramebufferはviewFramebuffer[2]とかviewFramebuffer[3]とか要求する数分の配列にしないと駄目です。glBindFramebufferOESのGL_FRAMEBUFFER_OESは、今のところ、これしか指定してはいけないみたい。
でもって、glGenRenderbuffersOES、glBindRenderbufferOESは対象がレンダーバッファになるだけでglGenFramebuffersOES、glBindFramebufferOESと使い方は同じ。
さっきから連呼してるフレームバッファ、レンダーバッファがなにかというと
フレームバッファ
アフィン行列や頂点列、頂点色列なんかの描画に必要なデータを保持する。
レンダーバッファ
以下の3種類。
GL_COLOR_ATTACHMENT0:画像バッファ。
GL_DEPTH_ATTACHMENT:Zバッファ。
GL_STENCIL_ATTACHMENT:ステンシルバッファ(3D版のマスク情報というところか?)
そんな感じ。この画像バッファタイプのレンダーバッファは、OpenGL側とEAGLContext側で共有するみたいで、以下のようなAPIやメソッドで結びつけられるみたいです。
あと、Zバッファを利用したい場合は、もう一つレンダーバッファを確保して、以下のAPIで用途を設定する必要があるみたい。
glRenderbufferStorage
GL_COLOR_ATTACHMENT0として割り付けてるviewRenderbufferの方はなにもしてないところをみると、glBindRenderbufferOESでのデフォルトは画像バッファなのか?
謎。
実際のソースでは
となっていて、GL_RENDERBUFFERはこれ以外指定不可、GL_DEPTH_COMPONENT16_OESもZバッファなら、これ以外選択肢無し、backingWidth, backingHeightはglGetRenderbufferParameterivOESを使って、事前にGL_RENDERBUFFER_OESから取り出しというところでした。
あとはglFramebufferRenderbufferOESでフレームバッファと結びつけて、glCheckFramebufferStatusOESで問題が無ければ実行可能となります。
この作業は、表示領域が変わるたびに、やらなければならないみたいでlayoutSubviewsから呼び出されてます。当然、呼び出す前にdestroyFramebufferで古いフレームバッファ、レンダーバッファは破棄してますな。
実際の描画のdrawViewメソッドでは、最初のglBindFramebufferOESで、現在のフレームバッファを自分のフレームバッファに設定するのはわかるんだけど、[context presentRenderbuffer:GL_RENDERBUFFER_OES]の直前でglBindRenderbufferOESを使って、現在のレンダーバッファを自分のレンダーバッファに設定するのは意味不明。
最初、presentRenderbufferメソッドは実行されるとレンダーバッファが解放されてしまうからかと思ったんだけど、createFramebufferメソッドでglBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer)で切り替えられた後、メソッドから戻る前にglBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer)で再度設定し直しておけば、とくに直前のglBindRenderbufferOESが無くても問題なく動くような...
注)initWithCoderメソッドでdrawablePropertiesにkEAGLDrawablePropertyRetainedBackingをNOと指定してるから解放してしまう。
ま、2、3の謎は残ったけどOpenGL ESをUIViewで利用するための準備はわかったということで、あとは、注釈つけたサンプルソース読んでいってください。
次回は陰影づけ。
サンプル見てもらえるとわかるけど、どの面も均等な明るさなんだよね~。
なので、同じ色にしちゃうと判別つかなくなる。
光のあたる角度によって、明るくなる面と暗くなる面ができるようにするには、どーすればいいのかを調査っす。
------------
サンプルプロジェクト:es4.zip
ヒットしました。
glBindFramebuffer
って、
OpenGL ES 2.0 Reference Pages
に載ってるんじゃ~ん。
これによると
glGenFramebuffers フレームバッファの固有名を作成
glBindFramebuffer 与えられた固有名をもつフレームバッファを作成
となるみたいです。
実際のソースでは
glGenFramebuffersOES(1, &viewFramebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
と書かれてます。ここで、glGenFramebuffersOESの1は、固有名を1個くれという意味。欲しければ2個でも3個でも要求できる。その場合viewFramebufferはviewFramebuffer[2]とかviewFramebuffer[3]とか要求する数分の配列にしないと駄目です。glBindFramebufferOESのGL_FRAMEBUFFER_OESは、今のところ、これしか指定してはいけないみたい。
でもって、glGenRenderbuffersOES、glBindRenderbufferOESは対象がレンダーバッファになるだけでglGenFramebuffersOES、glBindFramebufferOESと使い方は同じ。
さっきから連呼してるフレームバッファ、レンダーバッファがなにかというと
フレームバッファ
アフィン行列や頂点列、頂点色列なんかの描画に必要なデータを保持する。
レンダーバッファ
以下の3種類。
GL_COLOR_ATTACHMENT0:画像バッファ。
GL_DEPTH_ATTACHMENT:Zバッファ。
GL_STENCIL_ATTACHMENT:ステンシルバッファ(3D版のマスク情報というところか?)
そんな感じ。この画像バッファタイプのレンダーバッファは、OpenGL側とEAGLContext側で共有するみたいで、以下のようなAPIやメソッドで結びつけられるみたいです。
あと、Zバッファを利用したい場合は、もう一つレンダーバッファを確保して、以下のAPIで用途を設定する必要があるみたい。
glRenderbufferStorage
GL_COLOR_ATTACHMENT0として割り付けてるviewRenderbufferの方はなにもしてないところをみると、glBindRenderbufferOESでのデフォルトは画像バッファなのか?
謎。
実際のソースでは
glRenderbufferStorageOES(
GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES,
backingWidth, backingHeight);
となっていて、GL_RENDERBUFFERはこれ以外指定不可、GL_DEPTH_COMPONENT16_OESもZバッファなら、これ以外選択肢無し、backingWidth, backingHeightはglGetRenderbufferParameterivOESを使って、事前にGL_RENDERBUFFER_OESから取り出しというところでした。
あとはglFramebufferRenderbufferOESでフレームバッファと結びつけて、glCheckFramebufferStatusOESで問題が無ければ実行可能となります。
この作業は、表示領域が変わるたびに、やらなければならないみたいでlayoutSubviewsから呼び出されてます。当然、呼び出す前にdestroyFramebufferで古いフレームバッファ、レンダーバッファは破棄してますな。
実際の描画のdrawViewメソッドでは、最初のglBindFramebufferOESで、現在のフレームバッファを自分のフレームバッファに設定するのはわかるんだけど、[context presentRenderbuffer:GL_RENDERBUFFER_OES]の直前でglBindRenderbufferOESを使って、現在のレンダーバッファを自分のレンダーバッファに設定するのは意味不明。
最初、presentRenderbufferメソッドは実行されるとレンダーバッファが解放されてしまうからかと思ったんだけど、createFramebufferメソッドでglBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer)で切り替えられた後、メソッドから戻る前にglBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer)で再度設定し直しておけば、とくに直前のglBindRenderbufferOESが無くても問題なく動くような...
注)initWithCoderメソッドでdrawablePropertiesにkEAGLDrawablePropertyRetainedBackingをNOと指定してるから解放してしまう。
ま、2、3の謎は残ったけどOpenGL ESをUIViewで利用するための準備はわかったということで、あとは、注釈つけたサンプルソース読んでいってください。
次回は陰影づけ。
サンプル見てもらえるとわかるけど、どの面も均等な明るさなんだよね~。
なので、同じ色にしちゃうと判別つかなくなる。
光のあたる角度によって、明るくなる面と暗くなる面ができるようにするには、どーすればいいのかを調査っす。
------------
サンプルプロジェクト:es4.zip