我有一个简单的问题。它是正确的,即glVertexAttribPointer
行动已进行一次的GL_ARRAY_BUFFER
保存属性的状态,直到我要改变他们叫什么名字?或者我需要glVertexAttribPointer
每次调用glBindBuffer(GL_ARRAY_BUFFER, ...);
和glDrawArrays(...);
之间?
它是正确的,对于一个GL_ARRAY_BUFFER保存属性的状态,直到我要改变他们glVertexAttribPointer操作已被调用一次?或者我需要调用glVertexAttribPointer各一次。
glVertexAttribPointer
指定通用顶点属性的指定索引处的阵列的位置和数据格式。此信息存储在Vertex Array Object。请注意,在OpenGL中总有约束顶点数组对象。将默认的顶点数组对象(0),它不能被删除,或者一个非零命名顶点数组对象。
顶点属性阵列的规格有一个对象被绘制之前完成:
glBindBuffer( ARRAY_BUFFER, posBufObj );
glEnableVertexAttribArray( 0 );
glVertexAttribPointer( 0, .... );
glBindBuffer( nvBufObj );
glEnableVertexAttribArray( 1 );
glVertexAttribPointer( 1, .... );
glDrawArrays( .... )
glDisableVertexAttribArray( 0 );
glDisableVertexAttribArray( 1 );
glBindBuffer( ARRAY_BUFFER, 0 );
是的,这是足够的每个顶点属性调用一次glVertexAttribPointer
。该Vertex Specification一直保持,直到它不重新定义,因为它是在Vertex Array Object说明。
当然,缓冲区对象,其中glVertexAttribPointer
指的是不能删除。另外,状态,顶点属性是否被启用(glEnableVertexAttribArray
)或不保持,直到顶点属性再次被禁用(glDisableVertexAttribArray
)。
关于Vertex Specification也是Khronos OpenGL的维基明确表示:
所述
glVertexAttribPointer
功能状态属性索引从获取其阵列数据。
这种状态可以用glGetVertexAttrib
检索。
有关顶点属性的更多信息可以在OpenGL CoreProfile specification发现从第10.2至10.6
为了处理不同的顶点属性的指针和不指定和启用或禁用它们交替,可以产生不同Vertex Array Objectx(glGenVertexArrays
),其存储所有关于数据格式,状态,属性索引和顶点缓存对象的名称的信息:
产生并指定顶点数组对象
vaoObj = glGenVertexArrays();
glBindVertexArray( vaoObj );
glBindBuffer( ARRAY_BUFFER, posBufObj );
glEnableVertexAttribArray( 0 );
glVertexAttribPointer( 0, .... );
glBindBuffer( nvBufObj );
glEnableVertexAttribArray( 1 );
glVertexAttribPointer( 1, .... );
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray( 0 );
绑定顶点数组对象
glBindVertexArray( vaoObj );
glDrawArrays( .... )
glBindVertexArray( 0 );
我不明白你的问题很好。但是,使用glVertexAttribPointer必须对您的当前绑定VBO使用:
glBindVertexArray(vao);
glBindBuffer(ARRAY_BUFFER, position);
glEnableVertexAttribArray(0);
glVertexAttribPointer...
glBindBuffer(normal);
glEnableVertex...
glVertexAttribPointer...
....
glBindVertexArray(vao);
glDrawArrays...