【问题标题】:Android OpenGL ES2 Many textures for one VBOAndroid OpenGL ES2 一个 VBO 的许多纹理
【发布时间】:2016-09-18 11:37:55
【问题描述】:

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

【问题讨论】:

    标签: android opengl-es vbo glsles vao


    【解决方案1】:

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

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

    在更高级的 OpenGL 版本中,您拥有可以帮助解决此用例的附加功能,例如数组纹理。

    【讨论】:

    • 嗯,第一个选项对我来说不是那么容易,所以我会选择第二个,所以最好创建单独的 VBO,每个 VBO 都有自己的绘图方法或将它们全部合并,然后为每个调用 draw获取VBO部分的偏移量和长度后的纹理?
    【解决方案2】:

    许多游戏引擎执行了几种标准技术来实现低绘制调用。

    批处理:这种技术将所有引用相同材质的对象组合在一起,并将它们组合成一个网格。对象甚至不必是静态的。如果它们是动态的,您仍然可以通过传递模型矩阵数组来批处理它们。

    纹理图集:为所有静态网格创建纹理图集是其他答案中所说的最佳方法。但是,您必须做很多工作才能有效地组合纹理并相应地更新它们的 UV。

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多