是glVertexAttribPointer状态绑定到当前GL_ARRAY_BUFFER?

问题描述 投票:3回答:2

我有一个简单的问题。它是正确的,即glVertexAttribPointer行动已进行一次的GL_ARRAY_BUFFER保存属性的状态,直到我要改变他们叫什么名字?或者我需要glVertexAttribPointer每次调用glBindBuffer(GL_ARRAY_BUFFER, ...);glDrawArrays(...);之间?

arrays opengl buffer vertex vao
2个回答
3
投票

它是正确的,对于一个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 ObjectxglGenVertexArrays),其存储所有关于数据格式,状态,属性索引和顶点缓存对象的名称的信息:

产生并指定顶点数组对象

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 );

0
投票

我不明白你的问题很好。但是,使用glVertexAttribPointer必须对您的当前绑定VBO使用:

glBindVertexArray(vao);
glBindBuffer(ARRAY_BUFFER, position);
glEnableVertexAttribArray(0);
glVertexAttribPointer...
glBindBuffer(normal);
glEnableVertex...
glVertexAttribPointer...

....

glBindVertexArray(vao);
glDrawArrays...
© www.soinside.com 2019 - 2024. All rights reserved.