私はOpenGLES2.0を使用する非常に小さなゲームエンジンに取り組んでいます。VBOをメッシュクラスに統合する際に、デザインに少し問題があります。
問題は、メッシュごとに新しいVBOをインスタンス化したくないことです。また、VBOサイズを、ロードするメッシュの数(2MBなどの固定サイズだけでなく)によって決定する必要があります。
VBOにはrealloc関数がないため、すべての頂点データを一度にバッチロードする必要があります。小さなメッシュが4つか5つしかないので、これで問題ありません。そこで、MeshListクラスを作成しました。
MeshList.AddMesh(Mesh mesh)を呼び出すと、メッシュオブジェクトの頂点/インデックスデータが集約され、追加されたメッシュに頂点データ/インデックスデータの配列にオフセットが返されます。このようにして、メッシュはVBOのどこにあるかを認識します(ただし、どのVBOにあるかは認識しません)。
ただし、MeshList.BindToVBO()を呼び出すまで、MeshListデータはVBOにアップロードされません。しかし、現在、どのメッシュもどのVBOにあるかを認識していません。そこで、VBOハンドルを保持する各メッシュクラスの整数メンバー変数を指すポインターの配列をMeshListに作成することを考えていました。このように、BindToVBO()が呼び出されると、ポインター配列を反復処理し、メッシュオブジェクトのVBOハンドルを更新します。
このようにして、さまざまなメッシュオブジェクトをさまざまなVBOに配置したり、すべてを1つのVBOに配置したりできる柔軟性が得られると思いました。私が持っている唯一の懸念は、これが良いデザインであるかどうかです。
MeshList.BindToVBO()が大量のメッシュオブジェクト全体を更新していることは、コードをちらっと見ている人にはわかりません。つまり、MeshListはBindToVBO()呼び出しの前にすべてのMeshオブジェクトと対話しますが、MeshオブジェクトをMeshList.AddMesh()に渡すことによって、基本的にVBOHandleメンバーをある時点で更新にサブスクライブしていることを明示的に言うことはありません。未来。
私はこれをできるだけ明確にしようとしました。何か説明が必要な場合はお知らせください。