VertexBuffer смешивает вершины - PullRequest
2 голосов
/ 18 мая 2019

Я пытаюсь перейти от простого 2D-рендеринга к пакетному, он почти работает, за исключением того факта, что то, что кажется вторым вызовом, смешивает вершины. Я попытался изменить все, от данных буфера и AttribPointer до VertexCount и самих вершин, все еще получая с кодом прямо сейчас заданную позицию (0,0) и размер (1,1) красного квадрата, но на втором красном квадрате, который надо нарисовать поверх первого я получаю красный треугольник, затем на третьем тот же красный квадрат и на четвертом треугольник и так далее ...

Шейдер получает только местоположение 0 vec2, а gl_Position устанавливается на это.

#define RENDERER_MAX_SPRITES 10000
#define RENDERER_SPRITE_SIZE (sizeof(float) * 2)
#define RENDERER_BUFFER_SIZE (RENDERER_SPRITE_SIZE * 6 * RENDERER_MAX_SPRITES)

void BatchRenderer::Initialize() {
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);

    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, RENDERER_BUFFER_SIZE, nullptr, GL_DYNAMIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, RENDERER_SPRITE_SIZE, (void*)0);
    glBindVertexArray(0);
}

void BatchRenderer::Add(iVec2 position, iVec2 size, Color& color, Texture& texture) {
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    float vertices[12] = {
        position.x,          position.y,         
        position.x,          position.y + size.y,
        position.x + size.x, position.y + size.y,
        position.x + size.x, position.y + size.y,
        position.x + size.x, position.y,         
        position.x,          position.y      
    };

    glBufferSubData(GL_ARRAY_BUFFER, VertexSum, sizeof(vertices), &vertices);
    VertexSum += 12;
    VertexCount += 6;
    glBindVertexArray(0);
}

void BatchRenderer::Flush() {
    shader.Use();
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glDrawArrays(GL_TRIANGLES, 0, VertexCount);
    glBindVertexArray(0);
    VertexCount = 0;
    VertexSum = 0;
}

1 Ответ

3 голосов
/ 18 мая 2019

Для второго аргумента glBufferSubData ожидаем смещение в байтах .Это означает, что для каждых шести вершин вы Add смещение должны быть увеличены на 6*2*sizeof(float) или, что эквивалентно, sizeof(vertices):

glBufferSubData(GL_ARRAY_BUFFER, VertexSum, sizeof(vertices), &vertices);
VertexSum += sizeof(vertices);
VertexCount += 6;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...