少なくとも Vertex Array を使用するように常に言われます。しかし、私は3D世界にオブジェクトを配置するためにglPushMatrix()
withを使用しているので、それは良い考えではないと思います.glTranslatef/glRotatef
では、世界の回転/移動された頂点位置の使用をやめてglPushMatrix()
「手動で」計算し、頂点データを頂点配列にプッシュして一度にレンダリングする必要がありますか?
しかし、深度ソートされている画面上のすべてのオブジェクトに異なるテクスチャ サーフェスを使用すると、これらすべてがさらに混乱します。
そう:
- 各オブジェクトにテクスチャ サーフェス ID も格納する必要があります。
- 表示されているすべてのオブジェクトを Z 位置で並べ替えます (ゲームはトップダウンでのみ表示され、すべてのオブジェクトはフラットです)。
- この並べ替えられた配列を調べます。
- 新しいバッファーを作成し、頂点/texcoord/color/normal のみをこのバッファーにコピーします。
- テクスチャ サーフェス ID が以前の ID から変更されるたびに、正しいテクスチャ ID にバインドします。
- 収集した頂点データをアップロードします。
- 一時的な頂点配列に使用されているバッファーを解放します。
- 最初に並べ替えたすべてのデータを処理するまで、手順 4 ~ 7 を繰り返します。
- 並べ替えた配列データを解放し、手順 1 ~ 9 を繰り返します。
私はそれを正しくやっていますか?
また、ソートするオブジェクトのデータ構造をどのように設計すればよいですか? 例えば、std::vector
各オブジェクトの頂点データを保存するために使用するのは良いですか? または、より良い代替手段はありますか?std::vector
このすべてのデータを保存するには、次のようになると考えていました。
struct GameObject {
int TexID;
float z; // we will sort by this
vector<VTCNStruct> VertexData; // store each point of the object here (including color/normal/texcoord points).
};
vector<GameObject> GameObjectBuffer; // push all sortable objects here
std::vector
また、ステップ 4:この場合、既存のものを使用することは可能ですか? 頂点配列を GPU に送信する場合のように、未加工の配列を使用する必要があるという考えがありました。または、テクスチャ ID が変更されるたびに新しいバッファーを作成せずに、何らかの方法で (効率的に) ここでnew float[100]
並べ替えられた既存の配列を使用できますか?std::vector