VAO рисует неправильный индексный буфер - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь нарисовать несколько объектов с помощью одной и той же базовой шейдерной программы.У объектов есть вершинные буферы, которые я собираюсь нарисовать, используя связанные индексные буферы, вызвав 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);

Edit : они были обновлены для использования эквивалентов 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);

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

Cube and sphere

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

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Проблема связана с кодом, показанным выше.Приведенный выше код на самом деле работает.

0 голосов
/ 25 октября 2018

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

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

...