glVertexAttribPointer 返回 GL_INVALID_OPERATION
Posted
技术标签:
【中文标题】glVertexAttribPointer 返回 GL_INVALID_OPERATION【英文标题】:glVertexAttribPointer returns GL_INVALID_OPERATION 【发布时间】:2014-01-19 13:25:47 【问题描述】:我正在使用 OpenGL 核心配置文件,版本 3.3
当我调用 glVertexAttribPointer 时,我得到 GL_INVALID_OPERATION。我已经签出http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttribPointer.xml
struct
GLuint program;
GLint uni_texture;
GLint att_coord;
shader_fbo;
...
shader_fbo.att_coord = glGetAttribLocation(shader_fbo.program, "coordIn");
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
/*shader_fbo.att_coord stores now 0*/
/*vao stores now 1*/
...
GLfloat vertices[] = -1.0, -1.0,
-1.0, 1.0,
1.0, -1.0,
1.0, 1.0 ;
GLubyte indices[] = 0, 1, 2,
1, 2, 3 ;
...
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindVertexArray(vao);
glEnableVertexAttribArray(shader_fbo.att_coord);
glVertexAttribPointer(shader_fbo.att_coord,
2,
GL_FLOAT,
GL_FALSE,
0,
vertices);
...
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);
我的顶点着色器来了
#version 330
in vec2 coordIn;
out vec2 coordFS;
void main()
gl_Position = vec4(coordIn, 0.0, 1.0);
coordFS = (1.0+coordIn)/2.0;
它编译和链接没有任何错误。
更新: glVertexAttribPointer 现在可以工作,但是当我调用 glDrawElements 时出现 GL_OUT_OF_MEMORY 错误。代码已更新。
【问题讨论】:
您遇到内存错误,因为您没有使用 glBufferData() 绑定任何数据 glBufferData 将数据绑定到当前绑定的缓冲区(这里是“vbo”) glVertexAttribPointer 告诉 opengl 如何打包数据以及如何在着色器中访问它。阅读本文了解更多信息:opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml 【参考方案1】:如果将零绑定到 GL_ARRAY_BUFFER 缓冲区对象绑定点和指针参数 不为 NULL。
您似乎没有绑定缓冲区对象。 glVertexAttribArray 将最近的缓冲区对象与指定的顶点属性相关联。
【讨论】:
谢谢,不知何故,我认为顶点数组对象将替换顶点缓冲区对象。但是现在当我调用 glDrawElements 时出现 GL_OUT_OF_MEMORY 错误 您需要为索引创建一个缓冲区对象并绑定它并用数据填充它。另外,如果有帮助,请采纳答案。 :)以上是关于glVertexAttribPointer 返回 GL_INVALID_OPERATION的主要内容,如果未能解决你的问题,请参考以下文章
缓冲区和 glVertexAttribPointer 之间的关系
如何使用 glVertexAttribPointer() 添加非数组值
Opengl顶点着色器为每个顶点设置布尔值(glVertexAttribPointer)
glVertexAttribPointer 出现 JOGL 错误