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 的许多纹理的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL ES 2 中更新 VBO 的顶点

android openGL ES2 一切从绘制纹理開始

如何在 ES2.0 中使用 VBO 画圆

Android音视频 OpenGL ES2.0 绘制图片纹理

Android音视频 OpenGL ES2.0 绘制图片纹理

Eclipse中通过Android模拟器调用OpenGL ES2 0函数操作步骤