c++ - OpenGL - 告诉顶点着色器 VBO 已经改变

标签 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() 个顶点,但屏幕上只出现一个点

最佳答案

就在你的绘图调用之前,你有 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/

相关文章:

java - 为什么在 JNI 中调用纤程会在 JVM 中引发 StackOverflow?

c++ - WGL : possible to find offscreen context and render to window?

c++ - 为什么 GetSystemMetrics() 返回这些值?

c++ - Windows 应用程序的堆大小

c++ - 如何遍历 vector 图的 map map map map map map map vector

c++ - 使用 OpenGL 和 SDL 的瓦片 map 占用大量 CPU

opengl - 如何禁用绘制到颜色缓冲区

c++ - SDL + OpenGL : access violation when creating buffer

opengl - 像素化 UV 坐标时是否可以解决舍入问题?

c++ - 定义一个结构体中没有默认构造函数的类