kumaryu日記
2010-10-13
_ 日記
HYBRID W-ZERO3、使ってないのに1日であっというまに電池切れ。
使ってる時はそんなに急激に減ってもいなかった気がするんだが、おかしいな。何か電池をくいまくる設定にでもしちゃったんだろうか。
_ [Riko][OpenGL] RikoのGLES2対応
GLES2対応を進めてたんだが、なんか動いた。
まだ三角形が出るだけだが、ちょっとシェーダを変えただけで普通のOpenGL版とほぼ同じコードで動かせるようになったわ。当然っちゃ当然なんだが。
ANGLE経由でD3D9を使ってレンダリングとはいえさすがにAtomとGMA500では重いようなんだが、Mesaでシェーダのソフトウェアレンダリングさせるよりかは速そうだ。いやまだ三角しか出せてないから計れないんだ。
普通のOpenGLとGLES2はどのくらい違うのかと思ってたけど、思ったほど違ってなかったが、意外なところが違ってたりはした。
1Dテクスチャも3Dテクスチャもない*1のはあんまり使ってなかったから良い。シャドウマップというかテクスチャの比較サンプリングが無くて、無くても仕方ないかとは思った。
glTexImage2Dの違いが結構痛い。OpenGLではテクスチャメモリにとられる実フォーマットはinternal formatとして指定しといて、formatとdata typeでは与えたいイメージのメインメモリ上でのフォーマットを指定する。テクスチャメモリへの格納はドライバで勝手にフォーマット変換していれてくれる。
GLES2ではフォーマット変換はしてくれないよという話のようだ。そのためinternal formatへはformatと同じ物を指定して、それとdata typeの組み合わせで実際のinternal formatが決まるみたい。なんかめんどい話だな。
Bufferオブジェクトからメインメモリへの読み出しやMapが無い。メインメモリからBufferオブジェクトへは送る一方。ちょっと困るが必要ならメインメモリにコピー保持してりゃいいのか。TransformFeedbackとか無いしね。
MSAAのenable/disableが無い。MSAAが無いわけじゃなくて描画先がマルチサンプル可能だったら勝手に有効になるみたい。まあ確かにOFFりたいこともないわな。
GLSLとFramebufferObjectが標準である。わーい。
Renderbufferに標準でRGB8とかRGBA8のフォーマットがない!各コンポーネント4bitとか5bitが標準かよ。各コンポーネント8bitはOES拡張だ。深度も標準では16bitしか作れん。24bit作るとなるとDEPTH24_STENCIL8_OESか。
FBOのBlitとMSAAは無い…が、ANGLEの拡張にある。でも拡張はめんどいのでまだ使ってない。
GLSLはattributeにmediumpとかつけないとエラー吐かれた。省略できそうにも見えるんだが駄目なのかな。
描画設定はほとんどかわらない感じ。そんなんあったっけ程度の物が無くなってるぐらいか。
今までOpenGL版でもglBegin/glEndは使ってなかったのでほとんど困らず移行できた感じ。固定機能が無いからシェーダ書かないといけないけど、固定機能もライティング無しで頂点色×テクスチャ1枚のみで使ってたからシェーダで置き換えるのも簡単。
むしろ最低限欲しい機能が標準で入りまくっててくれるのでテクスチャフォーマットなんか以外はGLES2の方がいいくらいだ。
PCでそれなりのGPU向けにはGL3、それ以外ではANGLE+GLES2って選択肢もいいよねぇ。
*1 3Dテクスチャは拡張である。1Dテクスチャはいらないだろー