【问题标题】:Whats the best way to modify a VBO in Opengl? Like push pop? [duplicate]在 Opengl 中修改 VBO 的最佳方法是什么?喜欢推流行吗? [复制]
【发布时间】: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


【解决方案1】:

“它似乎将新顶点与旧顶点连接起来”

如果您只是实例化(调用glGenBuffers)固定数量的行,则不应发生这种情况。正如 user253751 所说,每个 glBufferData 都应该覆盖最后一个,前提是您为其提供了正确的缓冲区句柄。

如果您正在绘制顶点不断变化的东西,请改用GL_DYNAMIC_DRAW。这对于像文本和子弹轨迹这样的小几何图形应该没问题。当然,对于复杂的几何图形,您使用统一变换来移动它每一帧并且只需要缓冲一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多