我了解使用VAO时,理想的是提供所有属性数据,例如顶点法线,顶点位置,顶点颜色,纹理坐标等。但是在使用drawElements
而不是绘制时的索引数据又如何呢? drawArrays
?
到目前为止,我创建了一个VAO并提供了上面的数据,但不确定如何将索引缓冲区数据附加到VAO(如果甚至建议这样做或可能的话)
答案 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_ENABLED
,VERTEX_ATTRIB_ARRAY_SIZE
,VERTEX_ATTRIB_ARRAY_STRIDE
,VERTEX_ATTRIB_ARRAY_TYPE
,VERTEX_ATTRIB_ARRAY_NORMALIZED
,VERTEX_ATTRIB_ARRAY_INTEGER
,VERTEX_ATTRIB_ARRAY_DIVISOR
,VERTEX_ATTRIB_ARRAY_POINTER
,ELEMENT_ARRAY_BUFFER_BINDING
,VERTEX_ATTRIB_ARRAY_BUFFER_BINDING
。
我很好奇,是否会将索引缓冲区对象数据或统一存储在VAO内部? 制服存储在属于程序对象的默认制服块中。
统一存储在属于程序对象的默认统一块中,与顶点数组对象无关。