10

我在 OpenGL ES 中绘制行星,并遇到了一些有趣的性能问题。一般的问题是:如何最好地在球体上渲染“非常详细”的纹理?

(保证球体;我对特定于球体的优化感兴趣)

基本情况:

  • 窗口约为。2048 x 1536(例如 iPad3)
  • 地球的纹理贴图为 24,000 x 12,000 像素(美国一半大小的区域适合屏幕的整个宽度)
  • 地球仪显示在从放大(美国填充屏幕)到缩小(整个地球可见)的所有位置
  • 我需要至少 3 个纹理层(1 个用于行星表面,1 个用于昼夜差异,1 个用于用户界面(突出不同区域)
  • 一些图层是动画的(即它们必须在运行时快速加载和删除它们的纹理)

限制:

  • 高端平板电脑仅限于 4096x4096 纹理
  • 高端平板电脑仅限于 8 个同时纹理单元

问题:

  • 总共是 5 亿像素的纹理数据
  • 分割成更小的纹理效果不好,因为设备只有 8 个单元;只有一个纹理层,我可以分成 8 个纹理单元,所有纹理都小于 4096x4096 - 但只允许一个层
  • 将图层渲染为单独的几何体效果不佳,因为它们需要使用片段着色器进行混合

...目前,我唯一听起来可行的想法是:

  1. 将球体拆分为 NxM“球体”并将每个球体渲染为单独的几何体
  2. 缩小时使用 mipmap 渲染低分辨率纹理
  3. ...在放大时依靠简单的剔除来切除大部分,并且在无法剔除时使用 mipmapping 使用较小的(呃)纹理

...但似乎应该有更简单的方法/更好的选择?

4

2 回答 2

0

似乎没有办法将如此巨大的纹理放入移动 GPU 的内存中,即使在 iPad 3 中也是如此。

所以你必须流式传输纹理数据。你需要的东西叫做clipmap(由具有扩展megatexture技术的id软件普及)。

请在此处阅读有关此内容,有描述技术的文档的链接:http ://en.wikipedia.org/wiki/Clipmap

于 2013-04-01T14:51:01.603 回答
0

这在 ES 中不容易做到,因为还没有虚拟纹理扩展。您基本上需要实现虚拟纹理(一些 ES 设备实现 ARB_texture_array)并以尽可能低的分辨率(取决于视图)为您的球体流式传输。这样,可以在片段着色器中完成所有操作,不需要几何细分。有关如何实施的详细信息,请参阅此演示文稿(和论文)。

如果您进行数学计算,则根本不可能实时流式传输 1 GB(24,000 x 12,000 像素 x 4 B)。这也是一种浪费,因为用户永远无法同时看到所有内容。

于 2014-05-28T08:53:07.510 回答