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

OpenGL - tell vertex shader that VBO has changed

本文关键字:VBO 顶点 OpenGL      更新时间:2023-10-16

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

在绘制调用之前,你有glBindBuffer(GL_ARRAY_BUFFER,vertex_buffer);你需要实际设置attrib指针(glVertexAttribPointer())。次要说明是 GlVertexAttribPointer() 将GL_ARRAY_BUFFER绑定到指定的属性指针。你现在在哪里称呼它,没有什么是GL_ARRAY_BUFFER的。

作为参考,GLEnum error = glGetError() 将返回 openGL 的错误状态,是一个功能强大的调试工具。如果您使用的是 glew,glewGetErrorString() 将获得任何非零错误代码的字符串,该字符串更详细地解释了错误。

附言对不起我的写作技巧很差。