启用客户端状态的目的是什么?

时间:2011-08-04 11:33:31

标签: iphone android opengl-es

在我看过的所有例子中,这些线在绘制网格之前使用: glEnableClientState(GL10.GL_VERTEX_ARRAY); glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

有时glEnableClientState(GL10.GL_NORMAL_ARRAY);

然后在每个网格的绘制调用结束时再次禁用它们。

我真的不明白他们实际做了什么,以及你为什么要禁用它们。我知道如果我从数组中绘制三角形,使用纹理和使用光照,我可能需要打开它们。但我不知道什么时候我真的需要关掉它们。

我认为如果你不必为场景中的每个网格禁用和重新启用它们会更有效。你能一直把它们留下来吗?在什么情况下你需要禁用它们?

我无法找到有关这些客户端状态的实际含义的任何解释,因此我不知道在我的代码中可以安全地将它们保留在何处或开启状态。

2 个答案:

答案 0 :(得分:4)

  

你能一直把它们留下来吗?

是的,如果您愿意,并且所有基元都使用了您正在启用的所有阵列。

  

在什么情况下你需要禁用它们?

为了不销毁弄乱以下的图纸。

例如,假设您有一个使用法线的原语,您只需通过调用glEnableClientState(GL_NORMAL_ARRAY)启用它,并告诉OpenGL您的正常数据通过glNormalPointer()。如果不禁用GL_NORMAL_ARRAY,则下一个原语将使用与前一个原语相同的普通数组。如果你的下一个原语不使用法线,这可能会产生影响。

因此,在完成基元绘制时恢复OpenGL状态是一种很好的做法。话虽如此,如果您的所有基元都使用了您启用的所有数组,您可以启用它们,就像我在应用程序运行的整个过程中启用GL_TEXTURE_2D一样。那是因为我知道我会经常使用纹理,然后就没有理由在每个对象的绘制调用中启用/禁用它;这只会降低应用程序的性能。

答案 1 :(得分:2)

glEnableClientState(GL_VERTEX_ARRAY)

如果您声明如上所述,它使OpenGL能够使用顶点数组中的顶点

否则opengl不知道它必须用什么数组来显示顶点以便它什么都不显示