ドライバによって解釈されます。コンパイラが存在しておりそれぞれ実装が異なっています。大きな違いとなっています。コンパイラを使います。よる動作と同じで事前コンパイルながらターゲットハードウエアに依存しません。ようにソースからの動的なコンパイルも可能です。コンパイラが時間をかけて最適化できます。コンパイラなのでエラー出力がしっかりしており、原因がわかりやすくなっています。コンパイル時に共通の最適化が施されており、ランタイム時の変換時間を短縮できます。アプリケーションの起動が速くなります。依存せず常に単一のコンパイラなので、構文解析や動作が明確です。構文の差など基礎的な部分で詰まることがありません。ドライバが独自の機能を追加することが出来ないため、ソースコード互換性が保たれます。新しい機能が追加されてもすぐに利用できません。メジャーアップデートを待つ必要があります。アップデートは年単位で時間がかかり、また共通仕様として採用されなければ使うことができません。ハードウエアの性能が高くても中間バイトコードの制限を受けることがあります。ハードウエア的にはより多くのメモリにアクセスできる場合でも、バイトコードのレジスタフィールド幅が決められていればシェーダープログラムはそれ以上のメモリにアクセスすることができません。コンパイル済みのシェーダーバイトコードを使用するので、コンパイラの性能が上がっても既存のアプリケーションでは恩恵が受けられないことがあります。GLSL共通の中間バイトコードが存在しません。ドライバ側に含まれることになります。バイトコードを出力&生成できる拡張機能を持っています。実装はドライバ依存であり、ハードウエア毎にバイトコードの互換性がありません。利点ソースコードなので機能拡張の制限がありません。中間バイトコードの制限を受けません。動的にコンパイルするため、コンパイラ(ドライバ)の改良の恩恵を受けやすくなります。アプリケーションに一切手を加えなくても、ドライバに含まれるコンパイラが改良されると、シェーダーがさらに最適化される可能性があります。ための特殊なツールが不要です。ヘッダファイルだけで開発できます。シェーダーはソースコードのまま組み込むことが前提なので、アプリケーションが動的にソースコードを生成することができます。メーカー毎にコンパイラの実装が違うので、構文やエラー判定など細かな違いで悩むことがあります。シェーダープログラムが複雑になるほど実行時にコンパイル時間が必要となります。アプリケーションの起動が遅くなります。コンパイル時間や動作メモリの制限があるため、極端に強い最適化ができません。あっても実行してみないとバグがわかりません。ドライバによってエラーメッセージが返らないことがあり、デバッグが困難です。独特な独自の構文となっています。問題やはり一番大きいのは互換性の問題だと思われます。互換性が問題になることは稀でした。同様に必要なことなので負担にはなっていませんでした。メーカーの最新ドライバをインストールできるためある程度自分で解決できます。世界では簡単には行きません。種類が多くなっています。違えば異なる構成になっている可能性があります。様々なメーカーに採用されており、組み合わせの種類も膨大です。採用するメーカーもまたばらばらです。ようにユーザーが自由にドライバを入れ替えることができません。バージョンも複数混在しており、その種類は膨大な数になります。このように数多く存在している端末を全部集めてテストすることは非常に困難です。互換性を重視した書き方が求められることになります。文法上正しかったとしても、動かないハードが一つでもあるならそれは避けなければなりません。バグだったとしてもパッチが当たる可能性は低く、修正されたとしても更新まで非常に時間がかかるからです。多くのハードウエアでテストする必要があります。内部構成を見てできるだけバリエーション違いのハードを手に入れるようにします。プログラマ的には同じ構成の端末を複数手に入れてもあまり意味がありません。違いを意識しておきます。日本で発売された端末一覧。ツールとして提供しています。パスするためにはこれを活用しない手はありません。上である程度の互換性テストができるようになります。一覧ただし問題もあります。ドライバにかなり依存します。それぞれ正しく動かない場合があるので注意が必要です。上にも実行環境を作っておく必要があります。