Мерцание и сбой glDrawElements - PullRequest
0 голосов
/ 05 декабря 2009

Я получаю подозрительную ошибку при использовании glDrawElements (). Я пытаюсь сделать простые примитивы (в основном, прямоугольники) для ускорения рисования текста и т. Д., Но когда я вызываю glDrawElements (), весь экран мигает черным (а не только моей областью окна) для одного кадра или около того. В следующем кадре он возвращается к тем же «цветам Windows», что и раньше. И вот он мерцает пару секунд, заканчивая окном сообщения «1001».

The NVIDIA OpenGL Driver encountered an unrecoverable error
and must close this application.

Error 12

Есть ли какие-либо настройки для GL, которые мне нужно сбросить перед вызовом glDrawElements ()? Я знаю, что это не какой-то висячий glEnableClientState (), я проверил его (раньше у меня был один из них, но затем вместо этого произошел сбой glDrawElements ()).

Если подумать, это похоже на ошибку в обратном буфере ... Есть идеи, что попробовать?

Ответы [ 2 ]

5 голосов
/ 09 декабря 2009

Очевидно, что вы смешиваете режим 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:

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

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

0 голосов
/ 05 декабря 2009

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

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

перед рендерингом мерцание + сбой прекратился. Это ожидаемое поведение? Извините за трату времени и пространства.

...