我想模拟一堆球的运动。这些球被呈现为12个顶点,使用GL_TRIANGLE_FAN进行渲染。在我的设计中,每个球对象维护其自己的顶点属性数组。然而,每次调用glDrawElements
时,它只会绘制一个Vertex Buffer Object
。1000个球需要1000个绘制调用,效率不高。如果我绘制点而不是三角形扇形,则可以按以下方式绘制:
class Ball
{
public:
GLfloat x, y;
// ...
}
Ball balls[] = {Ball(100, 100), Ball(80, 120), ...};
void display()
{
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, sizeof(Ball), 0); // stride
glDrawArrays(GL_POINTS, 0, vertex_num);
//...
}
有了stride
参数,我可以从球数组中“选择”x、y并跳过其他成员。我想知道当每个对象维护一个顶点属性数组时如何做到同样的事情?或者我应该提取所有顶点属性并将它们组合成单个VBO?但这需要额外的代码来维护它并增加耦合。