我正在编写一个算法生成几何的WebGL应用程序。几何体将包含4到150个对象,每个对象由16到2048个点组成,通过drawElements绘制为TRIANGLE_STRIP。几何图形将是静态的大多数帧,但需要根据用户输入进行动画处理。在更新几何体时的这些帧中,可以添加或移除点/三元组。还需要在程序的生命周期内添加/删除对象。
在此上下文中分配/更新VBO的最有效方法是什么?我很确定我应该使用DYNAMIC_DRAW和bufferSubData来更新每个对象,但是我是否想要过度分配一些巨大的VBO(假设每个对象的点数最坏的情况)并将每个对象定义为offset(对象编号*每个对象的最大大小),然后在最好的情况下有很多未分配的未使用的VBO内存?或者我应该尝试另一种方法吗?或者说这个内存占用空间足够小我还在考虑?
答案 0 :(得分:8)
在此上下文中分配/更新VBO的最有效方法是什么?我很确定我应该使用DYNAMIC_DRAW和bufferSubData来更新每个对象。
这确实是要走的路。实际上你想对你的对象使用双重甚至三重缓冲,即有一个VBO绑定绘图,而你用新数据更新另一个VBO的内容。在 glMapBuffer 之后,可以从进程中的所有线程访问内存映射,因此您可以让工作线程更新“后”顶点缓冲区,同时渲染线程正在忙于绘制当前帧。
或者就内存占用而言,这是否足够小,我过度思考?
您是否评估了您正在处理的最坏情况内存占用?鉴于你的数字,我敢打赌它将低于16MiB(150个对象* 2048点*每点3个双精度浮点数*每个双8个字节= 7.4 MiB,如果使用单精度浮点数则仅3.7MiB)。相比之下,现代显卡提供数百种MiB RAM(我的2006 GeForce 8800GTX拥有768MiB RAM,而我的Radeon HD6570拥有1024MiB(= 1GiB)。