我正在考虑将一些 OpenGL 代码移植到 OpenGL ES 并想知道这段代码到底做了什么:
glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)
Run Code Online (Sandbox Code Playgroud)
因为 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
Run Code Online (Sandbox Code Playgroud)
glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT) 保存所有顶点数组属性的所有客户端状态。因此,您使用 glEnableClientState/glDisableClientState 和 gl*Pointer 函数设置的所有内容。它不会复制实际数据。它也不会保存使用 glBindBuffer/glBufferData 设置的任何内容,因为这些将是服务器端状态。在普通 OpenGL 中可能有一个 glPushAttrib 的枚举(OpenGL ES 中也没有 glPushAttrib)。
我猜这里的 VBO 和顶点数组之间的区别在于 VBO 的实际数据在图形内存中,而顶点数组在绘制它们时必须流式传输到图形卡。但是,当您使用 VBO 时,指针和启用的标志仍将与 glPushClientAttrib 一起保存。
对于 OpenGL ES,如果您想返回到最后一个状态,您必须自己跟踪状态。或者更好的是,在完成后将所有内容设置为默认值(为所有启用的顶点数组调用 glDisableClient 就足够了)。
| 归档时间: |
|
| 查看次数: |
1128 次 |
| 最近记录: |