Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在OpenGL中为什么获胜';除非我再次指定顶点属性,否则我不会绘制缓冲区对象吗?_C++_Opengl_Graphics_Buffer_Vertex - Fatal编程技术网

C++ 在OpenGL中为什么获胜';除非我再次指定顶点属性,否则我不会绘制缓冲区对象吗?

C++ 在OpenGL中为什么获胜';除非我再次指定顶点属性,否则我不会绘制缓冲区对象吗?,c++,opengl,graphics,buffer,vertex,C++,Opengl,Graphics,Buffer,Vertex,我认为VAO(顶点数组对象)应该像顶点属性一样存储状态。创建VBO时,我指定顶点属性: glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)nullptr); glEnableVertexAttribArray(0); // And so on 如果我绑定另一个VBO,我必须调用glVertexAttributePointer和GlenableVertexAttributeArray三次,这是每次切

我认为VAO(顶点数组对象)应该像顶点属性一样存储状态。创建VBO时,我指定顶点属性:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)nullptr);
glEnableVertexAttribArray(0);
// And so on

如果我绑定另一个VBO,我必须调用glVertexAttributePointer和GlenableVertexAttributeArray三次,这是每次切换VBO时的情况。我只有一个VAO,我从不改变它。有什么不对劲吗?我只使用一个顶点布局,我不明白如果每次切换时VAO丢失了这些信息,它会做什么。每个VAO是否只有一个VBO?

如果您不想在调用glDraw*函数之前重新指定glVertexAttribPointer,那么您需要多个VAO,而不仅仅是一个。我认为你混淆了VBO和VAO是什么。VBO只是包含数据的惰性内存块。VAO包含OpenGL绘制网格所需的所有信息,包括:
-对包含顶点数据的缓冲区对象的引用(通常称为VBO)
-对包含顶点索引的缓冲区对象的引用(如果您使用的是GL抽屉元素*)
-要使用的不同顶点属性的索引及其在包含顶点数据的缓冲区对象中的布局(使用GlenableVertexAttributeArray和GlVertexAttributePointer指定)

因此,对于要绘制的每个网格,基本上需要准备相应的vao:

// at scene preparation time
glBindVertexArray(vaoA); // the following functions will only affect vaoA
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_of_meshA);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_of_meshA);
foreach attrib of meshA
  glEnableVertexAttribArray(***);
  glVertexAttribPointer(***)
glBindVertexArray(0)

glBindVertexArray(vaoB); // the following functions will only affect vaoB
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_of_meshB);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_of_meshB);
foreach attrib of meshB
  glEnableVertexAttribArray(***);
  glVertexAttribPointer(***)
glBindVertexArray(0)

//And now at render time:
void render()
{
   glBindVertexArray(vaoA);
   glDrawElements(***);

   glBindVertexArray(vaoB);
   glDrawElements(***);
}
有关更多信息,请查看: