微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Opengl 中修改 VBO 的最佳方法是什么?喜欢推流行?

如何解决在 Opengl 中修改 VBO 的最佳方法是什么?喜欢推流行?

我有一个 VBO,我在一个名为 Line 的 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"),&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,3* sizeof(float),(void*)0);
glDrawArrays(GL_LInes,2);
glEnabLevertexAttribArray(0);
return 0;
}

解决方法

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。