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