Нужно ли создавать два разных VAO VBO для данных, которые очень похожи - PullRequest
1 голос
/ 21 января 2020

Я рисую круг, это мой код для извлечения данных для круга.

// 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?

1 Ответ

4 голосов
/ 21 января 2020

Нужно ли создавать новые VAO и VBO для новых данных или я могу обновить существующие данные в объекте VBO

Нет. Добавьте матрицу преобразования модели в программу шейдера и установите индивидуальную позицию, ориентацию и масштаб окружностей с помощью матрицы модели. Например:

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( ... );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...