5

頂点シェーダーでは、もちろん限られた量の均一なストレージが許可されており、コードのコンパイルに関して、異なるシステムがわずかに異なる方法で GLSL を実装する可能性があることを理解しています。頂点シェーダー コードでリテラルを書き出す代わりに、定数を使用することをお勧めします。

たとえば、次のコードは、使用可能な一様ストレージの削減につながる可能性があります。(やり方がよくわかりません。)

例 1: リテラルを使用

vec4 myVector = vec4(1.0, 0.0, 0.0, 1.0);

私の理解では、それぞれの使用1.0または0.0一定量の均一なストレージ スペースを占有する可能性があります。したがって、以前のコードを次のように変更することをお勧めします。

例 2: リテラルの代わりに定数を使用する

const float zero = 0.0;
const float one = 1.0;

vec4 myVector = vec4(one, zero, zero, one);

何が起こっているのかの背後にある議論を誰かが理解していますか? コードに問題はありません。将来問題が発生しないように、コードを適切に理解しようとしています。

私の正式な質問は次のとおりです。特にOpenGL ES 2.0を使用するiOSプラットフォームの場合、リテラル (例 1) または定数 (例 2) を使用して書き出すのがベスト プラクティスです。定数を毎回書き出すことに時間を費やすべきですか、それともリテラルを書き出して、頂点シェーダーが適切にコンパイルできない場合にのみ定数を使用するべきでしょうか?

ありがとう!

4

2 に答える 2

3

仕様に何も見つからないというキミの言及に関して、The OpenGL® ES Shading Language仕様の付録 A-7 には次の内容が含まれています。

使用される均一変数の数を計算する場合、前処理後にシェーダー ソースに存在するリテラル定数はすべて、ストレージ要件の計算に含まれます。同一の定数の複数のインスタンスは、複数回カウントする必要があります。

これはおそらく、Kimi が引用したOpenGL® ES 2.0 プログラミング ガイドの推奨事項のソースです。

ただし、仕様はこの制限を義務付けておらず、おそらくどの実装でも自由に改善できますが、iOS GL ドライバーに関してはどちらの方法も見つかりません。

興味がありますが、サンプル シェーダーをリテラルでオーバーロードするというアイデアを実際にフォローアップして、潜在的な最大均一制限に到達しようとした人はいますか?

(申し訳ありません...この回答をキミの回答へのコメントとして投稿するつもりでしたが、必要な50 Repポイントはまだありません)。

于 2013-10-04T02:14:25.287 に答える
1

OpenGL® ES 2.0 プログラミング ガイドより

リテラル値に関する限り、OpenGL ES 2.0 シェーディング言語の仕様では、定数の伝播は想定されていないと述べられています。これは、同じリテラル値の複数のインスタンスが複数回カウントされることを意味します。リテラル値を使用する代わりに、適切な const 変数を宣言する必要があります。これにより、同じリテラル値が複数回カウントされるのを回避できます。これにより、頂点の均一なストレージ要件が実装でサポートされるものを超えると、頂点シェーダーがコンパイルに失敗する可能性があります。

実際の仕様では、これに関連するものは見つかりませんでした。また、iOS 固有の情報はありません。

また、この問題 (および他の多くの問題) に取り組むために作成されたGLSL Optimizerツールを確認することもできます。

于 2012-12-20T10:54:00.987 に答える