10

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

キャラクター アニメーションに頂点ごとの重みを設定したいので、頂点シェーダーに次のようなものが必要です。

attribute float weights[25];

C++ & OpenGL プログラムから属性配列を埋めるにはどうすればよいですか? 別の質問で、配列属性の属性の場所を取得し、その場所にインデックスを追加できることを見てきました。誰かが私のかなり大きな配列の例を挙げてもらえますか?

ありがとう。

4

2 に答える 2

16

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

attribute float weights[25];現在存在するほとんどのハードウェアでは、コンパイルできません。シェーダーは属性の配列を持つことができますが、各配列インデックスは新しい属性インデックスを表します。そして、現在存在するすべてのハードウェアで、属性インデックスの最大数は... 16 です。25 が必要です。これは重みのためだけです。

これで、属性を使用できることを覚えておくことで、これを簡単に軽減できvec4ます。したがって、4 つの配列要素ごとに 1 つの属性に格納します。あなたの配列は実行可能attribute vec4 weights[7];です。もちろん、重みを取得するロジックを変更する必要があります。

それでも、頂点データにとってこれが実際に意味することの影響を取り入れていないようです。各属性は、頂点のデータのコンポーネントを表します。レンダリング呼び出しの各頂点には、同じ量のデータが含まれます。そのデータの内容は異なりますが、データの量は異なります。

あなたが提案していることを行うには、メッシュ内のすべての頂点に、重みを表す 25 個の float が必要です。これが正規化された符号なしバイトとして格納されたとしても、少なくとも 25 バイト分のデータが追加されます。それは沢山。特に、大多数の頂点では、これらの値のほとんどが 0 になることを考慮してください。最悪の場合でも、1 つの頂点に影響を与える 6 ~ 7 個のボーンが表示されることになります。

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

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

于 2012-01-28T09:03:34.687 に答える
11

ニコル・ボーラスは、タスクを再構築する方法についてすでに答えを出しています。頂点に対して 25 個の float を処理すると、おそらくクォータニオン乗算によって多くの優れた GPU 処理能力が浪費されるため、これを行う必要があります。いずれにせよ、頂点のほとんどの属性は恒等変換に近い形で変換されます。

ただし、学術的な理由から、頂点ごとに 25 個の float を渡す方法を説明します。重要なのは、これに属性を使用するのではなく、何らかのバッファ (テクスチャ) からデータをフェッチすることです。GLSL 頂点シェーダー ステージにはgl_VertexID、現在処理されている頂点のインデックスを渡す組み込み変数 があります。最近の OpenGL では、頂点シェーダーからもテクスチャにアクセスできます。したがってvertex_count × 25、値を保持するサイズのテクスチャがあります。texelFetch頂点シェーダーでは、関数を使用してそれらにアクセスできます。texelFetch(param_buffer, vec2(gl_VertexID, 3));

スケルトン アニメーションで使用される場合、このシステムはテクスチャ スキニングと呼ばれることがよくあります。ただし、これはパフォーマンスを大幅に消費するため、慎重に使用する必要があります。ただし、人間の顔を正確にシミュレートしたい場合、すべての頂点を 26 の筋肉に重み付けする必要がある顔のアニメーション システムを実装する場合など、避けられない場合があります。

于 2012-01-28T09:23:51.847 に答える