我目前正在编写一个程序,需要不断更新我的VBO数据。
但是,我发现如果在初始化缓冲区后调用glBindBuffer(GL_ARRAY_BUFFER, 0)
,窗口会以某种方式关闭。
以下是我的代码段:
glGenBuffers(1, &vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(pts[0]) * pts.size(), NULL, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
glCompileShader(vertex_shader);
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
glCompileShader(fragment_shader);
program = glCreateProgram();
glAttachShader(program, vertex_shader);
glAttachShader(program, fragment_shader);
glLinkProgram(program);
mvp_location = glGetUniformLocation(program, "MVP");
vpos_location = glGetAttribLocation(program, "vPos");
glEnableVertexAttribArray(vpos_location);
glVertexAttribPointer(vpos_location, 3, GL_FLOAT, GL_FALSE,
sizeof(float) * 3, (void*) 0);
while(!glfwWindowShouldClose(window)) {
glUseProgram(program);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(pts[0]) * pts.size(), &pts);
glBindBuffer(GL_ARRAY_BUFFER, 0);
mat4x4_mul(mvp, m, p);
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glDrawArrays(GL_POINTS, 0, pts.size());
glBindBuffer(GL_ARRAY_BUFFER, 0);
glfwSwapBuffers(window);
glfwPollEvents();
}
仅供参考:pts会不断更新。
有没有办法告诉顶点着色器VBO数据是否已更新?
修改:更新了代码段
编辑:我应该每次都绘制pts.size()
个顶点,但屏幕上只出现一个点
答案 0 :(得分:1)
在你的绘图调用之前,你有glBindBuffer(GL_ARRAY_BUFFER,vertex_buffer);你需要实际设置attrib指针(glVertexAttribPointer())。第二个注意事项是GlVertexAttribPointer()将GL_ARRAY_BUFFER绑定到指定的属性指针。你现在调用的地方没有任何限制GL_ARRAY_BUFFER。
供参考GLEnum error = glGetError()将返回openGL的错误状态,是一个功能强大的调试工具。如果你正在使用glew,glewGetErrorString()将获得任何非零错误代码的字符串,这将更详细地解释错误。
P.S。对不起我的写作能力差。