glVertexPointer 的目的是什么?

BRa*_*t27 3 opengl nvidia glsl

我正在查看CUDA的粒子示例,但找不到它们在顶点数组和着色器中的变量之间建立链接的位置。从我读过的和实际上我一直在做的方式来看

...
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData( ... )
glEnableVertexAttribArray(0);
glVertexAttribPointer( ... );
...
Run Code Online (Sandbox Code Playgroud)

然而我在 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);
Run Code Online (Sandbox Code Playgroud)

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

  1. 这两种将数据传递给着色器的方式有什么区别?
  2. 我应该更喜欢一个吗?

Sur*_*ine 7

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


rat*_*eak 5

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

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

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

  • 实际上,它与`glBegin/glEnd`完全无关。这些只是固定功能管道的内置属性。立即模式和顶点数组之间的区别在这里并不真正相关。请注意,还有“glVertexAttrib*”函数系列,它允许在即时模式下使用通用属性以及旧 GL/兼容性配置文件中的“Begin/End”。 (2认同)