glVertexPointer报告了GL_INVALID_OPERATION,即使调用了glEnableClientState(GL_VERTEX_ARRAY)

时间:2013-11-05 23:46:09

标签: c++ opengl opengl-2.0

我在使用OpenGL 2.0 pipeline的家庭作业时遇到问题。问题是,当我尝试设置GL_INVALID_OPERATION时,我收到了glVertexPointer(错误1282)。

我在网上找不到这个错误,但据我所知,这个错误是由于在调用glEnableClientState(GL_VERTEX_ARRAY)之前没有调用glVertexPointer引起的。

这是我调用这两个函数的代码:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(4, GL_DOUBLE, sizeof(vert), (void *)0);

我在调用glVertexPointer之前检查了错误是否存在,glError在调用此函数之前返回0。似乎错误是由其他东西引起的。可能导致此问题的其他一些场景是什么?

我为某个干涩的问题道歉;我真的不知道我能提供什么。如果您需要查看其他代码段,请告诉我我能提供的内容。

1 个答案:

答案 0 :(得分:3)

gl___Pointer (...)永远不会生成 GL_INVALID_OPERATION 错误,因为未启用相应的固定功能客户端阵列状态。当您进行glDrawElements (...)之类的平局调用时,会使用该状态。在禁用数组指针时指定此指针不是错误。

但是,在以下三种情况下进行顶点指针调用时会出现错误(会生成 GL_INVALID_OPERATION ):

  1. 您的调用线程中没有活动的渲染上下文
  2. 您正在使用OpenGL 3.2核心上下文并且没有绑定顶点数组对象
  3. 您有一个OpenGL 3.2核心上下文,正在调用已弃用的函数
  4. 如果您有3.2+核心上下文,则子弹点2和3都将适用于此特定API调用。顶点数组对象实际上是所有顶点缓冲区绑定,数组指针和绘制调用相对的附加上下文。在OpenGL 3.2核心中,如果没有绑定顶点数组对象,那么这些函数没有上下文,你可以认为这种情况是项目符号1的特殊化。

    在一对glVertexPointer (...)glBegin (...)来电之间拨打glEnd (...)也是一项未定义的操作。在这些情况下,实施 可能会或可能不会 生成错误,如果是,则会生成 GL_INVALID_OPERATION 。这适用于绝大多数OpenGL API调用,如果它与在立即模式下指定顶点数据没有任何关系,则它不属于glBegin (...)glEnd (...)

    实际的API参考页面(即glVertexPointer (...))从未提及上面概述的三种情况中的任何一种。 GL_INVALID_OPERATION GL_OUT_OF_MEMORY 等具有隐含含义的错误之一,可以由整个API调用类生成,而无需在手册页中提及。您应该熟悉 GL_INVALID_OPERATION 的最常见原因。