2011-01-16 49 views
3

OpenGL 3.1を実行すると、質問は簡単です。ここでGLSLサイトから動的ブロック数

は、1が均一なバッファブロックの配列を定義する方法です。

uniform BlockName 
{ 
    vec3 blockMember1, blockMember2; 
    float blockMember3; 
} multiBlocks[3]; 

、それはこれらのマルチブロックの動的な数を持つことが可能ですか? GLSLにはポインタがありませんので、 "新しい"文などはありません。

もしそうでなければ、動的な要素数を送信する他の方法はありますか? ブロックは現在4つのフロートと1つのvec2をパックしています。

あなたが何かを提案することができますので、私はまだシェーダを書いていない

、感謝;)

答えて

1

[OK]をので、私は、OpenGLのフォーラムにも書いたとthis came out

のでbasicalyあなたは3つの解決策があります:準備の要素のいくつかの数が多いと 制服バッファオブジェクトやテクスチャバッファまたは静的な配列をし、実際のサイズを指定するための別の制服を使用します。

最後のものは、OneSadCookieのコンパイル時の最大サイズの定義でアップグレードできます。

1

あなたはそれらの動的な数を持つことができない、とあなたはそれらの中に動的インデックスを持つことはできません。つまり、カウントを動的に変更できたとしても、シェイダーコードを変更して新しい要素にアクセスする必要があるため、ほとんど役に立たないことを意味します。

一つの可能​​な選択肢は、ブロック部材アレイを作るために次のようになります。

#define BLOCK_COUNT %d 

uniform BlockName 
{ 
    vec3 blockMember1[BLOCK_COUNT]; 
    vec3 blockMember2[BLOCK_COUNT]; 
    float blockMember3[BLOCK_COUNT]; 
} 
multiBlocks; 

次にあなたがメンバーの数を変更するBLOCK_COUNTを変更することができ、そしてあなただけの罰金、動的インデックスを使用することができます。

multiBlocks.blockMember2[i]; 

シェイダーを再コンパイルせずに要素数を変更することはできません。