我在 OpenGL ES 中绘制行星,并遇到了一些有趣的性能问题。一般的问题是:如何最好地在球体上渲染“非常详细”的纹理?
(保证球体;我对特定于球体的优化感兴趣)
基本情况:
- 窗口约为。2048 x 1536(例如 iPad3)
- 地球的纹理贴图为 24,000 x 12,000 像素(美国一半大小的区域适合屏幕的整个宽度)
- 地球仪显示在从放大(美国填充屏幕)到缩小(整个地球可见)的所有位置
- 我需要至少 3 个纹理层(1 个用于行星表面,1 个用于昼夜差异,1 个用于用户界面(突出不同区域)
- 一些图层是动画的(即它们必须在运行时快速加载和删除它们的纹理)
限制:
- 高端平板电脑仅限于 4096x4096 纹理
- 高端平板电脑仅限于 8 个同时纹理单元
问题:
- 总共是 5 亿像素的纹理数据
- 分割成更小的纹理效果不好,因为设备只有 8 个单元;只有一个纹理层,我可以分成 8 个纹理单元,所有纹理都小于 4096x4096 - 但只允许一个层
- 将图层渲染为单独的几何体效果不佳,因为它们需要使用片段着色器进行混合
...目前,我唯一听起来可行的想法是:
- 将球体拆分为 NxM“球体”并将每个球体渲染为单独的几何体
- 缩小时使用 mipmap 渲染低分辨率纹理
- ...在放大时依靠简单的剔除来切除大部分,并且在无法剔除时使用 mipmapping 使用较小的(呃)纹理
...但似乎应该有更简单的方法/更好的选择?