glVertexPointer 的目的是啥?

Posted

技术标签:

【中文标题】glVertexPointer 的目的是啥?【英文标题】:What's the purpose of glVertexPointer?glVertexPointer 的目的是什么? 【发布时间】:2015-01-17 00:41:50 【问题描述】:

我正在查看 CUDA 的 Particles 示例,但找不到它们在哪里建立顶点数组和着色器中的变量之间的链接。从我所读到的以及实际上我一直在做的方式是

...
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData( ... )
glEnableVertexAttribArray(0);
glVertexAttribPointer( ... );
...

但是我在 Nvidia 的例子中发现的看起来像

glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vbo);
glVertexPointer(4, GL_FLOAT, 0, 0);
glEnableClientState(GL_VERTEX_ARRAY);

if (m_colorVBO)

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_colorVBO);
    glColorPointer(4, GL_FLOAT, 0, 0);
    glEnableClientState(GL_COLOR_ARRAY);


glDrawArrays(GL_POINTS, 0, m_numParticles);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

我相信这与我所做的类似。所以我的问题是

    这两种向着色器传递数据的方式有什么区别? 我应该更喜欢其中一个吗?

【问题讨论】:

【参考方案1】:

第一种方式是发送属性的现代通用方式。第二个比较老,顶点、法线、颜色等都有自己的硬编码属性。它不应该在现代代码中使用。

【讨论】:

【参考方案2】:

glVertexAttribPointer 是将属性传递给 GPU 的当前首选方式。

glVertexPointer 是旧的和已弃用的固定函数管道的一部分,并将 openGL 设置为使用 VBO 作为属性。

本质上,使用 glVertexPointer 定义的内容是如果您在缓冲区上循环并为值调用 glVertex4f(x,y,z,w) 时将传递的内容。

【讨论】:

其实和glBegin/glEnd一点关系都没有。这些只是固定功能管道的内置属性。立即模式和顶点数组之间的区别在这里并不重要。请注意,还有glVertexAttrib* 系列函数,它允许在旧版GL / 兼容性配置文件中使用Begin/End 在即时模式下使用通用属性。

以上是关于glVertexPointer 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

poi是啥

poi是啥意思

POI是啥如何使用

poi是啥意思二次元

切换到 glVertexPointer 后未应用 Cg 着色器

如何使用 glDrawArrays 和 glVertexPointer?