Элементы glDrawElements мерцают и выходят из строя

StackOverflow https://stackoverflow.com/questions/1853181

  •  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:

  1. отсоедините текущий VBO
  2. отвязать текущего IBO
  3. укажите правильный адрес вершин с помощью glVertexPointer
  4. укажите правильный адрес индекса с помощью glDrawElements

и тогда все будет хорошо.

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

Бах!Нашел это.Когда я это сделал

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

перед рендерингом мерцание + сбой прекратились.Является ли это ожидаемым поведением?Извините, что потратил впустую время и пространство.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top