如何处理OpenGL中VBO频繁更改数据的问题?

我在做一个2D游戏,为了减少drawcall,我尝试将许多小的VBO合成一个大VBO,同时VBO的数据已经经过了矩阵变换运算成规范化设备坐标系。但这带…
关注者
33
被浏览
21,926
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

你思路对,VBO数据频繁更新造成数据抖动。一般来说,为减少实体绘制次数和OpenGL 状态切换,我们一般对显示属性(一般可以看成材质)一样的实体几何数据进行合并,但合并也讲究方法,更新频率少的实体划归为一类,材质相近的合成一组,比如静态场景,背景;动态的实体分为一类,材质一致的合成一组。而不是一股脑的不分静态、动态实体渲染属性一直的都打包成一个VBO。 VBO 数量尽可能少当然是好事,但不能只讲究少,不讲究灵活性,其实VBO数量控制在一定合理范围内,比如 一两千内性能都是不错的。原则是:渲染数据不变的实体尽量合成一组,数据动态变化的按一定粒度材质一致的合成一组,不是VBO越大越好, 比如只对“碎片化”(几何图元几百个。。。)实体 的VBO 进行合并,大的就不要合并了,方便实体数据进行更新。VBO总使用量不要太多,比如过万就不好了,需要优化。减少渲染状态切换,引擎层面对实体按材质做好排序,分组的话,问题不大。引擎层面考虑实体剔除,比如视锥体剔除或其它剔除策略也能提速不少。

不知你为何要用存储设备坐标系下的坐标?减少GPU矩阵计算?完全没有必要。