2011-10-30 16 views
1

を数える:可変出力プリミティブは、私は私のジオメトリシェーダではこのような何かをしたいジオメトリシェーダGLSLで

uniform int maxOutputVert; 

layout(points) in; 
layout(points, max_vertices=maxOutputVert) out; 

それをコンパイルしている間、私はエラーを取得するしかし:

Error: error(#132) Syntax error: 'maxOutputVert' parse error 

とシェーダはしませんコンパイル。

シェーダの実行ごとにその変数が変わるとメモリ管理が難しくなるかもしれないが、制服は一定であるため、ここでは一貫した完全な描画呼び出しとなることが分かりました。

const int a = 5; 
layout(points, max_vertices=a) out; 

同じエラーが生成されます:私はシェーダである整数定数の権利を定義し、max_verticesカウントとしてそれを使用する場合にも失敗します。だから、これを行う方法がありますか、単にその呼び出しの中に数字を入れなければならないのですか、それともコンパイルされません。

glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &maxoutput); 

編集:第二のケースであれば、どのように私は私がメインプロセス内で照会の最大出力数を超えないことを保証することができます私はATI/AMDを使用しています言及するのを忘れてしまって申し訳ありませんとCatalystバージョンは2010.1105.19.41785(これは私が試した中で最も安定しています...)

+0

あなたがレイアウトで渡している最大数に過ぎないことを理解してください。ジオメトリシェーダは、指定された範囲内にある限り、条件付きで可変数の出力プリミティブを生成することができます。 – kvark

+0

これは本当ですが、実際にはどのように機能しますか? max_verticesを1000と定義し、20個のプリミティブしか作成しないと、1000個または20個の頂点とそのバリエーションのメモリを食べますか? – Raven

+0

私は確かにそのような過大評価には罰金があると確信していますが、私は正確にはわかりません。 – kvark

答えて

4

シェーダのレイアウトはコンパイル時に決定され、このようにパラメータ化することはできません。レイアウトの違いごとに、独自のシェーダが必要です。それでは、アップロードする前にシェーダのソースコードを変更してください。このような何か:

uniform int maxOutputVert; 

layout(points) in; 
layout(points, max_vertices=$MAXOUTPUTVERTICES$) out; 

そしてglShaderSourceにこれを提出する前に、番号と文字列$MAXOUTPUTVERTICES$を置き換える:テンプレートシェーダのソースと

スタート。

関連する問題