Opengl glEnableClientState和GlenableVertexAttribute数组

Opengl glEnableClientState和GlenableVertexAttribute数组,opengl,Opengl,后者反对前者吗 我正在编写我想在shader 2.0硬件上使用的代码,但我想使用更新的编程约定,如VAO 因此,我一直在使用glvertexattributepointer函数,而不是glVertexPointer、glNormalPointer、glColorPointer等等 似乎我们已经到了一个地步,服务器-客户机的概念不是。。。特别相关(编辑:我的意思是它适用于切换这些缓冲区指针的状态)。但我想知道旧的En/DisableClientState实际上做了什么,以及它与GlenableVe

后者反对前者吗

我正在编写我想在shader 2.0硬件上使用的代码,但我想使用更新的编程约定,如VAO

因此,我一直在使用
glvertexattributepointer
函数,而不是
glVertexPointer
glNormalPointer
glColorPointer
等等

似乎我们已经到了一个地步,服务器-客户机的概念不是。。。特别相关(编辑:我的意思是它适用于切换这些缓冲区指针的状态)。但我想知道旧的
En/DisableClientState
实际上做了什么,以及它与
GlenableVertexAttributeArray
实际做了什么的关系

我也没有5代以前的任何图形硬件,但我的软件的某些用户肯定会有。例如,如何防止我的代码在Radeon 9700上编译失败?(尽管我希望如果用户有最新的驱动程序,它可能会支持新的东西)

似乎我们已经到了一个地步,服务器-客户机的概念不是。。。特别相关

事实上,这是非常相关的。整个缓冲区对象术语是以服务器和客户机为单位的。缓冲区是服务器端的,客户端只发出引用服务器端缓冲区的绘图命令


将glEnableClientState替换为GlenableVertexAttributeArray的主要原因是,由于OpenGL-3始终使用顶点数组(不再存在立即模式),因此数据是客户端还是服务器端的区别取决于各个缓冲区对象插槽的绑定状态。如果绑定了缓冲区对象0,则数据为客户端,如果绑定的缓冲区对象为非零,则数据为服务器端。

当绑定缓冲区时,使用指针的指针和绘图调用(例如
glvertexattributepointer
gldrawerelements
)都会将索引偏移量带入绑定的缓冲区。这意味着这是一个服务器端操作,因为这些绑定的缓冲区已经将其数据传输到图形内存。当它们未绑定时,我需要传入一个指向本地缓冲区的指针和数据,这将使其成为客户端操作。对否则你会把我和最后一句话完全搞混。@StevenLu:完全一样。不幸的是,OpenGL API在指针的伪装下传递偏移量时弄糟了。在C中,如果不调用未定义的行为,就无法通过函数将当前定义的偏移量传递给OpenGL。要么将数字强制转换为指针,该指针对于数字是未定义的,不是通过将指针强制转换为int得到的,要么将函数签名强制转换为获取uintpttr_t,这可能会严重改变参数的传递方式。唯一合理的解决方案:一个新的OpenGL函数
glVertexAttribOffset
是的,我同意它肯定会减少不带指针的版本的混乱。我见过有人使用一个宏,将NULL转换为char*,然后向其添加偏移量。指针似乎被解释为字节偏移量整数。@StevenLu:请参阅我写的关于该主题的内容,以获得一些深入的见解: