OpenGL无效操作

时间:2015-01-10 23:43:51

标签: opengl opentk

我在OpenGL中加载/分配交错的顶点数据时出现问题。

设置第二个属性时,我一直收到INVALID_OPERATION。

编辑原来这只发生在Mac上。在Windows上,我没有收到INVALID_OPERATION错误。但我现在修改了下面的内容。 Mac上仍有错误。

        GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
        GL.VertexAttribPointer(shader.GetAttribLocation("position"), 3, VertexAttribPointerType.Float, false, _vertexStride, 0);
        REngine.CheckGLError();
        GL.VertexAttribPointer(shader.GetAttribLocation("normal"), 3, VertexAttribPointerType.Float, false, _vertexStride, 12);
        REngine.CheckGLError();
        GL.VertexAttribPointer(shader.GetAttribLocation("texcoord"), 2, VertexAttribPointerType.Float, false, _vertexStride, 24);
        REngine.CheckGLError();
        GL.EnableVertexAttribArray(shader.GetAttribLocation("position"));
        REngine.CheckGLError();
        GL.EnableVertexAttribArray(shader.GetAttribLocation("normal"));
        REngine.CheckGLError();
        GL.EnableVertexAttribArray(shader.GetAttribLocation("texcoord"));
        REngine.CheckGLError();

知道为什么吗?其他人似乎也这样做,而且效果很好,但我似乎无法让它发挥作用。

这是我的GLSL:

layout(location=0) in vec3 position;
layout(location=1) in vec3 normal;
layout(location=2) in vec2 texcoord;

out vec4 out_position;
out vec4 out_normal;
out vec2 out_texcoord;


void main() {
  out_normal = vec4(normal,1.0f);
  out_position = vec4(position,1.0f);
  out_texcoord = texcoord;

}

和frag:

out vec4 color;
void main()
{
  color = vec4(1.0f,1.0f,1.0f,1.0f);
}

修改

结果我在队列中的早期队列中有过时的glErrors。我之前检查过并且使用4.2上下文对Mac上不支持glEnableClientState进行了bum调用。我删除它,因为它不再需要完全着色器方法。这修复了错误,并显示了我光荣的白色网格。

1 个答案:

答案 0 :(得分:3)

只有活动属性才有位置。您的normal属性未激活,因为它未被使用(您将其转发到out_normal这一事实无关紧要,因为未使用out_normalglGetAttributeLocation将为此返回-1,但glVertexAttribPointer的属性索引为GLuint(GLuint)-1超出允许属性索引的范围。你也应该为texcoord得到同样的错误。

另请注意,使用sizeof(float)作为size的{​​{1}}参数也是错误的。该参数确定属性向量的组件数,1(标量),2d,3d或4d,而不是某些字节数。