OpenGL的glEnableClientState和glDisableClientState

OpenGL的glEnableClientState和glDisableClientState,opengl,Opengl,OpenGL中glEnableClientState和glDisableClientState的含义是什么? 到目前为止,我发现这些函数用于启用或禁用某些客户端功能 那么,这里的客户机或服务器到底是什么? 我在PC上运行OpenGL程序,这是指什么? 为什么我们甚至需要禁用某些功能。。。更有趣的是,它是关于某种数组相关的东西 整个画面对我来说是灰色的。glEnableClientState和glDisableClientState主要用于管理和维护。我认为,在OpenGL术语中,客户端是您的应用

OpenGL中
glEnableClientState
glDisableClientState
的含义是什么? 到目前为止,我发现这些函数用于启用或禁用某些客户端功能

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


整个画面对我来说是灰色的。

glEnableClientState
glDisableClientState
主要用于管理和维护。我认为,在OpenGL术语中,客户端是您的应用程序,而服务器是图形卡(或驱动程序)。唯一的客户端功能是顶点数组,因为它们存储在CPU内存中,因此在客户端或更具体地说,它们由应用程序控制(分配和释放),而不是由驱动程序控制


顶点缓冲区对象是另一种情况。它们可以用作顶点数组,但由驱动程序控制,因此在使用缓冲区时,“客户端状态”一词不再有太多意义。

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

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


这一切都是很不正常的。您需要阅读vertex buffer对象并进行尝试。

原始术语源自X11符号,其中服务器是实际的图形显示系统:

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

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

glEnableClientState
glDisableClientState
设置客户端部件的状态。顶点数组过去位于客户端进程内存中,因此使用顶点数组进行绘图是客户端本地进程


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

使用顶点数组不需要缓冲区。实际上,“客户机状态”语义是在缓冲区出现之前很久发展起来的,对于缓冲区来说没有太大意义,因为缓冲区是由驱动程序控制的,而不是由客户机控制的。对我来说,@christian mennie是有意义的,但是,@christian rau对不起,我不明白你在说什么。到目前为止,我觉得,因为OpenGL是一种状态机制,所以它需要一组特定的屏蔽来确定如何处理传入的数据。这就是为什么它需要启用和禁用一些东西。但是,我不明白,为什么需要启用和禁用cpu/驱动程序端操作才能进行顶点数组操作?还是我完全错了?@iamcrasy,您需要启用/禁用阵列的原因是因为没有其他方式可以说,“我以前使用过这个阵列,但我不想再这样做了”。OpenGL是一个状态机,所以它以您上次将其保留的形式保留所有状态。您不能使用glColorPointer来表示“不要获取此颜色的数据”。因此,您可以使用glEnable/DisableClientState来告诉OpenGL哪些数组要从中提取,哪些数组不要从中提取。@iamcreasy OpenGL不像D3D,在每个主要版本中,它们都会经历剧烈的API转换。甚至D3D也不再是这样了,D3D11与D3D10非常接近。OpenGL4.0没有从OpenGL3.3中删除任何内容。唯一的去除发生在3.0到3.1边界;从那时起,它只是一种补充。所以,如果您写入3.3内核,它将在4.0内核上运行。或4.1核心。答案不错,比我的更精确。顺便说一句,由于固定语义顶点数组已被弃用,而通用数组使用的是
gl[En/Dis]ablevertexattributearray
,因此客户机状态函数仍被弃用。因此,语义冲突不再是一个大问题(至少在将来是这样)。现在,我应该避免使用顶点数组吗?那么这个客户机-服务器机制呢?@iamcresy:恰恰相反!如果确实需要高性能,顶点阵列是唯一的选择。请不要陷入同样的误解,服务器/客户端机制将意味着性能损失;很多人认为X11很慢,因为它是一种客户机/服务器机制。然而,我反复发现写得很好的X11程序比Windows和MacOS X程序的性能要好,有时甚至好几个数量级。好吧,这就是为什么要引入gl[En/Dis]ablevertexattributeArray?正确的?我应该避免使用旧的命令。只需gl[En/Dis]ableClientState部分。对吗?@iamcreasy:不要被函数的命名所愚弄,如果应用在VBOs上,gl{En,Dis}ableClientState并不比gl{En,Dis}ableVertexAttributeArray贵。请记住,客户机/服务器并不一定意味着对带宽有任何影响。在现代操作系统上,写入环回套接字(即与127.0.0.1通信)几乎没有开销:网络堆栈只设置发送到COW的页面,然后在网络堆栈中只传递一个指针。最终的效果是,环回套接字变成了共享内存!