Очевидно, что вы смешиваете режим VBO и режим VA. Это вполне возможно, но следует использовать с осторожностью.
При звонке:
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
Это означает, что в следующий раз, когда вы визуализируете что-то с помощью glDrawElements(..., ..., ..., x)
, он будет использовать x в качестве указателя на данные индексов, а последний вызов glVertexPointer указывает на данные вершин.
Если вы не отмените привязку текущих VBO и IBO (с двумя вышеупомянутыми вызовами glBindBuffer), это означает, что при рендеринге с одним и тем же glDrawElements x будет использоваться в качестве смещения для данных индексов в IBO и последний вызов glVertexPointer в качестве смещения данных вершин в VBO .
В зависимости от значений x и glVertexPointer вы можете вызвать сбой драйвера, поскольку смещения выходят за пределы и / или базовые данные имеют неправильный тип (NaN).
Итак, для ответа на ваш вопрос, после рисования в режиме VBO, а затем рисования в режиме VA:
- отменить привязку текущего VBO
- отменить привязку текущего IBO
- указать правильный адрес вершины с помощью
glVertexPointer
- укажите правильный адрес индекса с помощью
glDrawElements
и тогда все будет хорошо.