OpenGL无效操作
我在OpenGL中加载/分配交错顶点数据时遇到问题 设置第二个属性时,我一直得到一个无效的_操作 EDIT结果表明,这只发生在Mac上。在Windows上,我没有收到无效的\u操作错误。但是我已经用现在的样子修改了下面的。Mac上仍然存在错误OpenGL无效操作,opengl,opentk,Opengl,Opentk,我在OpenGL中加载/分配交错顶点数据时遇到问题 设置第二个属性时,我一直得到一个无效的_操作 EDIT结果表明,这只发生在Mac上。在Windows上,我没有收到无效的\u操作错误。但是我已经用现在的样子修改了下面的。Mac上仍然存在错误 GL.BindBuffer(BufferTarget.ArrayBuffer, vbo); GL.VertexAttribPointer(shader.GetAttribLocation("position"), 3, Ve
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上不受支持。因为我使用了完整的着色器方法,所以实际上甚至没有必要这样做。但是我要继续说,这个问题已经得到了回答,因为你对活动属性的看法确实是正确的。