gpt4 book ai didi

opengl-es - OpenGL ES glPushClientAttrib

转载 作者:行者123 更新时间:2023-12-02 22:43:39 27 4
gpt4 key购买 nike

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

glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)

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

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

进一步调查显示 VBO(顶点缓冲对象)是常用的。这会将 glVertexPointer 的指针字段更改为偏移量。 glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT) 如何处理这个(以及相关函数 glBindBufferglBufferData)?

编辑:澄清一下:

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

最佳答案

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

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

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

关于opengl-es - OpenGL ES glPushClientAttrib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10380543/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com