Android OpenGL ES2 一个 VBO 的许多纹理
Posted
技术标签:
【中文标题】Android OpenGL ES2 一个 VBO 的许多纹理【英文标题】:Android OpenGL ES2 Many textures for one VBO 【发布时间】:2016-09-18 11:37:55 【问题描述】:我有许多固定对象,例如地形和建筑物,我想将它们全部合并到一个 VBO 中,以在对象过多时减少绘制调用并提高性能,我加载纹理并将它们的 id 存储在数组中,我的问题是我可以将纹理绑定到那个 VBO,还是必须为每个纹理制作一个单独的 VBO?或者我可以根据偏移量和长度为一个 VBO 制作多个glDrawArrays
,如果我能做到这一点,这是否会顺利且执行良好?
【问题讨论】:
【参考方案1】:在 ES 2.0 中,如果您想在一次绘制调用中使用多个纹理,您唯一的好选择是使用纹理图集。本质上,您将来自多个逻辑纹理的纹理数据存储在单个 OpenGL 纹理中,并选择纹理坐标,以便为每个图元使用所需的纹理数据。这可以通过调整原始纹理坐标来完成,或者通过将 id 输入着色器并根据 id 对纹理坐标应用偏移来完成。
当然,您可以对单个 VBO 使用多个 glDrawArrays()
调用,并在它们之间绑定不同的纹理。但这违背了您减少绘图调用次数的目标。在花费大量时间进行这些类型的优化之前,您当然应该确保绘制调用的数量确实是您的瓶颈。
在更高级的 OpenGL 版本中,您拥有可以帮助解决此用例的附加功能,例如数组纹理。
【讨论】:
嗯,第一个选项对我来说不是那么容易,所以我会选择第二个,所以最好创建单独的 VBO,每个 VBO 都有自己的绘图方法或将它们全部合并,然后为每个调用 draw获取VBO部分的偏移量和长度后的纹理?【参考方案2】:许多游戏引擎执行了几种标准技术来实现低绘制调用。
批处理:这种技术将所有引用相同材质的对象组合在一起,并将它们组合成一个网格。对象甚至不必是静态的。如果它们是动态的,您仍然可以通过传递模型矩阵数组来批处理它们。
纹理图集:为所有静态网格创建纹理图集是其他答案中所说的最佳方法。但是,您必须做很多工作才能有效地组合纹理并相应地更新它们的 UV。
【讨论】:
以上是关于Android OpenGL ES2 一个 VBO 的许多纹理的主要内容,如果未能解决你的问题,请参考以下文章
Android音视频 OpenGL ES2.0 绘制图片纹理