頂点が割り当てられて重み付けされるボーンごとに 1 つの 4×4 マトリックスが 2 つしかないため、2 つの 4 ベクトル 4×4 マトリックス乗算と重み付き合計のみを実行する必要があります。
これとは対照的に、別のクォータニオンと変換として送信する場合は、2 つの 3 ベクトル 3×3 行列の乗算と、4 つの 3 ベクトル 3 ベクトルの加算、および加重和に相当する計算を行う必要があります。最初に四元数を最初に回転行列に変換してから、3 ベクトルの 3×3 行列の乗算に変換するか、直接 3 ベクトルの四元数乗算を行うか、計算量はほぼ同じです。その後、モデルビュー行列で事後乗算する必要があります。
クォータニオンとして均一な 4 要素ベクトルを使用することは完全に可能ですが、頂点シェーダーで多くの計算をチェーンする必要があります。最初に頂点を 2 つのクォータニオンで回転させ、次にそれを変換してから、モデルビュー マトリックスで乗算します。 . シェーダーで重み付けされた 2 つの変換マトリックスをアップロードするだけで、GPU で多くの計算を節約できます。CPU で四元数行列の乗算を実行すると、ボーンごとに1 回だけ計算が実行されますが、シェーダーで実行すると、単一の頂点ごとに計算が実行されます。GPU は、さまざまな入力日付で多数の同一の計算を行う必要がある場合に最適です。しかし、大量のデータで再利用される少数の値のみを計算する必要がある場合、それらは最悪です。ただし、CPU はこの種のタスクを好みます。
4×4 行列で表される均一な変換の良い点は、1 つの行列に変換チェーン全体を含めることができることです。回転と平行移動を分離すると、操作のチェーン全体を順番に実行する必要があります。回転と平行移動が 1 回だけなので、1 回の 4×4 マトリックス変換よりも操作が少なくなります。単一の変換を追加すると、損益分岐点に達します。
メッシュに適用されたスケルトン ポーズであっても、変換行列は同一です。すべての頂点に対して。メッシュが 1 組のボーンの周りに 100 個の頂点を持っているとします (これは小さい数です)。その場合、頂点ごとに上記の計算を行う必要があり、貴重な GPU 計算サイクルが浪費されます。そして何のために?32 個のスカラー値 (または 8 個の 4-ベクトル) を決定します。これを比較してください: 100 個の 4-ベクトル (頂点位置のみを考慮する場合) と 8 個のみ. CPU で 1 回計算し、事前に計算された GPU を与えて、プリミティブ間で共有します。正しくコーディングすると、単一の行列列の計算全体が CPU のパイプラインにうまく収まり、並列化のすべての試みよりもはるかに優れたパフォーマンスを発揮します。並列化は無料ではありません!