一度に 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 つのスキン バッファに非常に多くのフレームがあります。