2016-10-28 38 views
1

考虑下面的OpenGL代码片段:定义一个指针OpenGL的顶点数组对象

GLuint vao; 
glCreateVertexArrays(1, glBindVertexArray(&vao));  

我的印象中,这是什么代码确实是

  1. 下是创建类型的指针, GLuint,最终将指向一个OpenGL顶点数组对象。这个指针的名字是vao
  2. 通过OpenGL为实际顶点阵列对象间接分配内存(即C中不使用malloc或使用C++中的malloc或使用C++中的new)。这样做的方式是通过功能glCreateVertexArrays。该功能还使指针vao指向顶点数组对象。

我的理解是否正确?如果是这样,在(1)中,为什么指针GLuint的类型并没有明确定义为指针类型(例如在C/C++中使用*或使用OpenGL类型GLintptr)?

回答

5

此代码无效,glBindVertexArray返回void,因此无法将其返回值作为参数传递给glCreateVertexArrays,因为没有。

创建VAO,按照OpenGL的4.5配置文件的正确方法是:

GLuint vao; 
glCreateVertexArrays(1, &vao); 

为每vao为什么意义的类型是GLuint:它是不是的指针。这是一个不透明的值,用于内部定位VAO在OpenGL实现表中。驱动程序可以在CPU和/或GPU上分配内存来存储与VAO相关的状态。这是一个复杂的状态,有很多簿记,这比mallocnew涉及更多。 (特别是malloc不能用于分配GPU内存。)

+1

所以我应该把'vao'想象成类似于散列表查找中的(无符号整数)键(这可以让我到顶点数组对象)? – George

+2

@George:非常漂亮。这就是所有[OpenGL对象](https://www.opengl.org/wiki/OpenGL_Object)的工作原理。 –