glEnableClientState和OpenGL的glDisableClientState

Qua*_*fan 16 opengl

是什么意思glEnableClientState,并glDisableClientState在OpenGL?到目前为止,我发现这些功能是启用或禁用某些客户端功能.

那么,客户端或服务器到底是什么?我正在PC上运行我的OpenGL程序,所以这是指什么?为什么我们甚至需要禁用某些功能?...更有趣的是关于某种与数组相关的东西?

对我来说,整个画面非常灰暗.

dat*_*olf 13

原始术语源于X11表示法,其中服务器是实际的图形显示系统:

  • 提供对某种显示设备的访问的服务器程序

  • 连接到服务器的客户端在其提供的显示设备上绘制

glEnableClientStateglDisableClientState设置客户端部分的状态.Vertex Arrays过去位于客户端进程内存中,因此使用顶点数组进行绘制是客户端本地进程.

今天我们有缓冲对象,它将数据放在服务器内存中,使顶点数组的整个客户端术语违反直觉.丢弃客户端状态并通过常用glEnable/ glDisable函数启用/禁用顶点数组是有意义的,就像我们使用帧缓冲对象和纹理一样.

  • 很好的答案,比我的更精确.顺便说一句,由于不推荐使用固定的语义顶点数组,而通用语义顶点数组使用`gl [En/Dis] ableVertexAttribArray`,因此无论如何都不推荐使用客户端状态函数.因此,语义冲突不再是一个问题(至少在未来). (3认同)

小智 7

如果通过将缓冲区传递给OpenGL(glVertexPointer()等)而不是直接调用(glVertex3f())来绘制图形,则需要告诉OpenGL要使用哪些缓冲区.

因此,不是调用glVertex和glNormal,而是创建缓冲区,绑定它们,并使用glVertexPointer和glNormalPointer将OpenGL指向您的数据.然后调用glDrawElements(或类似)将使用这些缓冲区进行绘图.但是,另一个必需的步骤是告诉OpenGL驱动程序您实际想要使用哪个缓冲区,即glEnableClientState().

这一切都非常手工波浪.您需要阅读顶点缓冲区对象并尝试它们.

  • @iamcrasy,你需要启用/禁用数组的原因是因为没有其他方式可以说,"我以前使用过这个数组,但我不想再这样做了".OpenGL是一个状态机,所以它保留了你最后留下的形式的所有状态.你不能使用glColorPointer来说"不要获取这种颜色的数据".因此,您使用glEnable/DisableClientState来告诉OpenGL要从哪个数组中提取哪些数组. (2认同)