glEnable和glEnableClientState有什么区别?(这是一个关于IT技术的提问标题)

5
什么是glEnable和glEnableClientState之间的区别?每次我需要设置/取消模式时,我都必须查看参考以了解哪个接受它。是否有一般规则说明哪些模式属于哪个?
3个回答

7
除了tibur的回答之外,在实践中,glEnableClientStateglDisableClientState 的唯一用途是启用/禁用内置的固定功能属性数组(如GL_VERTEX_ARRAYGL_NORMAL_ARRAY,...)。对于所有其他状态,您需要使用glEnableglDisable(或glEnableVertexAttribArrayglDisableVertexAttribArray用于通用顶点着色器属性)。

如果所有的数组都是客户端的,为什么数组比begin/end更快呢?我认为显卡会直接从内存中拷贝它们,但这不能在客户端实现,对吗? - Daniel
@Dani 原始的顶点数组是客户端状态,驻留在 CPU 内存中(这就是为什么你只需要在 glVertexPointer 等函数中设置一个指向 CPU 内存的指针)。性能提升不仅是因为不从 CPU 复制,而且不为每个顶点调用驱动程序回调。但你是对的,VBO(现代使用数组的方式)允许你将数组存储在 GPU 内存中。但启用数组的旧方法 glEnableClientState 已经被保留。 - Christian Rau
@Dani,但是固定功能的顶点数组已经被弃用了(连同glEnableClientState一起)。而新的通用着色器属性 glEnableVertexAttribArray 不再有客户端或服务器的概念。 - Christian Rau
我正在使用Mac,这里甚至没有OpenGL-3。 - Daniel
@Dani,你不需要使用OpenGL 3来使用着色器和VBO或者使用通用顶点属性而不是旧的内置属性。你完全可以在OpenGL 2中以现代和未来兼容的方式编写GL程序。只是你必须自己做出正确的决策,而不是让退化模型为你做出决策。 - Christian Rau
@Dani:此外,MacOSX Lion 支持OpenGL 3.2核心配置文件。 - Nicol Bolas

3

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

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


如果使用GLX进行间接渲染,则驱动程序将不会管理所有状态。在客户端,OpenGL/GLX库负责跟踪客户端状态,在服务器端,驱动程序必须关心OpenGL状态。因此有了区别。遗憾的是,OpenGL-3在间接GLX方面没有完全规定,这很遗憾,因为缓冲对象和曲面细分着色器的带宽节省使得以间接方式执行OpenGL-3非常有意义。 - datenwolf

2

glEnable 是服务器端的,而 glEnableClientState 是客户端的。可以将服务器端想象成中央处理器(CPU),而客户端则是图形处理器(GPU)。总的来说,只有顶点数组是客户端的。


1
就OpenGL而言,服务器端是GPU而不是CPU,反之亦然,对吗? - ashishsony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接