我在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调用。我删除它,因为它不再需要完全着色器方法。这修复了错误,并显示了我光荣的白色网格。
答案 0 :(得分:3)
只有活动属性才有位置。您的normal
属性未激活,因为它未被使用(您将其转发到out_normal
这一事实无关紧要,因为未使用out_normal
。 glGetAttributeLocation
将为此返回-1,但glVertexAttribPointer
的属性索引为GLuint
,(GLuint)-1
超出允许属性索引的范围。你也应该为texcoord
得到同样的错误。
另请注意,使用sizeof(float)
作为size
的{{1}}参数也是错误的。该参数确定属性向量的组件数,1(标量),2d,3d或4d,而不是某些字节数。