OpenGL无效操作

OpenGL无效操作,opengl,opentk,Opengl,Opentk,我在OpenGL中加载/分配交错顶点数据时遇到问题 设置第二个属性时,我一直得到一个无效的_操作 EDIT结果表明,这只发生在Mac上。在Windows上,我没有收到无效的\u操作错误。但是我已经用现在的样子修改了下面的。Mac上仍然存在错误 GL.BindBuffer(BufferTarget.ArrayBuffer, vbo); GL.VertexAttribPointer(shader.GetAttribLocation("position"), 3, Ve

我在OpenGL中加载/分配交错顶点数据时遇到问题

设置第二个属性时,我一直得到一个无效的_操作

EDIT结果表明,这只发生在Mac上。在Windows上,我没有收到无效的\u操作错误。但是我已经用现在的样子修改了下面的。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);
}
编辑


事实证明,我在队列中有来自管道早期的陈旧的Glerror。我之前检查了一下,打了一个错误的电话给glEnableClientState,这在使用4.2上下文的Mac上是不受支持的。我删除了它,因为它不再需要使用完整的着色器方法。这修复了错误,并显示了我美丽的白色网格。

只有活动属性才有位置。您的
normal
属性未激活,因为它未被使用(您将其转发到
out\u normal
与此无关,因为
out\u normal
未被使用)
glGetAttributeLocation
将返回-1,但是
glVertexAttributePointer
的属性索引是
GLuint
,并且
(GLuint)-1
超出了允许的属性索引的范围。对于
texcoord
,您也应该得到相同的错误


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

只有活动属性才有位置。您的
normal
属性未激活,因为它未被使用(您将其转发到
out\u normal
与此无关,因为
out\u normal
未被使用)
glGetAttributeLocation
将返回-1,但是
glVertexAttributePointer
的属性索引是
GLuint
,并且
(GLuint)-1
超出了允许的属性索引的范围。对于
texcoord
,您也应该得到相同的错误


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

我已经验证了位置在着色器对象中设置为0、1、2,就像着色器指示的那样。将大小从sizeof(float)更改为实际值(如3)也无济于事。将它们设置为什么也无所谓。属性未处于活动状态,因此它们没有位置。没办法。请注意,由于在着色器中指定了位置,因此根本不需要
glGetAttriblLocation
。您可以简单地使用0、1和2,并且不会发生错误,因为所有这些数字都是有效的,而
(GLuint)-1
则不是。事实证明,在设置交错数据的调用之后,我才检查过时的Glerror。我将检查进一步向上移动,并捕获了一个旧的glEnableClientState调用,这在Mac上不受支持。因为我使用了完整的着色器方法,所以实际上甚至没有必要这样做。但我要继续说,这个问题已经得到了回答,因为您对活动属性的描述确实是正确的。我已经验证了着色器对象中的位置是否按照着色器的指示设置为0、1、2。将大小从sizeof(float)更改为实际值(如3)也无济于事。将它们设置为什么也无所谓。属性未处于活动状态,因此它们没有位置。没办法。请注意,由于在着色器中指定了位置,因此根本不需要
glGetAttriblLocation
。您可以简单地使用0、1和2,并且不会发生错误,因为所有这些数字都是有效的,而
(GLuint)-1
则不是。事实证明,在设置交错数据的调用之后,我才检查过时的Glerror。我将检查进一步向上移动,并捕获了一个旧的glEnableClientState调用,这在Mac上不受支持。因为我使用了完整的着色器方法,所以实际上甚至没有必要这样做。但是我要继续说,这个问题已经得到了回答,因为你对活动属性的看法确实是正确的。