OpenGLES2.0 のあれこれメモ

iOS6のiPhone4で確認しているので、iPhone4をミニマムスペックとしている人用のメモです。

iPhone4より性能がいい端末は、ここまで気を遣わなくてもいいはず‥。

・InstrumentsでOpenGL解析を使用して毎フレーム警告がでる部分は
解消すればそれなりに処理時間も改善されている模様。

・Mipmapは1.1同様、2の累乗サイズでしか作成できない。
必要ないならデフォルトで有効になっているので、テクスチャフィルタの設定で無効にする。
Mipmapを使わなければ、OpenGLES2からテクスチャサイズの2の累乗制限を受けないで自由度が増す。

・サイズの大きい画像は圧縮テクスチャにしてから使った方が何かといいみたい。

・でもベタ絵は苦手で圧縮テクスチャにすると劣化がわかりやすくなる事が多かった。写真系はOK。

・作成できる最大テクスチャサイズは、GL_MAX_TEXTURE_SIZEで取得できるがそのまま使用しない事。
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);のように関数経由で取得してから
その変数を使用する。

・glGet系はできるだけ呼ばないように心がける。
例えば、上記の最大テクスチャサイズを毎フレーム調べるような処理はせず初期化時一回で済ませる。

・頂点シェーダもフラグメントシェーダも最終的に変数はfloatで扱う。
色情報をGL_UNSIGNED_BYTEで転送した場合は、
そのattribute変数の各種RGBAを255.0で割った値を最終的にシェーダに渡す。

・フラグメントシェーダはいるのか?ってくらいシンプルなものを心がける。
iPhone4 では、条件分岐だけでも使い方を工夫しないと重くなりやすい模様。
頂点シェーダで計算できるものは全部頂点シェーダで計算し、
varying経由で結果をフラグメントシェーダに渡して参照させるだけにした方が良い。

・attributeは頂点シェーダのみに渡せる変数
varyingは頂点シェーダからフラグメントシェーダに渡せる変数と覚える。
uniformは頂点シェーダ、フラグメントシェーダ両方に渡せる変数

・80ピクセル平方のスプライトをFPS60を切るまで画面中に散乱させたら
250枚前後しか出せず落胆。が、32ピクセルだと1200枚を超えたのでタイルサイズの考慮が大事?

[追記]
ブレンディングをしないと80ピクセルも1200近く出た。

円の描画も円のテクスチャではなく、円型ポリゴンをブレンドかけずに出したほうが早いかも?

OpenGLES2.0は、1.1より気難しくて意外と苦労しますね…。