ユーザ用ツール

サイト用ツール


opengl:glsl

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
opengl:glsl [2014/03/17 18:56] – [DirectX HLSL] ogaopengl:glsl [2015/09/17 01:40] (現在) – [Tegra2 だけ Fragment Shader が動かない] oga
行 20: 行 20:
 === 利点 === === 利点 ===
  
-  * offline コンパイラが時間をかけて最適化でき。 +互換性が非常に高い 
-  * offline コンパイラなのでエラー出力がしっかりしており原因がわかりやすい。 + 
-  * コンパイル時に共通の最適化が施されており、ランタイム時の変換時間を短縮でき。 +  * offline コンパイラが時間をかけて最適化できます。 
-  * 単一のコンパイラなので構文解析や動作が明らか、実行時に構文の差など基礎的な部分で詰まることがない。 +  * offline コンパイラなのでエラー出力がしっかりしており原因がわかりやすくなってます。 
-  * GPU ドライバが言語に独自機能を追加することが出来ないため、ソースコード互換性が保たれます。+  * コンパイル時に共通の最適化が施されており、ランタイム時の変換時間を短縮できます。アプリケーションの起動が速くなります。 
 +  * GPU に依存せず常に単一のコンパイラなので構文解析や動作が明す。構文の差など基礎的な部分で詰まることがありません。 
 +  * GPU ドライバが独自機能を追加することが出来ないため、ソースコード互換性が保たれます。
  
  
 === 欠点 === === 欠点 ===
  
-  * バージョンが変わり、機能拡張した場合は中間のバイトコードも合わて拡張する必要があります。 +GPUの個性活かない 
-    ドライバが独自に機能追加することができません。 + 
-    * 例えば GPU 倍精度演算に対応していても言語仕様が更新されなければ利用できませんでした+  GPU 新しい機能追加されてもぐに利用できません。メジャーアップデートを待つ必要があります。 
 +    * アップデートは年単位で時間かかり、また共通仕様として採用されなければ使うことができません。
   * ハードウエアの性能が高くても中間バイトコードの制限を受けることがあります。   * ハードウエアの性能が高くても中間バイトコードの制限を受けることがあります。
     * 例えばハードウエア的にはより多くのメモリにアクセスできる場合でも、バイトコードのレジスタフィールド幅が決められていればシェーダープログラムはそれ以上のメモリにアクセスすることができません。     * 例えばハードウエア的にはより多くのメモリにアクセスできる場合でも、バイトコードのレジスタフィールド幅が決められていればシェーダープログラムはそれ以上のメモリにアクセスすることができません。
 +  * コンパイル済みのシェーダーバイトコードを使用するので、コンパイラの性能が上がっても既存のアプリケーションでは恩恵が受けられないことがあります。
 +
  
  
 ==== OpenGL GLSL ==== ==== OpenGL GLSL ====
  
-中間バイトコードが存在しません。 +共通の中間バイトコードが存在しません。 
-テキストコードのパーサーからオプティマイザまで+テキストコードのパーサーからオプティマイザ、コードジェネレータまで
 GPU ドライバ側に含まれることになります。 GPU ドライバ側に含まれることになります。
  
行 46: 行 51:
   - 動的に GPU ドライバがコンパイルを行い、直接ネイティブコードを生成する   - 動的に GPU ドライバがコンパイルを行い、直接ネイティブコードを生成する
  
-コンパイラ時間短縮のため、OpenGL ES では Native のバイトコードを出力&生成できる場合があります。 +コンパイラ時間短縮のため、OpenGL ES では Native のバイトコードを出力&生成できる拡張機能を持っています。 
-ただし offline コンパイラ単独はほとんど提供されておらず、ハードウエア毎にバイトコードの互換性ありません。+ただし実装ドライバ依存あり、ハードウエア毎にバイトコードの互換性ありません。
  
  
行 55: 行 60:
   * 中間バイトコードの制限を受けません。   * 中間バイトコードの制限を受けません。
   * 動的にコンパイルするため、コンパイラ(ドライバ)の改良の恩恵を受けやすくなります。   * 動的にコンパイルするため、コンパイラ(ドライバ)の改良の恩恵を受けやすくなります。
 +    * 例えばアプリケーションに一切手を加えなくても、ドライバに含まれるコンパイラが改良されると、シェーダーがさらに最適化される可能性があります。
   * GLSL のための特殊なツールが不要です。ドライバのほか既存の OpenGL lib とヘッダファイルだけで開発できます。   * GLSL のための特殊なツールが不要です。ドライバのほか既存の OpenGL lib とヘッダファイルだけで開発できます。
 +  * シェーダーはソースコードのまま組み込むことが前提なので、アプリケーションが動的にソースコードを生成することができます。
  
  
 === 欠点 === === 欠点 ===
  
-  * GPU メーカー毎にコンパイラの実装が違うので、構文やエラー判定など細かな違いではまることがあります。 +  * GPU メーカー毎にコンパイラの実装が違うので、構文やエラー判定など細かな違いで悩むことがあります。 
-  * シェーダープログラムが複雑になるほど実行時にコンパイル時間が必要となります。起動が遅くなります。 +  * シェーダープログラムが複雑になるほど実行時にコンパイル時間が必要となります。アプリケーションの起動が遅くなります。 
-  * コンパイル時間や動作メモリの制限があるため極端に強い最適化ができません。 +  * コンパイル時間や動作メモリの制限があるため極端に強い最適化ができません。 
-  * ただの syntax error であっても実行しないとわからないことと、GLES ではドライバによってエラーメッセージが返らないことがありす。 +  * ただの syntax error であっても実行してみないとバグがわかりません。 
-  * HLSL や Cg, OpenCL 等が比較的 C言語に近いのに対して独自の構文となっています。+  * GLES ではドライバによってエラーメッセージが返らないことがあり、デバッグが困難です。 
 +  * HLSL や Cg, OpenCL 等が比較的 C言語に近いのに対して、GLES は独特な独自の構文となっています。
  
  
行 72: 行 80:
 やはり一番大きいのは互換性の問題だと思われます。 やはり一番大きいのは互換性の問題だと思われます。
  
-Desktop の場合はほぼ 2強 ( + 1 ) しかなかったので+Desktop の場合は長い間ほぼ 2強 ( + 1 ) しかなかったので
 互換性が問題になることは稀でした。 互換性が問題になることは稀でした。
 2種類のビデオカードを用意して動作確認することは簡単だし、 2種類のビデオカードを用意して動作確認することは簡単だし、
 NVIDIA/AMD の両対応は Direct3D でも同様に必要なことなので負担にはなっていませんでした。 NVIDIA/AMD の両対応は Direct3D でも同様に必要なことなので負担にはなっていませんでした。
-ドライバの問題があった場合でも、直接 GPU メーカーの最新ドライバが使えるため自分で更新すれば解決です。+ドライバの問題があった場合でも、ユーザーが直接 GPU メーカーの最新ドライバをインストールできるためある程度自分で解決できます。
  
  
 ところが Mobile の世界では簡単には行きません。まず Desktop よりも GPU core の種類が多くなっています。代表的なものでも ところが Mobile の世界では簡単には行きません。まず Desktop よりも GPU core の種類が多くなっています。代表的なものでも
  
-  * Qualcomm Adreno シリーズ +  * GLES 2.0 
-  * Imagination PowerVR シリーズ +    * Qualcomm Adreno 200 シリーズ 
-  * NVIDIA Tegra (ULP GeForce) シリーズ +    * Imagination PowerVR SGX シリーズ 
-  * ARM Mali シリーズ+    * NVIDIA Tegra2/3/(ULP GeForce) シリーズ 
 +    * ARM Mali-200/400 シリーズ 
 +    * Vivante GC シリーズ 
 +  * GLES 3.0 
 +    * Qualcomm Adreno 300 シリーズ 
 +    * Imagination PowerVR G6000 シリーズ 
 +    * ARM Mali-T600 シリーズ 
 + 
 など など
  
-同じ GPU core であったとしても SoC 違えば能が本当に同一かどうかはわかりません。 +同じ GPU core であったとしても SoC 違えば異なる構成になっている可りま。 
-PowerVR や Mali は様々な組み合わせで使われています。+PowerVR や Mali、Vivante は様々なメーカーに採用されており、組み合わせの種類も膨大です。
  
-スマートフォンやタブレットなど、それを採用するメーカーもまたばらばらです。 +スマートフォンやタブレットなど、SoC を採用するメーカーもまたばらばらです。 
-それぞれどのバージョンのドライバが使われているかわかりませんし、自由にドライバを入れ替えることできません。 +それぞれどのバージョンのドライバが使われているかわかりませんし、PC のようにユーザーが自由にドライバを入れ替えることできません。 
-OS のバージョンも複数混在しており種類は膨大な数になります。+Android の場合はさらに OS のバージョンも複数混在しており、その種類は膨大な数になります。
  
 このように数多く存在している端末を全部集めてテストすることは非常に困難です。 このように数多く存在している端末を全部集めてテストすることは非常に困難です。
 +
  
 ===== 注意すべきこと ===== ===== 注意すべきこと =====
行 103: 行 120:
 たとえ GLSL の文法上正しかったとしても、動かないハードが一つでもあるならそれは避けなければなりません。 たとえ GLSL の文法上正しかったとしても、動かないハードが一つでもあるならそれは避けなければなりません。
  
-バグだったとしてもそれにパッチが当たる可能性は低く、修正されたとしても更新まで非常に時間がかかるからです。+バグだったとしてもパッチが当たる可能性は低く、修正されたとしても更新まで非常に時間がかかるからです。
  
  
行 118: 行 135:
 内部構成を見てできるだけバリエーション違いのハードを手に入れるようにします。 内部構成を見てできるだけバリエーション違いのハードを手に入れるようにします。
  
-例えば 2010 年の日本メーカー製端末はほとんど全部が Qualcomm QSD8250/8650 で Adreno200 なので、 +例えば 2010 年の日本メーカー製端末はほとんど全部が Qualcomm QSD8250/8650 Adreno200 なので、 
-GLSL プログラマ的には複数手に入れてもあまり意味がありません。+OpenGL ES / GLSL プログラマ的には同じ構成の端末を複数手に入れてもあまり意味がありません。
 その中で唯一 Galaxy S は PowerVR SGX540 なので、もし選ぶならこのように GPU の違いを意識しておきます。 その中で唯一 Galaxy S は PowerVR SGX540 なので、もし選ぶならこのように GPU の違いを意識しておきます。
  
行 127: 行 144:
 ==== GPU Emulator を活用する ==== ==== GPU Emulator を活用する ====
  
-各 GPU メーカーは PC 上で動作する GPU Emulator (OpenGL ES 2.0 Emulator) をツールとして提供しています。+各 GPU メーカーは PC 上で動作する GPU Emulator (OpenGL ES 2.0 / 3.0 Emulator) をツールとして提供しています。
 できるだけ多くの GPU の GLSL をパスするためにはこれを活用しない手はありません。 できるだけ多くの GPU の GLSL をパスするためにはこれを活用しない手はありません。
 実端末の入手は難しいですが、 実端末の入手は難しいですが、
 これなら PC 上である程度の互換性テストができるようになります。 これなら PC 上である程度の互換性テストができるようになります。
  
-  * [[opengl:glesemulator|OpenGL ES 2.0 Emulator 一覧]] 
  
 +  * [[opengl:glesemulator|OpenGL ES 2.0/3.0 Emulator 一覧]]
  
-ただし問題もあります。 
-HOST PC の GPU の種類や OpenGL のドライバにかなり依存します。 
-NVIDIA / AMD でそれぞれ正しく動かない場合があるので注意が必要です。 
  
 +ただし問題もあります。
 +これらの Emulator は HOST PC の GPU の種類や OpenGL のドライバにかなり依存します。
 +NVIDIA / AMD / Intel でそれぞれ正しく動かない場合があるので注意が必要です。
  
 +また Mobile と同じシェーダーを走らせられるよう、PC (Windows/Mac OSX/Linux 等) 上にも実行環境を作っておく必要があります。
  
 ====== GLSL ES の問題情報共有用 ====== ====== GLSL ES の問題情報共有用 ======
行 155: 行 173:
  
  
- +(追記) Android 4.4 では修正されており、正しく動作するようになりました。 
 +ただし世の中には Android 4.3 のまま更新されていないデバイスも多いので、 
 +なんらかの対策は必要です。
  
 ===== OpenGL ES 2.0 GLSL 構文 ===== ===== OpenGL ES 2.0 GLSL 構文 =====
行 246: 行 265:
 </code> </code>
  
-==== GLSL ES 1.1 を返す ====+==== Tegra Emulator が GLSL ES 1.1 を返す ====
  
 PC の Tegra Emulator が GLSL の version 1.1 を返します。 PC の Tegra Emulator が GLSL の version 1.1 を返します。
行 566: 行 585:
 ==== Android PowerVR SGX GLSL ES 2.0 関数パラメータ inout が無効になる (2014/03/16 追加) ==== ==== Android PowerVR SGX GLSL ES 2.0 関数パラメータ inout が無効になる (2014/03/16 追加) ====
  
-  * PowerVR SGX 540 + Android 4.1 + OpenGL ES 2.0+  * PowerVR SGX540 + Android 4.1 + OpenGL ES 2.0 で再現 
 +  * PowerVR SGX543MP3 + iOS7.1 + OpenGL ES 2.0 では問題ない
  
  
 Android PowerVR SGX GLSL で、inout を使って関数から値を返すことができない。 Android PowerVR SGX GLSL で、inout を使って関数から値を返すことができない。
 +2つ以上 inout 宣言を行った場合に発生。
  
 <code glsl> <code glsl>
行 599: 行 620:
  
 PowerVR 以外の Adreno, Vivante, GeForce (desktop) などでは問題なく動作しています。 PowerVR 以外の Adreno, Vivante, GeForce (desktop) などでは問題なく動作しています。
 +また iOS の PowerVR では他の GPU と同じように正しく動いています。
  
 対策方法としては、hlsl でよく用いられるように構造体を使う方法があります。 対策方法としては、hlsl でよく用いられるように構造体を使う方法があります。
行 790: 行 812:
 Android OS 2.2 の Tegra2 では動作することが判明しました。 Android OS 2.2 の Tegra2 では動作することが判明しました。
 ハードウエアではなく、ドライバなど他に原因が有りそうです。 ハードウエアではなく、ドライバなど他に原因が有りそうです。
 +
 +
 +==== Tegra3 で OffScreen へのレンダリング時に Blend が有効にならない (2015/09/17) ====
 +
 +Android 4.0 の古いドライバで発生します。
 +OS 更新で新しいドライバが適用されると直ります。
 +
 +
 +==== Vivante GC4000 (K3V2) で動的に生成した Mipmap が有効にならない (2015/09/17) ====
 +
 +詳細は未確認です。使い方に問題がある可能性があります。
 +
 +
 +
 +
 +
 +
 +
 +
  
opengl/glsl.1395050162.txt.gz · 最終更新: 2014/03/17 18:56 by oga

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki