2012-01-11 58 views
6

后者是否不赞成前者?glEnableClientState和glEnableVertexAttribArray

我正在编写代码,我想在着色器2.0硬件上工作,但我想使用更新的编程约定,如VAO。

所以我一直在使用glVertexAttribPointer函数代替glVertexPointer,glNormalPointer,glColorPointer等等。

看起来好像我们已经到了服务器 - 客户端概念不是特别相关的地步(编辑:我的意思是它适用于切换这些缓冲区指针的状态)。但我想知道旧的En/DisableClientState实际上的功能以及它与glEnableVertexAttribArray的实际功能有什么关系。

而且我也没有任何图形硬件从5代以前,但肯定我的软件的某些用户可能。例如,我可以如何防止我的代码无法在Radeon 9700上编译? (虽然我希望如果用户拥有最新的驱动程序可能支持新的东西)

回答

8

这好像我们已经到了一个地步服务器 - 客户端的概念是不是......特别相关

其实它非常相关。整个缓冲区对象术语是根据服务器和客户端。缓冲区是服务器端,客户端只是发出引用服务器端缓冲区的绘图命令。

用glEnableVertexAttribArray替换glEnableClientState的主要原因是,由于OpenGL-3总是使用顶点数组(不再有立即模式),并且数据是客户端或服务器端的区别是由绑定状态各种缓冲区对象的插槽。如果绑定了缓冲区对象0,则数据是客户端,如果绑定的缓冲区对象不为零,则为服务器端。

+0

使用指针(例如'glVertexAttribPointer'和'glDrawElements')的指针和绘图调用在绑定缓冲区时都将索引偏移量带入绑定缓冲区。这意味着这是一个服务器端操作,因为这些绑定缓冲区已经将其数据传输到图形内存。当它们没有被绑定时,我需要传递一个指向本地缓冲区的指针,这个缓冲区会产生一个客户端操作。是?否则,你会让我完全同意最后一句话。 – 2012-01-11 23:49:35

+0

@StevenLu:的确如此。不幸的是,OpenGL API弄乱了指针的伪装。没有办法通过函数来​​传递OpenGL在C中的偏移量,因为它们在此刻被定义,而不会调用未定义的行为。要么给一个指向数字的指针,而不是指向int的指针,或者将函数签名强制转换为uintptr_t,这可能会严重地改变参数传递的方式。只有理智的解决方案:一个新的OpenGL函数'glVertexAttribOffset' – datenwolf 2012-01-12 10:27:16

+0

是的,我同意这样做肯定不会造成混淆,使一个不带指针的版本。我已经看到人们使用一个将char转换为NULL的宏,然后为其添加偏移量。它看起来像指针被解释为一个字节偏移整数。 – 2012-01-12 12:09:48

相关问题