opengl:两个不同的矢量可以绑定到同一个顶点数组对象吗

opengl : can two different vectors bind to the same vertex array object?

本文关键字:绑定 同一个 顶点 对象 数组 两个 opengl      更新时间:2023-10-16

我有两个向量,std::vector col和std::矢量位置,

我的着色器如下:

const GLchar* vertexShaderSource = "#version 330 coren"
"layout (location = 0) in vec2 position;n"
"layout (location = 1) in vec3 PColor;n"
"out vec3 color;n"
"void main()n"
"{n"
"gl_Position = vec4(position.x, position.y, 0.0, 1.0);n"
"color = PColor;n"
"}";

const GLchar* fragmentShaderSource = "#version 330 coren"
"out vec4 color;n"
"in vec4 PColor;n"
"void main()n"
"{n"
"color = PColor;n"
"}n";

我可以执行以下操作将pos和col绑定到同一VAO 吗

void CreateVertexBuffer()
{
glGenBuffers(1, &posbuffer);
glGenVertexArrays(1, &VAO);
glBindBuffer(GL_ARRAY_BUFFER, posbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(int) * pos.size(), &pos.front(), GL_STATIC_DRAW);
glBindVertexArray(VAO);
glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 2 * sizeof(GL_INT), (GLvoid*)0);
glEnableVertexAttribArray(0);
//glBindVertexArray(0); delete
glGenBuffers(1, &colbuffer);
glBindBuffer(GL_ARRAY_BUFFER, colbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GL_FLOAT) * col.size(),  &col.front(), GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), (GLvoid*)0);
glEnableVertexAttribArray(1);
glBindVertexArray(0);  
}

我想让我的程序画一个圆圈,但核心被丢弃了,所以我认为我的VAO绑定可能有一些问题。谢谢

  1. 您应该在生成VBOs之前生成VAO

    glGenVertexArrays(1, &vao[object_id]);
    glBindVertexArray(vao[object_id]);
    glGenBuffers(1, &vbo[0]);
    glBindBuffer(target, vbo[0]);
    glBufferData(target, size, data1, dataType);
    glEnableVertexAttribArray(h_Attributes[UV]);
    glVertexAttribPointer(h_Attributes[UV], 2, GL_FLOAT, 0, 0, 0);
    glGenBuffers(1, &vbo[1]);
    glBindBuffer(target, vbo[1]);
    glBufferData(target, size, data2, dataType);
    glEnableVertexAttribArray(h_Attributes[POSITION]);
    glVertexAttribPointer(h_Attributes[POSITION], 3, GL_FLOAT, 0, 0, 0);
    
  2. 位置矢量必须是float而不是int,因为它在着色器中是vec2

  3. 我不确定,但如果不放2*sizeof(GL_INT)和3*sizeof(GL_FLOAT),你的数组似乎没有步幅

更新绘制对象时,必须绑定生成的vao

glBindVertexArray(vao[object_id]);

如果不更新数组的任何值,则不需要在渲染循环中绑定任何vbo。但是,如果需要更新顶点的颜色或位置,则必须调用这些函数。

glBindVertexArray(vao[object_id]);
glBindBuffer(target, vbo[object_id]);   
glBufferData(GL_ARRAY_BUFFER, sizeof(the_array), &the_array[0], GL_DYNAMIC_DRAW);