在几个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如何知道何时将参数解释为指针以及何时解释为整数?
答案 0 :(得分:3)
但是上面的代码为什么起作用?
因为OpenGL ES仍支持从桌面OpenGL在3.2中删除该功能之前的功能。 Wiki描述了核心桌面OpenGL的功能。
应注意,ES确实不鼓励使用客户端存储器存储顶点数据。但是由于向后兼容,他们必须继续“支持”它。
OpenGL如何知道何时将参数解释为指针以及何时解释为整数?
如果将缓冲区对象绑定到GL_ARRAY_BUFFER
,则Pointer参数将被解释为整数。如果没有缓冲区绑定到该绑定点,则Pointer参数必须是实际的内存指针。