2016-09-18 67 views
0

我有许多像地形和建筑物这样的固定对象,我想将它们全部合并到一个VBO中,以减少绘制调用并在存在太多对象时提高性能,我加载纹理并存储它们ids在数组中,我的问题是我可以将纹理绑定到该VBO或必须为每个纹理制作单独的VBO?或者我可以根据偏移量和长度为一个VBO制作多个glDrawArrays,如果我能做到这一点,这将是顺利和良好的执行?Android OpenGL ES2许多纹理对于一个VBO

回答

1

在ES 2.0中,如果您想在单次绘制调用中使用多个纹理,唯一不错的选择是使用纹理图集。本质上,您将来自多个逻辑纹理的纹理数据存储在单个OpenGL纹理中,并选择纹理坐标以便为每个基元使用所需的纹理数据。这可以通过调整原始纹理坐标,或通过向着色器中提供一个id并根据id向纹理坐标应用偏移量来完成。

当然,您可以使用多个glDrawArrays()调用一个VBO,并在它们之间绑定不同的纹理。但是这违背了你减少平局数量的目标。在花费大量时间进行这些类型的优化之前,您一定要确保绘制调用次数真的成为您的瓶颈。

在更高级的OpenGL版本中,您可以使用其他功能来帮助处理此用例,例如数组纹理。

+0

第一个选项对我来说并不那么容易,所以我会选择第二个,所以最好创建单独的VBO,每个VBO都有自己的绘制方法或将它们合并,然后在获得偏移量后为每个纹理调用绘制和VBO的部分长度? – Mohamed

0

有很多标准技术可以让很多游戏引擎执行低级别调用。

配料:该技术将所有指向相同材质的物体组合成一个网格。这些对象甚至不一定是静态的。如果它们是动态的,您仍然可以通过传递模型矩阵数组来批量处理它们。

纹理图集:为所有静态网格物体创建纹理图集是另一个答案中所述的最佳方式。然而,你需要做很多工作来有效地组合纹理并相应地更新UV。