AndroidエミュレータでOpenGL ES2.0を動かす場合には、下記の一行が必要になる。
setEGLConfigChooser(8 , 8, 8, 8, 16, 0);
入れないとクラッシュする。実機の場合は問題ない。
OpenGL ES 2.0 / OpenGL ES 3.0 の仕様では定数の自動型変換は行われません。よって、0 などでも、floatで利用するなら、0.0 とする。(C言語のような 0.0f はエラー)
PowerVR/Tegra は 8bit、Mali-400 は 16bit、Adreno/Vivante は 32bitの精度。 参照元
Tegra ドライバのバグで、lowp, mediump, highp 等の記述位置によってエラー。
#version はシェーダーコードの 1行目になければなりません
基本的には discardは使わないべき。texture 依存 discard は shader の一番最後なら固まらない。(すべての texture フェッチが終わったあと) varying 依存 discard は texture fetch の前に入れても固まらない。(単にコンパイル時の最適化で texture 命令のあとに配置されたためだと考えられる)
Fragment Shader でシェーダー内の分岐ジャンプが多数存在する場合に、コンパイルは通るもののリンクエラーになる。1つの関数では1つのreturnのみにすること。
Uniform 配列に動的な index を与えることが出来ません。コンパイル時に求まる定数のみ。Tegra2/3/4 ではハードウエア的なバッファが用意されておらず、 Shader Program 内の命令フィールドの定数部分を直接書き換えるソフトウェア実装のため。Vertex Shaderでは問題なし。
その場合は巨大ループを設定しif文を使った動的条件で break させると良い。
shader 内で #undef を使うとそのシンボルを再定義することができない。 再定義しても参照エラーが発生
inout を使って関数から値を返すことができない。 2つ以上 inout 宣言を行った場合に発生。
変数名のあとに “[0]” が付く場合とつかない場合がある。
宣言した配列 Uniform への設定 (glUniform4fv 等) で、 Location に offset を指定した部分書き込みができない。
対処方法としては、Adreno 200 や Z430 の場合はかならずフレームバッファに 565 を選択。
FragmentShader の gl_FragCoord が、他の GPU と 1pixel ずれる。よってvarying を使って Vertex Shader から値を渡すと正しい結果となる。
Android 4.3 + Adreno 320 の組み合わせは OpenGL ES 3.0 が利用可能ですが、 OpenGL ES 3.0 で、シェーダーの UniformBlock を使うと落ちる。UniformBlock を使用していない場合は OpenGL ES 3.0 でも問題ない。(Android 4.4では修正済、バージョンチェックで要対応)
OpenGL 4.1 の OpenGL ES 2.0 Profile では、 シェーダーバージョン 1.0 を宣言しても GLSL の定数 “GL_ES” が定義され無いので、ESを利用する場合は自分で #define GL_ES を定義する。