2

我正在考虑将一些 OpenGL 代码移植到 OpenGL ES,并且想知道这段代码到底做了什么:

glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)

因为 OpenGL ES 中不存在 glPushClientAttrib。我知道它保存了 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

1 回答 1

5

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

我猜这里 VBO 和顶点数组之间的区别在于 VBO 将它们的实际数据存储在图形内存中,而顶点数组在绘制它们时必须流式传输到图形卡。但是,当您使用 VBO 时,指针和启用的标志仍将与 glPushClientAttrib 一起保存。

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

于 2012-04-30T12:30:02.220 回答