我一直在试图编写一个Marching Cubesalgorithm的双通道GPU实现,类似于使用OpenGL和GLSL的第一章GPU Gems 3。 然而,在我的第一遍调用glDrawArrays一贯失败,并有一个GL_INVALID_OPERATION 。 我查阅了所有可以find的文档,并发现了glDrawArrays可以抛出这个错误的条件: 如果非零缓冲区对象名称绑定到启用的数组或绑定到GL_DRAW_INDIRECT_BUFFER绑定并且当前映射缓冲区对象的数据存储区,则会生成GL_INVALID_OPERATION 。 如果在执行glBegin和相应的glEnd之间执行glDrawArrays则会生成GL_INVALID_OPERATION 。 如果当前程序对象中的任何两个活动采样器都是不同types的,则将由glDrawArrays或glDrawElements生成GL_INVALID_OPERATION ,但是指向相同的纹理图像单元。 如果几何着色器处于活动状态并且模式与当前安装的程序对象中的几何着色器的input基元types不兼容,则会生成GL_INVALID_OPERATION 。 如果模式是GL_PATCHES并且没有镶嵌控制着色器处于活动状态,则会生成GL_INVALID_OPERATION 。 如果将基元的顶点logging到用于变换反馈目的的缓冲区对象,则会产生GL_INVALID_OPERATION ,这会导致超出任何缓冲区对象的大小限制,或者超出由glBindBufferRange设置的结束位置offset + size – 1。 GL_INVALID_OPERATION由glDrawArrays()生成,如果不存在几何着色器,转换反馈处于活动状态,模式不是允许的模式之一。 GL_INVALID_OPERATION由glDrawArrays()生成,如果存在几何着色器,则变换反馈处于活动状态,几何着色器的输出基元types与变换反馈基元模式不匹配。 如果绑定的着色器程序无效,则会生成GL_INVALID_OPERATION 。 编辑10/10/12:如果正在使用变换反馈,并且绑定到变换反馈绑定点的缓冲区也绑定到数组缓冲区绑定点,则会生成GL_INVALID_OPERATION 。 这是我遇到的问题,由于我绑定了哪个缓冲区的拼写错误。 虽然规范声明这是非法的,但在我发现的任何文档中,glDrawArrays都没有列出它作为抛出错误的原因之一。 不幸的是,没有一个官方文档可以find涵盖3个以上的官方文档。 我不得不从很多来源收集这个清单。 第7和第8点实际上来自glBeginTransformFeedback的文档,第9点似乎没有logging。 我发现它在某个论坛post中提到。 不过,我还是不认为这个清单是完整的,因为这些清单似乎都不能解释我得到的错误。 我在任何地方都没有在程序中映射任何缓冲区。 我正在使用核心configuration文件,所以glBegin和glEnd甚至不可用。 我有两个采样器,他们是不同的types,但他们肯定映射到不同的纹理。 几何着色器是活动的,但是它的input布局是layout (points) in , glDrawArrays是用GL_POINTS调用的。 我没有使用任何types的GL_PATCHES或镶嵌着色器。 我确定我正在分配几何着色器可能输出的最大空间量。 然后我尝试了四倍。 没有帮助。 有一个几何着色器。 看下一点。 正在使用变换反馈,并且有一个几何着色器,但是输出布局是layout (points) out , glBeginTransformFeedback是用GL_POINTS调用的。 […]