2012-01-28 9 views
9

デスクトップGLSLでは、固定サイズの浮動小数点配列を属性として頂点シェーダに渡すことは可能ですか?はいの場合、どうですか?GLSL /頂点固定サイズ配列

私はキャラクターアニメーションのための頂点の重みごとに持つようにしたいので、私は私の頂点シェーダに次のようなものを持っているしたいと思います:

attribute float weights[25]; 

私はC++ & OpenGLのプログラムから属性配列を埋めるだろうか?私は別のquestionで、配列属性の属性位置を取得し、その位置にインデックスを追加することができることを確認しました。誰かが私のかなり大きな配列の例を挙げることができますか?

ありがとうございました。

答えて

16

あなたが求めたものから始めましょう。

現在、ほとんど存在しないハードウェア上には、attribute float weights[25];がコンパイルされます。シェーダはアトリビュートの配列を持つことができますが、各アレーインデックスはの新しいアトリビュートインデックスを表します。そして、すべてのハードウェア上に現在存在する属性インデックスの最大数は... 16です。重みは、、ちょうどです。

これで、vec4属性を使用できることを覚えておくと、これを簡単に軽減できます。したがって、4つの配列要素をすべて1つの属性に格納します。あなたの配列はattribute vec4 weights[7];となります。あなたのウェイトフェッチのロジックは、もちろん変更する必要があります。

でも、実際にはの意味はの頂点データに影響しているとは思われません。各属性は、頂点のデータのコンポーネントを表します。レンダリングコールの各頂点は同じ量のデータを持ちます。そのデータの内容は異なりますが、データの量は異なります。

あなたが提案していることを実行するには、メッシュ内の頂点には重量を記述する25個の浮動小数点が必要です。これが正規化された符号なしバイトとして格納されていても、最小25バイトのデータが残っています。それは多いです。特にの広大な頂点の場合、これらの値の大部分は0になります。最悪の場合でも、単一の頂点に6〜7本のボーンが影響を及ぼす可能性があります。

一般に、スキニングは頂点シェーダで行われます.1つの頂点に影響を与えるボーンの数を4個に制限することです。この方法では、属性の配列を使用しません。重みにはvec4という属性を使用するだけです。もちろん、どの骨がどの体重に関連付けられているかを言う必要があります。したがって、その体重の骨指数を指定する2番目のvec4属性があります。

これは良いバランスを取っています。 2つの余分な属性(サイズの点で符号なしバイトになる可能性があります)のみを使用します。そして、ほとんどの頂点は1〜3本のボーンの影響を受けるだけなので、ほとんどの頂点で気付かないことがあります。いくつかは4を使い、それよりも少なくても5+を使います。そのような場合、最低の重みを切り捨て、他の重みを比例して再計算するだけです。

+2

ありがとうございました。あなたはすべての私の質問に答えました。私はこれがパフォーマンスを大幅に向上させることを願っています!再度、感謝します。 – Nicholas

11

Nicol Bolasは既にあなたの仕事を再構成する方法に答えました。おそらくいくつかの四元数の乗算を通じて、頂点の浮動小数点数が浮動小数点数を浮動させるので、GPUの処理能力は非常に浪費されます。頂点の属性のほとんどは、とにかくアイデンティティ変換に近いものに変換されます。

しかし、学問的な理由から、頂点あたり25個の浮動小数点数を渡す方法を教えてください。キーはこのための属性を使用していませんが、いくつかのバッファ、テクスチャからデータをフェッチしています。 GLSL頂点シェーダステージには、組み込み変数gl_VertexIDがあり、現在処理されている頂点のインデックスを渡します。最近のOpenGLでは、頂点シェーダからテクスチャにアクセスすることもできます。だからあなたは値を保持しているサイズvertex_count × 25のテクスチャを持っています。このシステムは、多くの場合、をスキニングテクスチャと呼ばれ、骨格アニメーションで使用される場合は、あなたの頂点シェーダではあなたがtexelFetch機能を使用して、すなわちtexelFetch(param_buffer, vec2(gl_VertexID, 3));

にそれらにアクセスすることができます。しかし、それは実際のパフォーマンスの豚であるため、控えめに使用する必要があります。しかし、人間の顔を正確にシミュレートしたい場合は、26の筋肉にすべての頂点を重み付けする必要がある顔面アニメーションシステムを実装する場合など、時にはそれを避けることはできません。

+0

非常に興味深い!私は将来の仕事のためにそれを念頭に置いておきます。 – Nicholas

関連する問題