GL_INVALID_OPERATION, о котором сообщает glVertexPointer, даже если вызвано glEnableClientState(GL_VERTEX_ARRAY)
У меня проблемы с домашней работой, которая использует OpenGL 2.0 pipeline
, Проблема в том, что я получаю и GL_INVALID_OPERATION
(ошибка 1282), когда я пытаюсь настроить glVertexPointer
,
Я не могу найти много онлайн, к чему эта ошибка, но из того, что я понимаю, эта ошибка вызвана не вызовом glEnableClientState(GL_VERTEX_ARRAY)
перед звонком glVertexPointer
,
Вот мой код для вызова обеих функций:
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(4, GL_DOUBLE, sizeof(vert), (void *)0);
Я проверил, если ошибка существует до вызова glVertexPointer
и glError
возвращает 0 до окончания вызова этой функции. Кажется, что ошибка вызвана чем-то другим. Какие еще сценарии могут вызвать эту проблему?
Я прошу прощения за несколько сухой вопрос; Я просто не знаю, что еще могу предоставить. Если вам нужно увидеть другие сегменты кода, пожалуйста, дайте мне знать, что я могу предоставить.
1 ответ
gl___Pointer (...)
никогда не будет генерировать ошибку GL_INVALID_OPERATION просто потому, что соответствующее состояние клиентского массива с фиксированной функцией не включено. Это состояние используется, когда вы делаете вызов glDrawElements (...)
, Указывать этот указатель не является ошибкой, пока указатель массива отключен.
Однако, это ошибка (которая сгенерирует GL_INVALID_OPERATION) для вызова указателя вершины при трех следующих обстоятельствах:
- У вас нет активного контекста рендеринга в вашей вызывающей ветке
- Вы используете основной контекст OpenGL 3.2 и не привязаны к объекту Vertex Array
- У вас есть основной контекст OpenGL 3.2, и вы вызываете устаревшую функцию
Точки 2 и 3 будут применяться к этому конкретному вызову API, если у вас базовый контекст 3.2+. Vertex Array Objects - фактически дополнительный контекст, к которому относятся все привязки вершинного буфера, указатель массива и вызовы draw. В ядре OpenGL 3.2, если у вас нет привязанного объекта Vertex Array, у этих функций нет контекста, и вы можете рассматривать эту ситуацию как специализацию пункта 1.
Это также неопределенная операция для вызова glVertexPointer (...)
между парой glBegin (...)
а также glEnd (...)
звонки. Реализация может генерировать или не генерировать ошибку при этих обстоятельствах, если она это делает, то генерируется GL_INVALID_OPERATION. Это относится к подавляющему большинству вызовов API OpenGL, если он не имеет ничего общего с указанием данных вершин в непосредственном режиме, тогда он не принадлежит glBegin (...)
а также glEnd (...)
,
Реальные справочные страницы API (т.е. glVertexPointer (...)
никогда не упоминайте ни о одной из трех ситуаций, которые я изложил выше. GL_INVALID_OPERATION - это одна из тех ошибок, как GL_OUT_OF_MEMORY, которая имеет неявное значение и может быть сгенерирована целым классом вызовов API, даже не упомянутых на страницах руководства. Вы должны ознакомиться с наиболее распространенными причинами GL_INVALID_OPERATION как таковыми.