glVertexPointer的目的是什么?

时间:2014-11-19 13:17:26

标签: opengl glsl nvidia

我正在查看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. 我应该更喜欢一个吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

glVertexPointer是旧的和不推荐使用的固定函数管道的一部分,并设置openGL以使用VBO作为属性。

实质上用glVertexPointer定义的是当你遍历缓冲区并为值调用glVertex4f(x,y,z,w)时将传递的内容。