如何在单个glVertexPointer中批处理相同的正方形

时间:2009-05-20 15:43:53

标签: opengl

我已经阅读过优化绘图,可以在一遍中使用相同的纹理绘制一组图形。
但是如何将我的单身广场连接在一起形成一个图形发送到glVertexPointer。

(请参阅PowerVR MBX.3D Application Development Recommendations.1.0.67a - 第5页)

2 个答案:

答案 0 :(得分:1)

我认为你正在思考“软件转换”步骤。我假设你有一个正方形的顶点数组,并希望将该数组的几个不同实例连接成一个包含正方形所有顶点的大数组,然后最后绘制大数组。

在这种情况下,大数组将包含预先变换的顶点数据,然后在一次绘制调用中将其发送到GPU。既然你知道要绘制多少个方格,那就说N个。该数组必须能够包含N * 4 * 3个元素(假设您在3d中工作,因此每个顶点有3个坐标)。

然后,软件转换步骤将遍历所有方块,并将转换后的数据附加到大数组中,然后通过调用 glVertexPointer()来绘制。

但是,我对这个软件转换步骤有点怀疑。这意味着您将自己处理所有这些转换,这意味着您没有使用GPU的强大功能。那就是你将使用CPU功率而不是GPU功率来获得转换后的坐标。我个人开始创建纹理图集,然后为每个单个方块生成所有纹理坐标。这只需要一次,因为纹理坐标不会改变。然后,在开始绘制正方形(推矩阵i,绘制四边形,弹出矩阵等)之前,可以通过调用 glTextureCoordPointer()来使用纹理坐标。

编辑:

  

是的,这就是我想要的。你确定吗   它在cpu上速度较慢?从何而来   他们说是打电话的开销   多次glVertexPointer和   glDrawArrays会慢一些。

我收回了我的怀疑! :)你为什么不做一些措施,只是为了它?权衡至少必须是你必须改变更多的数据。因此,如果GPU无法保存所有数据,那么正常的转换可能是必要的。

哦,还有一件事。一旦蝴蝶移动,其数据必须手动重新转换,当您让GPU为您转换数据时,不需要这样做。所以你必须为每个实例标记一些状态,当它变脏时你需要在进行绘制调用之前重新转换。

答案 1 :(得分:0)

看起来你想使用索引?请参阅glDrawElements。