为什么没有glBindBuffer的glVertexAttribPointer也可以工作?

时间:2018-07-22 14:12:51

标签: opengl-es

在几个OpenGL ES示例中,我看到了以下代码

GL_FLOAT vVertices[] = { 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), vVertices);
glEnableVertexAttribArray(0);
glDrawArraysInstanced(GL_TRIANGLES, 0, 3, 1);

画一个三角形。 (您可以轻松地用简单的着色器填充,唯一的顶点属性假定是2D坐标的vec2。)

从这段教程代码中,我倾向于认为glVertexAttribPointer的最后一个参数应该是指向顶点数据所在位置的指针。但是,文档https://www.khronos.org/opengl/wiki/Vertex_Specification似乎暗示它应该是整数,但是故意将强制转换为const void*

但是为什么上面的代码起作用? OpenGL如何知道何时将参数解释为指针以及何时解释为整数?

1 个答案:

答案 0 :(得分:3)

  

但是上面的代码为什么起作用?

因为OpenGL ES仍支持从桌面OpenGL在3.2中删除该功能之前的功能。 Wiki描述了核心桌面OpenGL的功能。

应注意,ES确实不鼓励使用客户端存储器存储顶点数据。但是由于向后兼容,他们必须继续“支持”它。

  

OpenGL如何知道何时将参数解释为指针以及何时解释为整数?

如果将缓冲区对象绑定到GL_ARRAY_BUFFER,则Pointer参数将被解释为整数。如果没有缓冲区绑定到该绑定点,则Pointer参数必须是实际的内存指针。