2012-04-30 125 views
1

我在看一些移植的OpenGL代码的OpenGL ES,并想知道什么呢这段代码做的正是:的OpenGL ES glPushClientAttrib

glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT) 

为glPushClientAttrib不OpenGL ES的存在。我知道它保存了OpenGL状态机的状态,但我似乎无法找到GL_CLIENT_VERTEX_ARRAY_BIT标志的确切机制。

我猜测它保存了最后一个顶点数组指针?

进一步的调查显示VBO(顶点缓冲对象)是常用的。这将glVertexPointer的指针字段更改为偏移量。 glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)如何与此相关(以及相关功能glBindBuffer,glBufferData)?

编辑: 只是为了澄清:

gl*Pointer() #1 
glPushClientAttrib(*) 
gl*Pointer() #2 
glPopClientAttrib() <-- this is effectively calling #1 again or resetting to whatever #1 was 

回答

4

glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)保存所有客户端状态的所有顶点数组属性。因此,您使用glEnableClientState/glDisableClientState和gl *指针函数设置的所有内容。它不会复制实际的数据。它也不会保存用glBindBuffer/glBufferData设置的任何东西,因为这些将是服务器端状态。在普通的OpenGL中可能有一个用于glPushAttrib的枚举(OpenGL ES中也没有glPushAttrib)。

我猜测VBO和顶点数组之间的区别在于,VBOs在图形内存中有他们的实际数据,而顶点数组必须在绘制图形卡时流入图形卡。不过,在使用VBO时,指针和启用的标志仍然会与glPushClientAttrib一起保存。

对于OpenGL ES,如果你想返回到最后一个状态,你必须自己跟踪状态。或者更好的是,在完成之后将所有内容设置为默认值(对所有启用的顶点数组调用glDisableClient应该足够)。

+0

酷!只是在我原来的问题中对gl *指针行为做了一些澄清。 – nehz

+0

是的,它将重置glPushClientAttrib之前的原始状态。因此,来自#1的顶点数组属性被设置,来自#2的属性不是(即使它们是不同的函数)。 –