あなたが求めたものから始めましょう。
現在、ほとんど存在しないハードウェア上には、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+を使います。そのような場合、最低の重みを切り捨て、他の重みを比例して再計算するだけです。
ありがとうございました。あなたはすべての私の質問に答えました。私はこれがパフォーマンスを大幅に向上させることを願っています!再度、感謝します。 – Nicholas