VAO рисует неправильный индексный буфер

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

Вот мой (псевдошумный) код для настройки VBO и EBO:

glGenBuffers(1, &vboCube);
glBindBuffer(GL_ARRAY_BUFFER, vboCube);
glBufferData(GL_ARRAY_BUFFER, getNumSphereVertices() * sizeof(Vertex), &data[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glGenBuffers(1, &iboCube);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboCube);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, getNumCubeIndices() * sizeof(uint32), &data[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);


glGenBuffers(1, &vboSphere);
glBindBuffer(GL_ARRAY_BUFFER, vboSphere);
glBufferData(GL_ARRAY_BUFFER, getNumSphereVertices() * sizeof(Vertex), &data[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glGenBuffers(1, &iboSphere);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboSphere);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, getNumSphereIndices() * sizeof(uint32), &data[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

Редактировать: Они были обновлены для использования эквивалентов DSA, и проблема сохраняется. Код DSA согласно:

glCreateBuffers(1, &vboCube);
glBindBuffer(GL_ARRAY_BUFFER, vboCube);
glNamedBufferData(vboCube, getNumCubeVertices() * sizeof(Vertex), &data[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

Следующее связывание атрибутов моей программы:

glUseProgram(programID);

uint32 vaoCube;
glCreateVertexArrays(1, &vaoCube);
glBindVertexArray(vaoCube);
i = 0
for each attribute:
    uint32 attribIndex = glGetAttribLocation(program, name.c_str());
    glVertexArrayVertexBuffer(vaoCube, i, vboCube, 0, stride);
    glEnableVertexArrayAttrib(vaoCube, attribIndex);
    glVertexArrayAttribFormat(vaoCube, attribIndex, numCells, dataType, normalise, offset);
    glVertexArrayAttribBinding(vaoCube, attribIndex, i);
    glVertexArrayBindingDivisor(vaoCube, i, divisor);
    i++
glBindVertexArray(0);

glBindVertexArray(vaoCube);
glVertexArrayElementBuffer(vaoCube, iboCube);
glBindVertexArray(0);


uint32 vaoSphere;
glCreateVertexArrays(1, &vaoSphere);
glBindVertexArray(vaoSphere);
i = 0
for each attribute:
    uint32 attribIndex = glGetAttribLocation(program, name.c_str());
    glVertexArrayVertexBuffer(vaoSphere, i, vboSphere, 0, stride);
    glEnableVertexArrayAttrib(vaoSphere, attribIndex);
    glVertexArrayAttribFormat(vaoSphere, attribIndex, numCells, dataType, normalise, offset);
    glVertexArrayAttribBinding(vaoSphere, attribIndex, i);
    glVertexArrayBindingDivisor(vaoSphere, i, divisor);
    i++
glBindVertexArray(0);

glBindVertexArray(vaoSphere);
glVertexArrayElementBuffer(vaoSphere, iboSphere);
glBindVertexArray(0);

И, наконец, прорисовка объектов:

glBindVertexArray(vaoCube);
glDrawElements(GL_TRIANGLES, getNumCubeIndices(), GL_UNSIGNED_INT, (GLvoid*)0);
glBindVertexArray(0);


glBindVertexArray(vaoSphere);
glDrawElements(GL_TRIANGLES, getNumSphereIndices(), GL_UNSIGNED_INT, (GLvoid*)0);
glBindVertexArray(0);

Наконец результат:

VAO рисует неправильный индексный буфер

Неправильная настройка VAO?

@ Rabbid76 извините, это был плохой код для преобразования вопросов. vertexBufferBinding - это точка привязки VBO (в данном случае vboCube и vboSphere). Я отредактировал фрагмент кода, чтобы отразить это.

schwyzl 25.10.2018 18:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
197
2

Ответы 2

Если вы используете ARB_direct_state_access / OpenGL 4.5, вы должны делать это последовательно и полностью. Так что все это в «моем (псевдологическом) коде для настройки VBO и EBO:» неверно. Вы должны использовать glCreateBuffer, glNamedBufferData и им подобные.

Это важно, потому что, хотя GL_ARRAY_BUFFER является частью состояния контекста, GL_ELEMENT_ARRAY_BUFFER является частью состояния VAO. И если вы используете ядро ​​OpenGL и не привязаны к VAO ... это означает, что состояние буфера массива элементов отсутствует. Таким образом, ваш вызов glBindBuffer должен был дать ошибку, и ваши последующие попытки использовать их также потерпят неудачу.

Спасибо за ответ. Я обновил функции создания буфера и заполнения для метода DSA. Интересно, что я не получал никаких ошибок GL с другой настройкой. Однако проблема с искореженной сферой сохраняется.

schwyzl 25.10.2018 19:56

Проблема была внешней по отношению к приведенному выше коду. Приведенный выше код действительно работает.

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