OpenGL中的动态VBO

Posted

技术标签:

【中文标题】OpenGL中的动态VBO【英文标题】:Dynamic VBO in OpenGL 【发布时间】:2010-07-16 16:42:53 【问题描述】:

存储用于 VBO(或顶点数组)的动态数据的最佳方式是什么。我看到的唯一示例是 2D 静态数组,指向该数组的指针与下一个参数一起使用,例如步幅、用于一个元素的字节等。我可以使用“动态”数组,因此我可以在空中指定它的大小,但只有一次。我的观点是,例如,如果你已经绘制了 1000 个点(谈论 2D,所以我认为点比顶点更好)作为线带并且你添加新点,这样你必须创建大小为 1001 的新数组,复制从旧字段到新字段的所有内容,添加新点并将其发送到图形内存。最好的方法是使用向量或双端队列作为临时存储,但是我必须转换为数组并再次发送。

那么有没有更好的方法来做到这一点?我可以只向 VBO 添加新部分而不发送旧数据吗?或者更好的方式来存储数据/使用向量作为数据源而不需要转换?

【问题讨论】:

【参考方案1】:

我通常只使用 'ole 矢量技巧:

struct GL_Vertex

    Eigen::Vector2f tex;
    Eigen::Vector3f color;
    Eigen::Vector3f pos;
;
...
vector<GL_Vertex> buf(1000);
...
glTexCoordPointer( 2, GL_FLOAT, sizeof(GL_Vertex), &buf[0].tex );
glColorPointer( 3, GL_FLOAT, sizeof(GL_Vertex), &buf[0].color );
glVertexPointer( 3, GL_FLOAT, sizeof(GL_Vertex), &buf[0].pos );

【讨论】:

它是如何工作的?我认为该向量正在存储在哪里寻找下一个成员的额外信息。如何将它与 glBufferData 一起用作第三个参数? std::vector 保证存储彼此相邻的元素。对于 glBufferData() 和一个原始浮点向量或任何你只需删除结构符号的东西: &vec[0]

以上是关于OpenGL中的动态VBO的主要内容,如果未能解决你的问题,请参考以下文章

Android使用WallpaperService和openGL ES生成的动态图形设置动态壁纸

opengl 动态贝塞尔曲线有间隙 - glEvalCoord1f();

OpenGL 中的离屏帧缓冲区

OpenGL ES纹理

动态渲染顶点之间的线条OpenGL

基于OpenGL的三维曲面动态显示实现