Opengl glEnable和glEnableClientState之间有什么区别?

Opengl glEnable和glEnableClientState之间有什么区别?,opengl,Opengl,glEnable和glEnableClientState之间有什么区别?每次我需要一个模式设置/取消设置时,我都必须查看引用,以知道其中哪些将接受它。有没有一般的规则说明哪些模式进入哪种模式?glEnable是服务器端,而glEnableClientState是客户端。把服务器端当作CPU,客户端当作GPU。在全球范围内,顶点数组仅为客户端。除了tibur的答案,实际上,glEnableClientState和glDisableClientState的唯一用途是启用/禁用内置固定函数属性数组(如

glEnable和glEnableClientState之间有什么区别?每次我需要一个模式设置/取消设置时,我都必须查看引用,以知道其中哪些将接受它。有没有一般的规则说明哪些模式进入哪种模式?

glEnable
是服务器端,而
glEnableClientState
是客户端。把服务器端当作CPU,客户端当作GPU。在全球范围内,顶点数组仅为客户端。

除了tibur的答案,实际上,
glEnableClientState
glDisableClientState
的唯一用途是启用/禁用内置固定函数属性数组(如
GL_顶点数组
GL_正常数组
,…)。对于所有其他状态,您使用
glEnable
glDisable
(或
glenableVertexAttributeArray
gldisableVertexAttributeArray
作为通用顶点着色器属性)。

glEnable
用于OpenGL ARB确定的表示内部驱动程序状态的状态集
glEnableClientState
用于表示您更直接控制的信息的状态。存在的唯一要启用/禁用的客户端状态是旧的顶点数组状态。这些被
glEnable/DisableVertexAttributeArray
取代


这种区别实际上是毫无意义的,因为驱动程序仍然管理所有这些状态。

如果所有数组都是客户端的,为什么数组比begin/end快?我认为图形卡直接从内存复制它们,但这不能是客户端,对吗?@Dani原始顶点数组是客户端状态,驻留在CPU内存中(这就是为什么您只在
glVertexPointer
等中设置指向CPU内存的指针)。性能提升不仅仅是因为没有从CPU复制,而是因为没有为每个顶点调用驱动程序。但是,VBO(使用阵列的现代方式)允许您将阵列存储在GPU内存中,这是正确的。但启用带有
glEnableClientState
的数组的旧方法已被保留。@Dani但固定函数vertex数组已被弃用(连同
glEnableClientState
)。通用着色器属性的新
GlenableVertexAttributeArray
不再有客户端或服务器的概念。我在mac上,甚至没有OpenGL-3here@Dani您不需要OpenGL 3来使用着色器和VBO,也不需要使用通用顶点属性而不是旧的内置属性。您可以在OpenGL2中以现代和未来兼容的方式完美地编程GL。只是你必须自己做出正确的决定,而不是让弃用模型替你做出决定。如果使用GLX间接渲染,那么驱动程序将无法管理所有状态。在客户端,OpenGL/GLX库负责跟踪客户端状态,而在服务器端,驱动程序必须关心OpenGL状态。这就是区别。OpenGL-3还没有被完全指定为间接GLX,这是一个遗憾,因为缓冲区对象和细分着色器的带宽节约将使间接使用OpenGL-3变得非常有意义。就OpenGL而言,服务器端是GPU而不是CPU,反之亦然,对吗??