关于OpenGLES中的纹理切换

时间:2010-07-09 12:14:08

标签: c++ iphone c opengl-es

切换纹理时,为什么速度慢?


代码 - 1

glBindTexture(GL_TEXTURE_2D,texId01);

glDrawArray(glDrawArrays(GL_TRIANGLES,0,4);

glBindTexture(GL_TEXTURE_2D,texId02);

glDrawArray(glDrawArrays(GL_TRIANGLES,0,4);


代码 - 2

glBindTexture(GL_TEXTURE_2D,texId01);

glDrawArray(GL_TRIANGLES,0,4);

glDrawArray(GL_TRIANGLES,0,4);


为什么这些速度不同?

3 个答案:

答案 0 :(得分:7)

对于PowerVR硬件上的OpenGLES,appraranty以及其他人来说,upvoted答案是错误的。我已经偶尔发现过这种“纹理绑定很慢”的神话,但没有一个性能文档(Apple或Imagination Technologies)提到这一点。

所以我直接用Imagination Technologies检查了这个,他们的回答是:

  

除了我们在文档中提到的内容之外,使用glBindTexture不会对性能产生任何影响,但是开销很小但不是很大。有些信息似乎提到纹理切换时使用glTexture2D重新加载纹理,这是一个缓慢的调用,应该只在第一次初始化应用程序时完成

答案 1 :(得分:3)

因为驱动程序必须进行一些内部验证,要检查一切是否符合预期,所以绑定纹理是一项昂贵的操作。

考虑到这一点,您应该最小化纹理绑定操作。一种常见的方法是在绘制时按纹理(以及着色器,如果GL ES 2.0)对基元进行排序。

答案 2 :(得分:1)

Shiva,bhai sun ..我知道你在游戏中有一些游戏

为什么你要问这样的问题,......如果它真的很慢,你能不能优化它, 喜欢因司机等而慢。?

尝试使用单个大纹理 使用单独的缓冲区对象来存储要在此纹理中使用的每个图像的坐标, 这就对了... 即使纹理切换很慢,你仍然领先,因为你使用单一纹理 以及你使用缓冲区的事实......