Итак, сегодня я хотел узнать, как я могу использовать класс Vector2 & Color для отправки данных в OpenGL с довольно чистым синтаксисом.

План такой.

/*
Vector2 (8 bytes)
Color (16 bytes)
Vector2 + Color = 24 bytes
    
How can memory be laid out like this?

{Vector2, Color},
{Vector2, Color},
{Vector2, Color}
*/

Итак, у меня есть два массива данных.

Vector2 vertices[] = {
    Vector2(0.0f, 0.5f),
    Vector2(0.5f, -0.5f),
    Vector2(-0.5f, -0.5f)
};

// colors would be mapped to there respective indexes in the vertices array (i.e colors[0] is mapped to vertices[0])
Color colors[] = {
    Color(1.0f, 0.3f, 0.3f),
    Color(0.3f, 1.0f, 0.3f),
    Color(0.3f, 0.3f, 1.0f)
};

Мне удалось получить правильный рендеринг треугольника в правильных точках, введите описание изображения здесь

Но отправить данные о цвете мне было довольно сложно.

В настоящее время я получаю следующий результат. введите описание изображения здесь

Вот фрагмент кода.


    // positions on screen
    Vector2 vertices[] = {
        Vector2(0.0f, 0.5f),
        Vector2(0.5f, -0.5f),
        Vector2(-0.5f, -0.5f)
    };

    // colors for each position
    Color colors[] = {
        Color(1.0f, 0.3f, 0.3f),
        Color(0.3f, 1.0f, 0.3f),
        Color(0.3f, 0.3f, 1.0f)
    };

    // create vertex and array buffers (each bound automatically)
    unsigned int vertexArray = createVertexArray();
    unsigned int vertexBuffer = createBuffer(GL_ARRAY_BUFFER);

    // allocate the data
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(colors), nullptr, GL_STATIC_DRAW);

    // fill up allocated memory 
    for (int i = 0; i < 3; ++i) {
        glBufferSubData(GL_ARRAY_BUFFER, sizeof(Vector2) * i, sizeof(Vector2), &vertices[i]);
        glBufferSubData(GL_ARRAY_BUFFER, (sizeof(Vector2) + sizeof(Color)) * (i + 1), sizeof(Color), &colors[i]);
    }

    // set up vertex attributes
    glVertexAttribPointer(0, 2, GL_FLOAT, false, sizeof(Vector2) + sizeof(Color), nullptr);
    glVertexAttribPointer(1, 3, GL_FLOAT, false, sizeof(Vector2) + sizeof(Color), (const void*)( sizeof(Vector2) ));
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
0
xKaihatsu 10 Дек 2020 в 05:34

1 ответ

Лучший ответ

Вам нужно поочередно добавить в буфер 1 вершину и 1 цвет:

for (int i = 0; i < 3; ++i)
{    
    GLintptr offsetV = i * (sizeof(Vector2) + sizeof(Color)); 
    glBufferSubData(GL_ARRAY_BUFFER, offsetV, sizeof(Vector2), &vertices[i]);
 
    GLintptr offsetC = offsetV + sizeof(Vector2); 
    glBufferSubData(GL_ARRAY_BUFFER, offsetC, sizeof(Color), &colors[i]);
} 
2
Rabbid76 10 Дек 2020 в 05:33