0

我希望在我的 iPhone 应用程序上获得一些额外的性能 (FPS) 提升。我已经在使用交错数据、GL_SHORT 和单个纹理图集。有关我已经完成的操作的详细信息,请参阅此问题。

现在我想看看使用 VBO 来提高性能。根据 Apple 的 OpenGL ES 文档,这是一个很好的步骤。但是,它没有说明 VBO 如何(或是否)受到模型视图矩阵更改的影响。本质上,我将同一个对象多次渲染到场景中,但每次都使用稍微不同的模型视图矩阵。对象之间的主要区别(场景中的位置除外)是纹理映射。它们都有略微不同的纹理坐标。

VBO 会在这种情况下提供帮助吗?我应该为每个单独的对象分配一个单独的 VBO 吗?

更新 1

到目前为止,VBO 似乎对我的表现有负面影响。FPS 回落到 20 年代中期到高 20 年代。我分配了 70 个 VBO:35 个用于数据,35 个用于索引。我可以将数据和一个全局索引数组降低到 35 个。我正在使用 glBufferSubData() 根据需要更新纹理坐标。

另一个想法是分解所有静态数据并为该 VBO 指定 GL_STATIC_DRAW。

4

1 回答 1

1

它没有说明 VBO 如何(或是否)受到模型视图矩阵更改的影响

每次进行绘图调用时,都会在 GPU 上进行模型视图转换。更改模型视图不会导致 VBO 发生变异。

对象之间的主要区别(场景中的位置除外)是纹理映射。它们都有略微不同的纹理坐标。

听起来你应该调整纹理矩阵,除了模型视图矩阵,有点像这样:

glMatrixMode(GL_TEXTURE);
// glTranslate, glRotate, etc
glMatrixMode(GL_MODELVIEW);
// glTranslate, glRotate, etc

利用 VBO 通常是个好主意,但它们实际上只对第三代 iPhone 有帮助。它们对较旧的 iPhone 帮助不大。

我应该为每个单独的对象分配一个单独的 VBO 吗?

减少应用程序中 VBO 的数量通常更有效。glBindBuffer您可以在每次调用glDrawArrays或时提供唯一的偏移量,而不是多次调用glDrawElements

于 2009-12-10T10:56:22.647 回答