为什么没有 glBindBuffer 的 glVertexAttribPointer 也可以工作?
Why does glVertexAttribPointer without glBindBuffer also work?
在几个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 如何知道何时将参数解释为指针以及何时解释为整数?
But why does the code above work?
因为 OpenGL ES 仍然支持桌面 OpenGL 在 3.2 中删除之前的功能。该 wiki 描述了核心桌面 OpenGL 的功能。
应该注意的是,ES 不鼓励将客户端内存用于顶点数据的做法。但由于向后兼容性,他们必须继续 "supporting" 它。
How does OpenGL know when to interpret the argument as pointer and when to interpret as integer?
如果缓冲区对象绑定到 GL_ARRAY_BUFFER
,则指针参数被解释为整数。如果没有缓冲区绑定到该绑定点,则 Pointer 参数必须是实际的内存指针。
在几个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 如何知道何时将参数解释为指针以及何时解释为整数?
But why does the code above work?
因为 OpenGL ES 仍然支持桌面 OpenGL 在 3.2 中删除之前的功能。该 wiki 描述了核心桌面 OpenGL 的功能。
应该注意的是,ES 不鼓励将客户端内存用于顶点数据的做法。但由于向后兼容性,他们必须继续 "supporting" 它。
How does OpenGL know when to interpret the argument as pointer and when to interpret as integer?
如果缓冲区对象绑定到 GL_ARRAY_BUFFER
,则指针参数被解释为整数。如果没有缓冲区绑定到该绑定点,则 Pointer 参数必须是实际的内存指针。