【发布时间】:2021-06-25 04:57:32
【问题描述】:
我有一个 VBO,我在一个名为 Line 的画线类中实例化它和一个 VAO,并调用
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
在渲染发生的我的 do-while 循环之前创建它们。像这样构造
Line X= Line();
在渲染循环期间,我从我这样实例化的同一个类函数中执行绘图调用。
X.draw(vec3 start ,vec3 end);
在绘图函数中,我绑定了 VAO 和 VBO 并进行绘图。然后我打电话
X.draw(vec3 start ,vec3 end);
再次从我的 do-while 循环的下一行开始。还有几次。每次它在我想要的地方画一条没有问题的线。但我的问题是,它是否覆盖了 VBO?或者只是将新数据推入 )index 位置并在每次调用新行时在 VBO 中堆积数据?如果是这样,它会持续多久?它似乎将新顶点与旧顶点连接起来。但是如果我有一个程序使用线条作为项目符号或其他东西,我可能会得到很多线条飞来飞去的实例,也许我使用了错误的方法并且需要擦除缓冲区,否则它会被绘图调用中的每个新绑定覆盖.为了清楚起见,我的绘图调用看起来像这样。
int Line::draw(vec3 start, vec3 end){
glUseProgram(shaderProgram);
glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "MVP"), 1, GL_FALSE, &MVP[0][0]);
glUniform3fv(glGetUniformLocation(shaderProgram, "color"), 1, &lineColor[0]);
glLineWidth(4.0f);
vertices = {
start.x, start.y, start.z,
end.x, end.y, end.z
};
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*vertices.size(), vertices.data(), GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3* sizeof(float), (void*)0);
glDrawArrays(GL_LINES, 0, 2);
glEnableVertexAttribArray(0);
return 0;
}
【问题讨论】:
-
glBufferData 将缓冲区替换为新缓冲区。
标签: opengl memory-management vbo