2

頂点シェーダーからジオメトリシェーダーに、頂点ごとに任意の数のさまざまな値を渡すことができるようにしたいと思います。OpenGLには動的配列がないことを知っているので、コンパイル時に番号を指定する必要があります。すべては、NVIDIAGeForce9400MグラフィックカードとOpenGL2.1のみを提供するドライバといくつかの拡張機能を備えたAppleMacBookで実行する必要があります。

ここでの問題は、ジオメトリシェーダーが、頂点ごとに1つの要素を持つフォームまたは配列で入力を受け取ることであるように思われます。私の知る限り、私のセットアップで使用できる配列の配列はなく、配列を含むインターフェイスブロックの配列もありません。これまでのところ、私が思いついた最善の解決策は、この情報を渡すためにいくつかの変数を指定し、頂点シェーダーの配列から抽出して、ジオメトリシェーダーで特定のストライド長の配列に戻すことです。そうすれば、計算されたインデックスを使用して値へのアクセスを実行できます。

より良い、よりエレガントな方法はありますか?

4

2 に答える 2

5

EXT_geometry_shader4 仕様から:

ユーザー定義の可変変数は、頂点シェーダーで配列として宣言できます。これは、ジオメトリ シェーダーへの入力時に、2 次元配列として宣言する必要があることを意味します。詳細については、OpenGL Shading Language Specification のセクション 4.3.6 および 7.6 を参照してください。

たとえば、頂点シェーダーでは、次のように指定できます。

varying vec2 value[2];

ジオメトリ シェーダーでは、これは 2 次元配列になります。たとえば、三角形を入力プリミティブとして使用します。

varying in vec2 value[3][2];

直感に反する配列インデックスの順序に注意してください! また、整数定数を使用して、配列の次元を明示的に指定する必要があることに注意してください。非定数整数変数または gl_VerticesIn を使用すると、コンパイラ エラーが発生します。両方のコメントは、質問で言及されているまさに MacBook Pro モデルでテストされています。

于 2012-10-31T15:06:33.513 に答える
2

コア OpenGL のジオメトリ シェーダーが EXT_geometry_shader4 のように機能しないのには理由があります。これはそれらの1つです。EXT_geometry_shader4 は、値の配列の配列を許可することを意味するため、入力の配列を許可しません。そして、GLSL はそれを処理できません (まあ、最近までですが、それはわずか 2 か月前のことです)。

インターフェイス ブロックには配列を含めることができます問題は、GLSL 1.20にインターフェイス ブロックがないことです。

さまざまな変数を使用し、すべてのループを手動で展開する以外にできることはあまりありません。整数値を取り、そのインデックスに対応するさまざまな値の 1 つを条件付きで返す関数を作成することもできますが、これは、古い学校の GLSL で得られる最高のものです。

于 2012-10-25T17:14:34.543 に答える