Представление буфера глубины для рендера, который использует несколько объектов массива вершин

У меня есть инфраструктура рендеринга, которая использует несколько объектов массива вершин для рендеринга сложной сцены. Каждый объект массива вершин отвечает за поддержание своего собственного набора связанных буферов, указателей и атрибутов (как они предназначены для этого).

Учитывая несколько объектов массива, отвечающих за рендеринг, как мне ввести буферизацию глубины таким образом, чтобы каждый отдельный объект массива использовал один и тот же буфер глубины во время рендеринга? Другими словами, как мне объединить концепцию Vertex Array Objects (и их хорошие свойства инкапсуляции) и буферизацию глубины, что представляется более глобальной концепцией.

Все примеры, которые я нашел, описывают использование буфера глубины в контексте кадрового буфера. Яблоко описывает эту технику здесь. Так есть ли метод для реализации буферизации глубины на уровне кадрового буфера и затем записи объектов массива вершин в этот кадровый буфер? Могу ли я привести пример, который использует VAO и буферизацию глубины?

У меня есть класс, который инкапсулирует объект массива вершин, и это его метод связывания (отвечает за настройку различных буферов, указателей и атрибутов).

void scene_GLBuffer::BindTriangles()
{
    glBindVertexArrayOES(_mVertexArrayObject);
    glGenVertexArraysOES(1, &_mVertexArrayObject);

    // generate the buffer and configure the gl pointers for position and normal data
    glGenBuffers(1, &_mVertexPositionNormalTriangles);
    /* Bind and set up vertex position and normal data */
    glBindBuffer(GL_ARRAY_BUFFER, _mVertexPositionNormalTriangles);
    glBufferData(GL_ARRAY_BUFFER,
                 sizeof(crVertexPN)*_mPositionNormalTriangleData->size(),
                 _mPositionNormalTriangleData->data(),
                 GL_STATIC_DRAW);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE,
                          sizeof(crVertexPN), (void*)offsetof(crVertexPN,Position));
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE,
                          sizeof(crVertexPN), (void*)offsetof(crVertexPN,Normal));
    glEnableVertexAttribArray(GLKVertexAttribNormal);

    // generate the buffer and configure the gl pointers for color and alpha data
    glGenBuffers(1, &_mVertexColorTriangles);
    glBindBuffer(GL_ARRAY_BUFFER, _mVertexColorTriangles);
    glBufferData(GL_ARRAY_BUFFER,
                 sizeof(crVertexC)*_mColorTriangleData->size(),
                 _mColorTriangleData->data(),
                 GL_DYNAMIC_DRAW);
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_TRUE,
                          sizeof(crVertexC), (void*)offsetof(crVertexC,Color));
    glEnableVertexAttribArray(GLKVertexAttribColor);
    glBindBuffer(GL_ARRAY_BUFFER,0);

    // generate the buffer and configure the gl pointers for triangle index data
    glGenBuffers(1, &_mVertexIndexTriangles);
    /* Bind and set up triangle index data */
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _mVertexIndexTriangles);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(bits32)*_mIndexTriangleData->size(),_mIndexTriangleData->data(), GL_STATIC_DRAW);
    //        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);

    glBindVertexArrayOES(0);
}

После привязки метод рисования реализуется следующим образом (и этот метод рисования вызывается для каждого отдельного объекта буфера вершин):

void scene_GLBuffer::Draw()
{
    glBindVertexArrayOES(_mVertexArrayObject);

    glBindBuffer(GL_ARRAY_BUFFER, _mVertexPositionNormalTriangles);
    glDrawElements(GL_TRIANGLES, _mIndexTriangleData->size(), GL_UNSIGNED_INT, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glBindVertexArrayOES(0);
}

Все это работает гладко, но у меня возникают проблемы с поиском, где буферизация глубины вписывается в это.

1 ответ

Решение

Я не могу понять, где буферизация глубины вписывается в это.

Это потому, что это не вписывается ни во что из этого.

Объекты массива вершин - это способы инкапсуляции состояния массива вершин. Это состояние не имеет ничего общего с другим состоянием, таким как текущий программный объект, текущие связанные текстуры или кадровый буфер. Последний - откуда берется буфер глубины.

Если вы хотите визуализировать несколько объектов с VAO в один и тот же кадровый буфер, просто не изменяйте кадровый буфер. Вот как вы отображаете их на одном изображении (для простоты, давайте назовем это экраном). Буфер глубины является частью кадрового буфера, поэтому, если вы хотите выполнить рендеринг в один и тот же буфер глубины, просто не меняйте кадровый буфер между различными объектами.

Короче говоря, ваш объект Draw Функция не должна знать и заботиться о том, какой буфер глубины используется в данный момент. Так же, как Draw Функция не знает и не заботится о том, какая программа используется, какие текстуры связаны и каков текущий видовой экран.

Другие вопросы по тегам