OpenGL - 告诉顶点着色器VBO已更改
OpenGL - tell vertex shader that VBO has changed
我目前正在编写一个需要不断更新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() 将获得任何非零错误代码的字符串,该字符串更详细地解释了错误。
附言对不起我的写作技巧很差。
相关文章:
- 如何循环打印顶点结构
- D3D11-将混合权重和索引传递到顶点着色器
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- OpenGL VBO Indexing ( How to compute Index Array)
- 如何将一半传递给顶点着色器?
- 在 DirectX 11 中从 GPU 读回顶点缓冲区(并获取顶点)
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 使用 OpenGL 4.5 更改所选顶点的颜色
- 如何在顶点着色器中使用VBO数据作为位置数据,在片段着色器中使用统一数据作为颜色数据
- 可以在同一 VBO 中存储不同的顶点属性和索引
- 在 OpenGL 中,在保持良好帧速率的同时,VBO 中有多少个顶点的好目标是什么
- GLSL着色器不渲染任何内容,VAO已填充,VBO已填充顶点
- 用于VBO-OpenGL的顶点阵列
- 使用客户端顶点阵列在没有VBO的情况下在opengl 3.1+中进行渲染
- 顶点着色器输出,没有任何 VBO 输入
- c++和OpenGL, VBO顶点交错与骨信息
- 用顶点缓冲对象(VBO)渲染Kinect点云
- OpenGL - 告诉顶点着色器VBO已更改