即使在更改模型视图矩阵时使用顶点缓冲区对象是否有意义?

时间:2009-12-10 04:39:18

标签: iphone opengl-es vbo

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

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

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

更新1

到目前为止,看起来VBO对我的表现有负面影响。 FPS跌至中高位20。我分配了70个维也纳国际单位:35个用于数据,35个用于索引。我可以将这个数据减少到35,以及一个全局索引数组。我正在使用glBufferSubData()来根据需要更新纹理坐标。

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

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

听起来你应该调整纹理矩阵,除了模型视图矩阵,还有这样的排序:

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

利用VBO通常是一个好主意,但它们实际上只对第三代iPhone有所帮助。它们对旧版iPhone没有多大帮助。

  

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

减少应用程序中的VBO数量通常更有效。每次拨打glBindBufferglDrawArrays时,您都可以提供唯一的偏移,而不是拨打glDrawElements