回答:
一般的に言えば、メッシュ変換はGPUで行われます。変換マトリックスをGPUに送信すると、シェーダーはそれをメッシュのすべての頂点に適用します。
GPUを使用してマトリックス自体を計算することは別の問題であり、最終的な変換マトリックスを決定するために必要なフレームごとに変化する非常に多くの保存された値があるため、GPUでは実際には遅くなります。CPUとのこのデータの送信-GPUが遅い。また、CPUでは計算が1回行われますが、GPUでは頂点ごとに計算されます。
多くの幾何学的変換は非GPUプロセッサで実行できますが、ターゲットプラットフォームを考慮する必要があります。走行距離は、ターゲットとするプラットフォームとそのプラットフォームのボトルネックによって異なります。
1つの考慮事項は、ジオメトリを生成しているデバイスとジオメトリをレンダリングしているデバイスの間のバス帯域幅です。
典型的な最新のPCシステムでは、CPUはPCIeバス(http://en.wikipedia.org/wiki/PCI_Express)の片側にあり、GPUは反対側にあります。フレームごとに生成されたデータをCPUからGPUに(またはその逆に)転送できる唯一の方法は、このバス経由です。つまり、このバスの転送速度によって制限を受ける可能性があります。ターゲットプラットフォームに16レーンのPCIe 2.xがある場合、帯域幅は8GB / sです。実際には、転送中にプロトコルのために帯域幅の一部が消費されるため、PCIeを介した転送は100%効率的ではありません。転送のサイズによっては、パケットごとのオーバーヘッドだけで帯域幅の5〜10%を失う可能性があります。
例えば。16レーンのPCIe 2.xを実行しているPCプラットフォームの場合、GPUに供給するためにフレームごとにどのくらいのデータを生成できますか?60fpsで実行する場合、これは8GB / 60 = PCIe 2.xのフレームあたり136MBに変換されます。ドライバーの通信オーバーヘッドとPCIe転送プロトコルのオーバーヘッドを考慮して何らかの(推定)90%係数を掛けると、PCIe 2.x帯域幅に制限されることなく、フレームあたり約120Mbのデータを生成できます。
あなたが答えなければならないもう一つの質問:この120Mbのデータの生成は、ターゲットCPUで1/60秒で簡単に達成できますか?CPUで他の多くのゲームタスクを実行する必要があることを思い出して、変換されたデータを生成するための時間が足りなくなることがあります。純粋なALUスループットの観点からは、これによりCPUの使用が制限される可能性があります。CPUからsysmemへのバスに関しては、帯域幅によって制限することもできます(変化しますが、最近のCPUでは約8.5GB /秒です)。
では、どのような要因でGPUを実行することがより現実的になるのでしょうか。1つの要因は、GPUとそのローカルビデオメモリ間の帯域幅であるGPUメモリ帯域幅です。最新のミッドレンジGPUでは、このビデオメモリの帯域幅は200GB / sにもなることがあります(つまり、PCIe 2.x帯域幅の25倍です)。もう1つの要因は、GPUが超並列で、数百のALUがあり、一度に数千のスレッドを実行することでメモリアクセスのレイテンシを隠すことができることです。
これらのすべての要因が、GPUにさらに多くの作業をプッシュするという明らかな勝利に貢献できますが、ターゲットプラットフォームによってはYMMVにも影響します。
「メッシュ変換」とはどういう意味ですか?いくつかの行列のセットでジオメトリを変換しますか?最近のほとんどのゲームでは、GPUが単純な変換やスキニングなどを処理できるようになります。また、それらのほとんどは、頂点シェーダーを使用して行われます。一部のプラットフォームでは、シェーダーがないか、CPUでこれらのことを行うことで他の利点があります。たとえば、PS3では、SPUにスキニングと変換を処理させることで、RSXからある程度の負荷を取り除くことができます。マルチパスライティングを行っている場合は、CPUのスキニングが有利になることがあります。これは、一度行うだけで、レンダリングパスごとに描画される結果を送信する必要があるためです。ですから例外はありますが、一般的にほとんどのゲームはGPUとシェーダーでこれらのことを行っています。
それとも、一般的なベクトル演算にGPUを使用するなど、より洗練された意味ですか?最近では、CUDAなどのシステムを介してかなり一般的なCコードを実行できる汎用GPUがあります。重いベクトル演算にこれを利用することは可能であり、これを行うプログラムが世の中にあることは知っています。個人的にはまだ経験はありません。
GPUですべてをレンダリングすることに意味がある状況もありますが、シェーダー内で定数を設定することはできず、描画呼び出しの前にCPU側を除いて定数を設定する場所は実際にはありません。
カスタム初期化プログラムを使用してGPUでボーン変換行列などの定数を計算できたとしても、おそらくそうしたくないでしょう。GPUは並列実行には優れていますが、クロック速度ははるかに遅くなります。
子ノードは親に依存しているため、階層の変換は簡単には並列化できませんが、メッシュ内のすべての頂点の変換は、頂点が互いに計算的に独立しているためです。
一般的なルールは次のとおりです。