OpenGL - 告诉顶点着色器VBO已更改

时间:2016-07-07 21:06:06

标签: c++ opengl

我目前正在编写一个程序,需要不断更新我的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()个顶点,但屏幕上只出现一个点

1 个答案:

答案 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。对不起我的写作能力差。