1

我在使用OpenGL 2.0 pipeline. 问题是GL_INVALID_OPERATION当我尝试设置glVertexPointer.

我在网上找不到太多关于这个错误的信息,但据我了解,这个错误是由于在调用 glEnableClientState(GL_VERTEX_ARRAY)之前没有调用造成的glVertexPointer

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

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

我已经检查了在调用之前是否存在错误,glVertexPointer并且glError在调用此函数之前返回 0。似乎错误是由其他原因引起的。还有哪些其他情况可能会导致此问题?

我为有点枯燥的问题道歉;我真的不知道我还能提供什么。如果您需要查看其他代码段,请告诉我我可以提供什么。

4

1 回答 1

4

gl___Pointer (...)永远不会仅仅因为相应的固定功能客户端数组状态未启用而产生GL_INVALID_OPERATION错误。当您进行绘图调用时使用该状态,例如glDrawElements (...). 在禁用数组指针时指定此指针不是错误。

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

  1. 您的调用线程中没有活动的渲染上下文
  2. 您正在使用 OpenGL 3.2 核心上下文并且没有绑定顶点数组对象
  3. 您有一个 OpenGL 3.2 核心上下文并且正在调用一个已弃用的函数

如果您有 3.2+ 的核心上下文,那么要点 2 和 3 都将适用于这个特定的 API 调用。顶点数组对象实际上是一个附加上下文,所有顶点缓冲区绑定、数组指针和绘制调用都与之相关。在 OpenGL 3.2 核心中,如果您没有绑定顶点数组对象,则这些函数没有上下文,您可以将这种情况视为要点 1 的特化。

glVertexPointer (...)在一对glBegin (...)和调用之间进行调用也是一个未定义的操作glEnd (...)。在这些情况下,实现可能会或可能不会产生错误,如果确实会产生GL_INVALID_OPERATION。这适用于绝大多数 OpenGL API 调用,如果它与在立即模式下指定顶点数据没有任何关系,那么它不属于glBegin (...)and glEnd (...)

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

于 2013-11-06T00:09:08.137 回答