一个 VAO 中包含多个 VBO

Mat*_*tie 3 c++ opengl

你会如何拥有一个用于位置的 VBO、一个用于纹理坐标的 VBO 以及最后一个用于法线的 VBO 的示例?目前我只能为一个VAO创建一个VBO,并且我不知道如何使其成为多个VBO

float vertices[] = {
    // Pos  
 0.0f,  0.0f,
 1.0f,  0.0f,
 0.0f,  1.0f,
 0.0f,  1.0f,
 1.0f,  1.0f,
 1.0f,  0.0f
};
float texcords[] = {
    0.0f, 0.0f,
    1.0f, 0.0f,
    0.0f, 1.0f,
    0.0f, 1.0f,
    1.0f, 1.0f,
    1.0f, 0.0f
};

unsigned int VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
Run Code Online (Sandbox Code Playgroud)

Rab*_*d76 7

当调用时,当前绑定到的缓冲区对象ARRAY_BUFFER与顶点属性(索引)相关联。对顶点缓冲区对象glVertexAttribPointer(对象 id)的引用存储在顶点数组对象的状态向量中。 只需在指定顶点属性之前指定正确的 VBO:

unsigned int VBO[2];
glGenBuffers(2, VBO);

glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(texcords), texcords, GL_STATIC_DRAW);

unsigned int VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
glEnableVertexAttribArray(1);
Run Code Online (Sandbox Code Playgroud)