9

一度に 3 つの頂点バッファーを使用しています (実際には多数ありますが、一度に使用されるのは 3 つだけです)。

これらには、シェーダーで混合されて目的の出力 (2D スケルトン アニメーション) を生成する情報が含まれています。

任意のフレームでのボーンの位置/回転/スケールを含む2 つのボーンバッファがあります。

ワールド原点(0,0)にあるかのようにテクスチャの領域をレンダリングするための頂点を含むスキンバッファが 1 つあります。

シェーダーでは、2 つのボーン バッファーがイージング値と結合され (ユニフォームとして渡されます)、スキンの頂点を変換することで、パーツが正しい場所にレンダリングされます。

これは優れたパフォーマンスを発揮し、私が始めた場所よりも優れた改善です。GPU ですべてを計算し、x/y/u/v 座標を渡すだけで、フレームごとに非常に多くのデータを GPU にストリーミングすることによって制限されていました。

ただし、重複した情報が多数あります。スキン バッファには、必要なものだけが含まれます。スキン パーツごとに 4 つの頂点があり、それぞれが一意です。

ただし、ボーンと結合されると、各ボーンの頂点が 4 回複製され、スキン バッファと一致します。モバイルで作業していると、メモリが不足しているため、これは非常に苦痛であり、無駄が多いことに悩まされています。

これは、ボーンが 1 つしかない場合のバッファーの外観です。

ボーン バッファー 1

[x1,y1,rot1] [x1,y1,rot1] [x1,y1,rot1] [x1,y1,rot1]

ボーン バッファー 2

[x2,y2,rot2] [x2,y2,rot2] [x2,y2,rot2] [x2,y2,rot2]

スキンバッファー

[xA,yA,uA,vA] [xB,yB,uB,vB] [xC,yC,uC,vC] [xD,yD,uD,vD]

完全なシェーダーは投稿しません。余分なことが多すぎるためです (回転とスケールは同様に機能します)。

attribute vec2 bonePosition1; // x1, y1
attribute vec2 bonePosition2; // x2, y2
attribute vec2 skinPosition; // xA (or xB .. ), yA (or yB .. )
uniform float a; // Some value 0..1 depending on time
...
vec2 bonePosition = mix(bonePosition1, bonePosition2, a);
vec2 combinedPosition = skinPosition * bonePosition;

ノート; 私は主に iOS をターゲットにしているので (他のものもそうですが、最も制限が厳しいです)、16 の属性に制限されていることはわかっています。

ボーン バッファのメモリ フットプリントを縮小する方法はありますか? 1 つのスキン バッファに非常に多くのフレームがあります。

4

1 に答える 1

0

GL_ELEMENT_ARRAY_BUFFERご覧のとおり、データを含むバッファー ( ) には、複数のインデックス バッファー ( ) をバインドする必要がありますGL_ARRAY_BUFFER。2 つGL_ARRAY_BUFFERのバッファーをバインドできた場合は、別のバッファーもバインドできる可能性がありますGL_ELEMENT_ARRAY_BUFFER。これが OpenGL ES で実装できるかどうかはわかりません。これが不可能な場合は、float の代わりに整数を使用してメモリを節約できますが、これはボーンの移動/回転値には適用できないと思います。

ご指摘について。vec216 個のアトリビュートの制限を克服するために、より小さなアトリビュートを に組み合わせることができますvec4。たとえば、bonePosition1andbonePosition2を 1 つに結合できますvec4

attribute vec4 bonePosition12;

そして、シェーダーで次のように使用します。

vec2 bonePosition1 = vec2(bonePosition12.x,bonePosition12.y);
vec2 bonePosition2 = vec2(bonePosition12.z,bonePosition12.w);

これはパフォーマンスに多少の影響を与える可能性がありますが、このコードは頂点シェーダーにあるため、シェーダーの計算と比較して、パフォーマンスの低下は無視できるはずです。同様のコードを使用して (フラグメント シェーダーで) 色を操作しましたが、パフォーマンスは問題ありません。

于 2012-11-13T06:05:30.843 に答える