是否将索引数据附加到VAO(顶点数组对象)?

时间:2018-10-26 05:00:56

标签: opengl-es webgl2

我了解使用VAO时,理想的是提供所有属性数据,例如顶点法线,顶点位置,顶点颜色,纹理坐标等。但是在使用drawElements而不是绘制时的索引数据又如何呢? drawArrays

到目前为止,我创建了一个VAO并提供了上面的数据,但不确定如何将索引缓冲区数据附加到VAO(如果甚至建议这样做或可能的话)

1 个答案:

答案 0 :(得分:1)

顶点数组对象中没有存储任何缓冲区的数据。顶点数组对象只是收集有关如何“使用”不同缓冲区数据的信息。 它知道诸如数据格式,类型,步幅偏移和缓冲区名称之类的信息,但它不会“镜像”存储在缓冲区对象中的数据。

命名元素缓冲区对象的名称是顶点数组对象状态向量的状态。

这意味着在顶点数组对象中没有存储任何数据。索引存储在元素缓冲区中,但索引缓冲区的名称(整体对象号)在顶点数组对象中引用。

GL_ELEMENT_ARRAY_BUFFER必须在绑定顶点数组对象(glBindVertexArray)之后绑定。 GL_ELEMENT_ARRAY_BUFFER对象存储在顶点数组对象状态向量中。
如果顶点数组对象已解除绑定并再次绑定,则GL_ELEMENT_ARRAY_BUFFER是已知的并再次绑定。但是,如果绑定顶点数组对象时元素数组缓冲区显式解除绑定,则会从状态向量中将其删除。

请参见OpenGL ES 3.0.5 Specification - 2.11 Vertex Array Objects, page 44

  

通过绑定GenVertexArrays返回的名称来创建顶点数组对象   使用命令

void BindVertexArray( uint array );
     

array是顶点数组对象名称。所得的顶点数组对象是一个新的状态向量,包括所有状态,并且初始值与表6.2中列出的相同。
  BindVertexArray也可以用于绑定现有的顶点数组对象。   如果绑定成功,则不会更改绑定的顶点数组对象的状态,并且任何先前的绑定都会中断。

     

表6.2,顶点数组对象状态
  VERTEX_ATTRIB_ARRAY_ENABLEDVERTEX_ATTRIB_ARRAY_SIZEVERTEX_ATTRIB_ARRAY_STRIDEVERTEX_ATTRIB_ARRAY_TYPEVERTEX_ATTRIB_ARRAY_NORMALIZEDVERTEX_ATTRIB_ARRAY_INTEGERVERTEX_ATTRIB_ARRAY_DIVISORVERTEX_ATTRIB_ARRAY_POINTER ELEMENT_ARRAY_BUFFER_BINDING VERTEX_ATTRIB_ARRAY_BUFFER_BINDING


  

我很好奇,是否会将索引缓冲区对象数据或统一存储在VAO内部?   制服存储在属于程序对象的默认制服块中。

统一存储在属于程序对象的默认统一块中,与顶点数组对象无关。