【发布时间】:2016-07-07 21:06:05
【问题描述】:
我目前正在编写一个需要不断更新我的 VBO 数据的程序。
但是,我发现如果在初始化缓冲区后调用glBindBuffer(GL_ARRAY_BUFFER, 0),窗口会以某种方式自行关闭。
下面是我的代码 sn-p:
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 数据已更新?
编辑:更新了代码 sn-p
编辑:我应该每次绘制pts.size()个顶点,但屏幕上只出现一个点
【问题讨论】:
-
为什么在画之前要调用
glBindBuffer? -
我只是按照一些教程说
glBindBuffer会刷新缓冲区中的数据 -
提供本教程的链接;我怀疑要么您误解了它所说的内容,要么该教程很愚蠢。无论哪种方式,您仍然需要提供minimal reproducible example,而上面的 sn-p 缺少太多东西,无法知道发生了什么。
-
你不需要告诉顶点着色器。顶点着色器在绘制时使用 VBO 中的任何内容。这是使用 glBufferSubData 上传的任何内容