C++ GLDraweElements失败,错误为GL\u无效\u操作

C++ GLDraweElements失败,错误为GL\u无效\u操作,c++,macos,opengl,opengl-3,C++,Macos,Opengl,Opengl 3,我的目标是使实例化渲染工作正常,但是现在即使是单个glpaurements也会失败。注意:此代码已在Windows上运行。但是,在OS X上,它会因GL\u无效\u操作而失败 基本上,我将所有静态数据加载到缓冲区中,然后最后一个缓冲区包含动态数据,我在每次绘图之前重新加载这些数据。然后,我调用GLDrawerElementsInstanced(或用于调试GLDrawerElements),它会立即失败。我知道,因为在调用之前和之后都有错误打印,它总是打印出OpenGL错误。(即使使用glDraw

我的目标是使实例化渲染工作正常,但是现在即使是单个
glpaurements
也会失败。注意:此代码已在Windows上运行。但是,在OS X上,它会因
GL\u无效\u操作而失败

基本上,我将所有静态数据加载到缓冲区中,然后最后一个缓冲区包含动态数据,我在每次绘图之前重新加载这些数据。然后,我调用GLDrawerElementsInstanced(或用于调试
GLDrawerElements
),它会立即失败。我知道,因为在调用之前和之后都有错误打印,它总是打印出OpenGL错误。(即使使用
glDrawElements
)如果改用
glDrawArrays
,也不会出现此错误

有关更多信息,请参见代码中的注释。非常感谢您的帮助

//Setup code, at this point vertices,textureCoordiantes,normals are all populated

//Allocate the space for the gpu buffers now
//and send the static data
//Rebind the array to bring them into the current context
glBindVertexArray ( vertexArray );

//Push voxel to gpu
glBindBuffer ( GL_ARRAY_BUFFER, vertexBuffer );
glBufferData ( GL_ARRAY_BUFFER, 36*sizeof(vec3), vertices, GL_STATIC_READ );
glEnableVertexAttribArray ( shader->AttributeVertex() );
glVertexAttribPointer ( shader->AttributeVertex(), 3, GL_FLOAT, GL_FALSE, 0, 0 );

glBindBuffer ( GL_ARRAY_BUFFER, textureBuffer );
glBufferData ( GL_ARRAY_BUFFER, 36*sizeof(vec2), textureCoordinates, GL_STATIC_READ );
glEnableVertexAttribArray ( shader->AttributeTexture() );
glVertexAttribPointer ( shader->AttributeTexture(), 2, GL_FLOAT, GL_FALSE, 0, 0 );

glBindBuffer ( GL_ARRAY_BUFFER, normalBuffer );
glBufferData ( GL_ARRAY_BUFFER, 36*sizeof(vec3), normals, GL_STATIC_READ );
glEnableVertexAttribArray ( shader->AttributeNormal() );
glVertexAttribPointer ( shader->AttributeNormal(), 3, GL_FLOAT, GL_FALSE, 0, 0 );
//Allocate space for positions
glBindBuffer ( GL_ARRAY_BUFFER, positionBuffer );
glBufferData ( GL_ARRAY_BUFFER, INSTANCE_RENDER_SWEEP*sizeof(vec4), positions, GL_DYNAMIC_READ );
glEnableVertexAttribArray ( shader->AttributePosition() );
glVertexAttribPointer ( shader->AttributePosition(), 4, GL_FLOAT, GL_FALSE, 0, 0 ); 


    //This code runs a bit later, but runs over and over:
    //indices is a vector<GLuint> of length 36 and is just 0-35

glBindVertexArray ( vertexArray );
glBindBuffer ( GL_ARRAY_BUFFER, positionBuffer );
glBufferSubData ( GL_ARRAY_BUFFER, 0,INSTANCE_RENDER_SWEEP*sizeof(vec4), positions );
glEnableVertexAttribArray ( shader->AttributePosition() );
glVertexAttribPointer ( shader->AttributePosition(), 4, GL_FLOAT, GL_FALSE, 0, 0 ); 

//The position is per-instance
//everything else is per-vertex
glVertexAttribDivisor(shader->AttributeNormal(),0);
glVertexAttribDivisor(shader->AttributePosition(),1);
glVertexAttribDivisor(shader->AttributeTexture(),0);
glVertexAttribDivisor(shader->AttributeVertex(),0);

cout << "1Err: " << glGetError() << "\n";
    glDrawDelements(GL_TRIANGLES,36,GL_UNSIGNED_BYTE,&indices[0]);
//glDrawElementsInstanced(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, &indices[0], bufferedVoxels);
    //This next error prints out 1282 which is GL_INVALID_OPERATION
    //However if i replace the above with glDrawArrays, it works for one instance (no error)
cout << "2Err: " << glGetError() << "\n";
//All buffered voxels now drawn
bufferedVoxels = 0;
//设置代码,此时顶点、纹理坐标和法线都已填充
//现在为gpu缓冲区分配空间
//并发送静态数据
//重新绑定数组以将其放入当前上下文
glBindVertexArray(vertexArray);
//将体素推送到gpu
glBindBuffer(GL_数组_BUFFER,vertexBuffer);
glBufferData(GLU数组缓冲区,36*sizeof(vec3),顶点,GLU静态读取);
GlenableVertexAttributeArray(着色器->AttributeVertex());
glvertexattributepointer(着色器->AttributeVertex(),3,GL_FLOAT,GL_FALSE,0,0);
glBindBuffer(GL_数组_BUFFER,textureBuffer);
glBufferData(GL_数组_缓冲区,36*sizeof(vec2),纹理坐标,GL_静态_读取);
GlenableVertexAttributeArray(着色器->AttributeTexture());
glvertexattributepointer(着色器->AttributeTexture(),2,GL_FLOAT,GL_FALSE,0,0);
glBindBuffer(GL_数组_BUFFER,normalBuffer);
glBufferData(GL_数组_缓冲区,36*sizeof(vec3),法线,GL_静态_读取);
GlenableVertexAttributeArray(着色器->AttributeNormal());
glvertexattributepointer(着色器->AttributeNormal(),3,GL_FLOAT,GL_FALSE,0,0);
//为职位分配空间
glBindBuffer(GL_数组_BUFFER,positionBuffer);
glBufferData(GL_数组_缓冲区、实例_渲染_扫描*sizeof(vec4)、位置、GL_动态_读取);
GlenableVertexAttributeArray(着色器->属性定位());
glvertexattributepointer(着色器->AttributePosition(),4,GL_FLOAT,GL_FALSE,0,0);
//此代码稍后运行,但会反复运行:
//指数是长度为36的向量,仅为0-35
glBindVertexArray(vertexArray);
glBindBuffer(GL_数组_BUFFER,positionBuffer);
glBufferSubData(GL_数组_BUFFER,0,实例_RENDER_SWEEP*sizeof(vec4),位置);
GlenableVertexAttributeArray(着色器->属性定位());
glvertexattributepointer(着色器->AttributePosition(),4,GL_FLOAT,GL_FALSE,0,0);
//每个实例的位置都是相同的
//其他一切都是逐顶点的
glVertexAttributeDivisor(着色器->AttributeNormal(),0);
glVertexAttributeDivisor(着色器->AttributePosition(),1);
glVertexAttributeDivisor(着色器->AttributeTexture(),0);
glVertexAttributeDivisor(着色器->AttributeVertex(),0);

我对openGL不是很有经验,但是你在使用glew吗?如果是这样,您是否尝试在
glewInit()
之前设置
glewExperimental=GL\u TRUE

使用GL核心上下文时,您不能为
glDrainElements
glDrainElementsInstanced
索引
参数传递客户端数组。在这两种情况下,都需要创建索引缓冲区并将索引存储在此缓冲区中。然后,draw调用的
index
参数成为绑定索引缓冲区中的偏移量(以字节为单位),从中读取索引


但是,鉴于索引数组仅为0-35,为什么不使用
glDrawArrays
glDrawArraysInstanced

您目前在OS X上使用的是哪种OpenGL上下文?核心3.2+?实例化是GL3.x时代,要在OSX上以未扩展的形式使用它,您需要一个核心配置文件。任何仅在内核中公开的函数,如果您试图从GL 2.1上下文中调用该函数,则在OS X上要么会自动失败,要么会执行product
GL\u INVALID\u OPERATION
。这使其与其他平台不同,如果函数不受支持,你会知道这一点,因为函数指针将为NULL。GLEW在OS X上是不必要的。苹果总是以不同的方式做事情,他们做GL的方式有点棘手,正如我在对OP问题的评论中所解释的。