Я пытаюсь нарисовать несколько объектов с помощью (той же) базовой шейдерной программы. У объектов есть буферы вершин, которые я собираюсь нарисовать с помощью связанных индексных буферов, вызвав 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?
Если вы используете ARB_direct_state_access / OpenGL 4.5, вы должны делать это последовательно и полностью. Так что все это в «моем (псевдологическом) коде для настройки VBO и EBO:» неверно. Вы должны использовать glCreateBuffer
, glNamedBufferData
и им подобные.
Это важно, потому что, хотя GL_ARRAY_BUFFER
является частью состояния контекста, GL_ELEMENT_ARRAY_BUFFER
является частью состояния VAO. И если вы используете ядро OpenGL и не привязаны к VAO ... это означает, что состояние буфера массива элементов отсутствует. Таким образом, ваш вызов glBindBuffer
должен был дать ошибку, и ваши последующие попытки использовать их также потерпят неудачу.
Спасибо за ответ. Я обновил функции создания буфера и заполнения для метода DSA. Интересно, что я не получал никаких ошибок GL с другой настройкой. Однако проблема с искореженной сферой сохраняется.
Проблема была внешней по отношению к приведенному выше коду. Приведенный выше код действительно работает.
@ Rabbid76 извините, это был плохой код для преобразования вопросов. vertexBufferBinding - это точка привязки VBO (в данном случае vboCube и vboSphere). Я отредактировал фрагмент кода, чтобы отразить это.