私はOpenGL ES 2.0を使用する非常に小さなゲームエンジンで作業しています。私は、VBOをメッシュクラスに統合するという設計上の問題が少しあります。複数のメッシュオブジェクト間でVBOを共有する
問題は、各メッシュに新しいVBOをインスタンス化したくないということです.VBOサイズを2MBなどの固定サイズだけでなく、ロードするメッシュ数によって決定したいのです)。
VBOのためのrealloc機能がないので、すべての頂点データを一度にバッチロードする必要があります。私は4つか5つの小さなメッシュしか持っていないのでこれは大丈夫です。そこで私はMeshListクラスを作成しました。
私はMeshList.AddMesh(メッシュメッシュ)を呼び出し、メッシュオブジェクトの頂点/インデックスデータを集計し、そのオフセットを追加されたメッシュに戻って頂点データ/インデックスデータの配列に返します。このようにして、メッシュはVBO内のどこにあるかを知ることができます(VBOはどこに入っているのかわかりません)。
しかし、MeshList.BindToVBO()を呼び出すまで、MeshListデータはVBOにアップロードされません。しかし今、私のメッシュの中にはどのVBOが入っているのか分からないので、VBOハンドルを保持する各Meshクラスの整数メンバ変数を指すポインタの配列をMeshListに作成することを考えていました。このようにして、BindToVBO()が呼び出されると、ポインタ配列を反復処理して、メッシュオブジェクト内のVBOハンドルを更新します。
私はこのようにして、異なるVBOで異なるメッシュオブジェクトを持つか、すべて1つのVBOで柔軟にすることができました。私が持っている唯一の懸念は、これが良いデザインであるかどうかである。
MeshList.BindToVBO()がメッシュオブジェクトの全体を更新しているというコードを見ている人には、明らかではありません。つまり、MeshListはBindToVBO()呼び出しの前にすべてのMeshオブジェクトとやりとりしますが、MeshオブジェクトをMeshList.AddMesh()に渡すことで、VBOHandleメンバーを基本的に購読して、未来。
私はこれをできる限り明確にしようとしました。何か明確化が必要な場合は教えてください。
このアプローチでは、メッシュデータの存続期間をバインドすることが1つの結果として生じます。あるメッシュを別のメッシュに置き換える場合はどうなりますか?変更に合わせてメッシュデータ全体をアップロードするか、VBOデータバッファを分割します。 –