Элементы glDrawElements мерцают и выходят из строя
-
13-09-2019 - |
Вопрос
Я получаю подозрительную ошибку при использовании glDrawElements().Я пытаюсь визуализировать простые примитивы (в основном прямоугольники), чтобы ускорить рисование текста и так далее, Но когда я вызываю glDrawElements(), ВЕСЬ экран мигает черным (не только область моего окна) для одного кадра или около того.В следующем кадре он возвращается к тем же "цветам Windows", что и раньше.И вот оно мерцает пару секунд, заканчиваясь в окне сообщения со словами
The NVIDIA OpenGL Driver encountered an unrecoverable error
and must close this application.
Error 12
Есть ли какие-либо настройки для GL, которые мне нужно сбросить перед вызовом glDrawElements()?Я знаю, что это не какой-то оборванный glEnableClientState(), я проверил это (раньше у меня был один из таких, но вместо этого произошел сбой glDrawElements()).
Если подумать, это почти похоже на какую-то ошибку обратного буфера...Есть идеи, что попробовать?
Решение
Очевидно, что вы смешиваете режим VBO и режим VA.Это вполне возможно, но использовать его нужно с осторожностью.
Когда ты позвонишь:
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
Это означает, что в следующий раз, когда вы будете визуализировать что-либо с glDrawElements(..., ..., ..., x)
, он будет использовать x в качестве указателя на данные индексов, а последний вызов glVertexPointer указывает на данные вершин.
Если вы не надо отмените привязку текущих VBO и IBO (с помощью двух вышеупомянутых вызовов glBindBuffer), это означает, что при рендеринге с теми же glDrawElements x будет использоваться в качестве смещения в данных индексов в ИБО, и последний вызов glVertexPointer в качестве смещения по данным вершин в VBO.
В зависимости от значений x и glVertexPointer вы можете вызвать сбой драйвера, потому что смещения выходят за рамки и / или базовые данные имеют неправильный тип (NaN).
Итак, чтобы ответить на ваш вопрос, после рисования в режиме VBO, а затем в режиме VA:
- отсоедините текущий VBO
- отвязать текущего IBO
- укажите правильный адрес вершин с помощью
glVertexPointer
- укажите правильный адрес индекса с помощью
glDrawElements
и тогда все будет хорошо.
Другие советы
Бах!Нашел это.Когда я это сделал
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
перед рендерингом мерцание + сбой прекратились.Является ли это ожидаемым поведением?Извините, что потратил впустую время и пространство.