ステップアップ OpenGL ES 2.0
0. OpenGL スケルトン Android では、GLSurfaceView の枠組みの中で OpenGL を処理する形になる。 1. タイルを表示するサンプル 4 個の頂点座標データに基いて、たった一つの矩形のタイルを描くだけだが、この最初の一歩の段階で一挙にハードルが上がる。主には、シェーダーで定義した変数を通じて頂点データを入力するための手続。あとは Kotlin / Java 固有の話として、ダイレクトバッファの形でデータを OpenGL 側に入力するという点。 シェーダー Kotlin / Java 側では、シェーダーは String データに過ぎないが、OpenGL 内部での処理を GLSL で定義するもの。C 言語的なスクリプトであり、公式の クイックリファレンスカード によくまとまっている(詳細な リファレンス も公開されている)。gl_* が予約された変数で、この変数に意図した値を出力することで OpenGL 内の次の処理へと頂点データが渡ることになる。 このサンプルでは、a_Position を通じて Kotlin / Java 側から入力した値をそのまま次へリレーしている。またフラグメントシェーダーにおいては、u_Color を通じて Kotlin / Java 側からセットした値をそのまま各フラグメント(ピクセル)の色として渡している。ちなみに、u_Color は uniform なので、いわゆるグローバル変数的なものとして定義されており、4 つの全ての頂点間で共有されている。一方の a_Position の方は attribute であり、各頂点毎に属する値である(cf. クイックリファレンス p3 Qualifiers)。 シェーダーの使い方 各シェーダーをコンパイルし、バーテックスとフラグメントを組み合わせて一つのシェダープログラムとし、さらに今有効なプログラムとしてそれをセットする(シェーダープログラムは複数用意して使い分けることも可能なため)。 シェーダー変数の確保 シェーダープログラムから、OpenGL への入力に使用するシェーダー変数(のポインターインデックス)を得る。 頂点データの配列 Kotlin / Java 固有の話として、JavaVM 内部のメモリーヒープを使うわけにはいかな...