VBO可以绑定多个VAO吗?

Ped*_*pam 6 c c++ opengl glsl

我试图通过将其纹理坐标视为顶点位置数组来渲染模型的UV贴图.我为完美呈现的模型设置了VAO,然后尝试添加第二个VAO并将纹理坐标缓冲区绑定到它.不幸的是它没有渲染任何东西.

我为UV地图编写了第二组顶点和片段着色器,编译得很好.缓冲区的绑定方式与模型VAO和顶点属性集的绑定方式相同.我能看到的唯一区别是我没有重新指定缓冲区数据.

这是我设置VAO模型的代码:

// Create model VAO

glGenVertexArrays( 1, &modelVAO );
glBindVertexArray( modelVAO );

// Create position buffer

glGenBuffers( 1, &positionBuffer );
glBindBuffer( GL_ARRAY_BUFFER, positionBuffer );
glBufferData( GL_ARRAY_BUFFER, sizeof( GLfloat ) * vertexCount * 4, positions, GL_STATIC_DRAW );
glVertexAttribPointer( 0, 4, GL_FLOAT, GL_FALSE, 0, 0 );
glEnableVertexAttribArray( 0 );

// Create normal buffer

glGenBuffers( 1, &normalBuffer );
glBindBuffer( GL_ARRAY_BUFFER, normalBuffer );
glBufferData( GL_ARRAY_BUFFER, sizeof( GLfloat ) * vertexCount * 3, normals, GL_STATIC_DRAW );
glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 0, 0 );
glEnableVertexAttribArray( 1 );

// Create texture coordinate buffer

glGenBuffers( 1, &textureCoordinateBuffer );
glBindBuffer( GL_ARRAY_BUFFER, textureCoordinateBuffer );
glBufferData( GL_ARRAY_BUFFER, sizeof( GLfloat ) * vertexCount * 2, textureCoordinates, GL_DYNAMIC_DRAW );
glVertexAttribPointer( 2, 2, GL_FLOAT, GL_FALSE, 0, 0 );
glEnableVertexAttribArray( 2 );

// Unbind model VAO

glBindVertexArray( 0 );
Run Code Online (Sandbox Code Playgroud)

然后我像这样设置UV地图VAO:

// Create new UV map VAO

glGenVertexArrays( 1, &uvMapVAO );
glBindVertexArray( uvMapVAO );

// Bind texture coordinate buffer

glBindBuffer( GL_ARRAY_BUFFER, textureCoordinateBuffer );
glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 0, 0 );
glEnableVertexAttribArray( 0 );

// Unbind UV map VAO

glBindVertexArray( 0 );
Run Code Online (Sandbox Code Playgroud)

可以像这样使用多个VAO的相同VBO吗?

Bre*_*ale 8

是的.VAO只存储对VBO的引用,以及glVertexAttribPointer指定的格式,偏移等相关数据.索引VBO的语义略有不同.