愚痴りたくなった。
率直に言って、OpenGL ES2.0のシェーダーコンパイラ設計した奴、バカだろ。
シェーダー内に宣言しているuniformと呼ばれるコンスタントレジスタが使用されていないとマッピングされず、マッピングが固定できないのが大問題。それならそれで、最適化を抑制するプレフィクスなり、共有を示唆するプレフィックスなりオプションなりあればよいのだが、それもない。
ならば、ダミーのファンクション内でuniformを使用してコンパイラを騙そうとしても、そのファンクション自体も最適化されてしまうことで、やはりuniformも数珠繋ぎ状にカットされてしまう。
これの何が問題かというと、コンスタントレジスタがプログラムオブジェクト(バーテックス&フラグメントシェーダーをリンクした実効バイナリ)間で共有する事ができなくなるので、プログラムオブジェクトが変わる度に、使用するGPUコンスタントレジスタをすべて更新しなければならなくなるのだ。
たとえば、スキニングに使用するマトリックスパレットは通常同一メッシュ内なら変更する必要はないのだが、クラスタ単位でマトリックスパレットを設定し直すという間抜けな事をしなければならない。
この間抜けな設計によって OpenGL ES2.0のシェーダーコンパイラを使用するすべてのデバイスが無用なパフォーマンスダウンを被ることになる。
おまけに、ヘッダーすらインクルードできないうえに、外部参照シンボルの解決もやってくれないので、分割コンパイルができない。 史上最悪だねこれは。ありえない。