あなたが現在何をしているのか、完全にはわかりません。しかし、これを行う正しい方法は、 VBO に触れないことです。代わりに、1 つ以上の変換行列を均一として頂点シェーダーに渡し、GPU で行列の乗算を実行します。
CPU で VBO データを変更するのは正気ではありません。頂点データのコピーを CPU に保持し、それを反復処理してアップロードするか、バッファをマッピングして反復処理することを意味します。いずれにせよ、それはめちゃくちゃ遅いでしょう。VBO を使用することの要点は、頂点データを一度アップロードして、CPU で同時に作業できるようにすることです。その間、GPU はオフになり、その頂点データを処理します。
代わりに、頂点を頂点バッファー、できればオブジェクト空間に一度格納するだけです (正気を保つため)。次に、頂点をオブジェクトの空間からクリップ空間に変換する各オブジェクトの変換行列を追跡します。その行列を頂点シェーダーに渡し、GPU で頂点ごとに乗算を行います。
明らかに、GPU はすべての頂点にフレームごとに少なくとも 1 つの行列を掛けています。しかし、GPU には行列の乗算を非常に高速に実行する並列ハードウェアがあります。したがって、特にマトリックスが絶えず変化する場合 (オブジェクトの移動など)、これは CPU で実行して大規模なバッファーを更新するよりもはるかに高速です。さらに、CPU を解放して、物理演算やオーディオなどの他のことを行うことができます。
オブジェクトがまったく動かない場合は、これを実行したくないと想像できますが、GPU 行列乗算はおそらく CPU 浮動小数点乗算とほぼ同じ速度です (詳細はわかりません)。したがって、静的オブジェクト用のシェーダーを増やす価値があるかどうかは疑問です。
概要:
- CPU でのバッファの更新はSLOWです。
- GPU での行列乗算はFASTです。
- バッファ更新なし?= CPU を解放します。
- GPU での乗算? = 簡単かつ迅速にオブジェクトを移動できます (アップロードするマトリックスを変更するだけです)。
これが多少役に立てば幸いです。