人们经常告诉我至少使用顶点数组。但我认为这不是一个好主意,因为我使用glPushMatrix()
withglTranslatef/glRotatef
在 3d 世界中定位对象。
那么,我是否应该停止使用glPushMatrix()
并“手动”计算世界中旋转/移动的顶点位置,然后将它们的顶点数据推送到顶点数组中,然后一次全部渲染?
但是,当我为屏幕上的所有对象使用不同的纹理表面时,所有这些都会变得更加混乱,这些对象也是深度排序的。
所以:
- 我还必须使用纹理表面 ID 存储每个对象。
- 我会按 Z 位置对所有可见对象进行排序(游戏只能自上而下查看,所有对象都是平面的)。
- 我会通过这个排序数组:
- 创建新缓冲区并仅将顶点/纹理坐标/颜色/法线复制到此缓冲区中:
- 每次纹理表面 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
另外,在第 4 步:在这种情况下是否可以使用已经存在std::vector
的?我有一个想法,我必须使用原始数组,例如new float[100]
将顶点数组发送到我的 GPU,或者我可以以std::vector
某种方式(有效地)使用我已经存在的排序在这里,而不在每次纹理 ID 更改时创建新缓冲区?