代码之家  ›  专栏  ›  技术社区  ›  An Hoa

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

  •  1
  • An Hoa  · 技术社区  · 7 年前

    在几个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);
    

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

    从这段教程代码中,我倾向于相信最后一个参数 glVertexAttribPointer 应该是指向顶点数据所在位置的指针。但是,文件 https://www.khronos.org/opengl/wiki/Vertex_Specification 似乎暗示着 整数 但是 故意投 给一个 const void* 是的。

    但是为什么上面的代码能工作呢?OpenGL如何知道何时将参数解释为指针,何时解释为整数?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Nicol Bolas    7 年前

    但是为什么上面的代码能工作呢?

    因为opengl es仍然支持桌面opengl在3.2中删除它之前的功能。wiki描述了核心桌面opengl的功能。

    需要注意的是,es确实不鼓励对顶点数据使用客户端内存的做法。但由于向后兼容,他们不得不继续“支持”它。

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

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