c++ - 一个 VBO 可以绑定(bind)到多个 VAO 吗?

标签 c++ c opengl glsl

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

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

这是我设置模型 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 );

然后我像这样设置 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 );

是否可以像这样将同一个 VBO 与多个 VAO 一起使用?

最佳答案

Yes . VAO 仅存储对 VBO 的引用,以及格式、偏移量等相关数据,如 glVertexAttribPointer 所指定。 . Index VBOs语义略有不同。

关于c++ - 一个 VBO 可以绑定(bind)到多个 VAO 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15438605/

相关文章:

c - 使用 STM32F0 ADC 单独读取不同的输入

c - 如何在 Xcode 中为命令行工具程序创建 .app 文件

python - 将 PyOpenGL 从 PyGame 转移到 PyQt5 的困惑

C++ 如何检查 Outlook 进程是否已经在运行

c++ - 从文本文件中读取行和列 QT GUI C++

c++ - 抽象基类成员变量

c - 整数除法的行为是什么?

c++ - 'pass variable by reference' 是如何工作的?

c++ - typedef struct 与 struct - ‘struct' 的存储大小未知

opengl - 将颜色应用于opengl中四边形中的单个顶点