我是否需要为非常相似的数据创建两个不同的 VAO 和 VBO

Do i need to create two different VAO an VBO for data which is very similar

我正在画一个圆,这是我提取圆数据的代码。

// Vertices
    data.push_back(0.0f);
    data.push_back(0.0f);
    data.push_back(0.0f);
    // Normal
    data.push_back(0.0f);
    data.push_back(0.0f);
    data.push_back(1.0f);
    // Texture Coord
    data.push_back(0.5f);
    data.push_back(0.5f);

    for (int i = 0; i < iSegments + 1; i++)
    {
    //  float angle = 2.0f * M_PI * i / iSegments;
        float initialAngle = startAngle * (M_PI / 180);
        float angle = initialAngle + ((angleCircle *( M_PI / 180)) * i / iSegments);
        // vertex data
        float x, y, z ,tx,ty ,tz;
        x = cos(angle)  * 50.0;
        y = sin(angle)  * 50.0;
        z = 0.0;
        tx = cos(angle) * 0.5 + 0.5f;
        ty = sin(angle) * 0.5 + 0.5f;
        data.push_back(x);
        data.push_back(y);
        data.push_back(z);
        data.push_back(0.0f);
        data.push_back(0.0f);
        data.push_back(1.0f);
        data.push_back(tx);
        data.push_back(ty);
    }

    glGenVertexArrays(1, &m_VAO);
    glGenBuffers(1, &m_VBO);
    glBindVertexArray(m_VAO);
    glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
    glBufferData(GL_ARRAY_BUFFER, data.size() * sizeof( float ) , &data[0], GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(2);
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
    glBindVertexArray(0);
    //glEnableVertexAttribArray(0);
    isInited = true;

如果我想绘制另一个圆圈,其中唯一的数据差异是该圆圈的 z 位置,即 50.0 而不是 0.0。

我是否需要为新数据创建另一个 VAO 和 VBO,或者我可以更新 VBO 对象中的现有数据吗?

Do i need to create another VAO and VBO for the new data or can i update the existing data in the VBO object

没有。在着色器程序中添加一个模型变换矩阵,并通过模型矩阵设置圆的各个位置、方向和比例。例如:

in vec3 vertex;
layout (location = 0) uniform mat4 u_model;

void main()
{
    vec4 worldPos = u_model * vec4(vertex.xyz, 1.0);

    // [...]
}
glUniformMatrix4fv(0, 1, GL_FALSE, model1);
glDrawArrays( ... );

glUniformMatrix4fv(0, 1, GL_FALSE, model2);
glDrawArrays( ... );