我目前正在编写一个需要不断更新我的 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);您需要实际设置属性指针(glVertexAttribPointer())。次要说明是 GlVertexAttribPointer() 将 GL_ARRAY_BUFFER 绑定(bind)到指定的属性指针。目前你调用它的地方没有任何绑定(bind)到 GL_ARRAY_BUFFER 的地方。
供引用 GLEnum error = glGetError() 将返回 openGL 的错误状态,是一个强大的调试工具。如果您使用的是 glew,glewGetErrorString() 将为任何非零错误代码获取一个字符串,该字符串更详细地解释了错误。
附注对不起,我的写作能力很差。
关于c++ - OpenGL - 告诉顶点着色器 VBO 已经改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38255259/