Правильное использование vbo и vao [дубликат]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Правильное использование vbo и vao [дубликат]

Сообщение Anonymous »

Недавно я изучил концепцию шейдера, объекта массива вершин (VAO) и объекта буфера вершин (VBO). При реализации этих концепций в простой игре я столкнулся с проблемой, из-за которой игра вылетала, ничего не отображая.
Каждый прототип объекта имеет следующую функцию, вызываемую в начале основной функции.

Код: Выделить всё

void initTreePrototype()
glGenBuffers (1, &treeVBO);       //create vbo for vertices
glGenBuffers (1, &treeIBO);       //create vbo for vertice indices
glGenVertexArrays (1, &treeVAO);  //create vao for the prototype

glVertexArrayAttribFormat(_treeVAO, 0, 4 * sizeof(float), GL_FLOAT, GL_FALSE, 0); //set format of vao
... //load obj file
glNamedBufferData(treeEBO, treeEBOLen * sizeof(GLuint), treeVertIdx, GL_STATIC_DRAW);  //send vertex indices to gpu
glNamedBufferData(treeVBO, vertPool.size() * sizeof(glm::vec4), treeVertices, GL_STATIC_DRAW);  //send vertices to gpu
}
И есть функция, отвечающая за отрисовку элементов в vbo. Каждый прототип предоставляет свои vao, vbo и Ibo (индекс для vbo) следующей функции для самого рисования.

Код: Выделить всё

void displayTriangles(const glm::mat4& tr, GLuint vao, GLuint arrBuf, GLuint idxBuf, unsigned len, const glm::vec4& color) {
glBindVertexArray(vao);
//bind ebo to vao
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, idxBuf);

glEnableVertexAttribArray(0);
//bind vbo to vao
glBindVertexBuffer(0, arrBuf, 0, sizeof(glm::vec4));
glVertexAttribBinding(0, 0);

//send uniforms
glUniformMatrix4fv(1, 1, GL_TRUE, &tr[0][0]);
glUniform4f(2, color[0], color[1], color[2], color[3]);

glDrawElements(GL_TRIANGLES, len, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(0);
glBindVertexArray(0);
}
Насколько мне известно, glVertexArrayAttribFormat() форматирует vao, и каждый vao может быть связан с vbo (возможно, vbo с ebo). Следовательно, один и тот же VAO может использоваться несколькими VBO одного и того же формата.
Несмотря на это, приведенный выше код дает сбой, что приводит к сбою игры еще до того, как что-либо будет нарисовано.
Я пробовал разные варианты порядок строк в приведенном выше коде. Ни один из них не работал. Хотя было несколько примеров использования glvertexattribpointer(), мне не удалось найти код, использующий glVertexArrayAttribFormat().
Я думаю, что glvertexattribpointer() требует vbo для format vao, поэтому его следует вызывать каждый раз при привязке vbo, тогда как glVertexArrayAttribFormat() нужно вызывать только один раз при создании vao.

Подробнее здесь: https://stackoverflow.com/questions/784 ... bo-and-vao
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Невозможно отобразить полный VAO, если данные VBO были частично обновлены с помощью glBufferSubData().
    Anonymous » » в форуме Python
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Qt и OpenGL: невозможно инициализировать VBO или VAO openGL после первого вызова PaintGL?
    Anonymous » » в форуме C++
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Qt и OpenGL: невозможно инициализировать OpenGL VBO или VAO после первого вызова PaintGL?
    Anonymous » » в форуме C++
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • VAO не рендерится, OpenGL
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • OpenGL ES, слишком раннее заполнение VBO и IBO приводит к отсутствию буферов?
    Гость » » в форуме C++
    0 Ответы
    44 Просмотры
    Последнее сообщение Гость

Вернуться в «C++»