在OpenGL ES中绘制一个非常高分辨率的纹理对象(球体)

时间:2013-03-31 17:06:53

标签: ios opengl-es

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

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

基本情况:

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

限制:

  • 高端平板电脑限制为4096x4096纹理
  • 高端平板电脑限于8个同步纹理单元

问题:

  • 总的来说,它总是有500万像素的纹理数据
  • 分割成较小的纹理并不能很好地工作,因为设备只有8个单位;只有一个纹理图层,我可以分成8个纹理单元,所有纹理都小于4096x4096 - 但这只允许单个图层
  • 将图层渲染为单独的几何图形效果不佳,因为它们需要使用片段着色器进行混合

...目前,我认为唯一可行的想法是:

  1. 将球体分成NxM"球体"并将每个渲染为单独的几何
  2. 缩小时使用mipmap渲染低分辨率纹理
  3. ...在放大时依靠简单的剔除来切除大部分剔除,并且在无法剔除时使用小(呃)纹理进行mipmapping
  4. ......但似乎应该有更简单的方法/更好的选择?

2 个答案:

答案 0 :(得分:0)

似乎没有办法在移动GPU的内存中安装如此巨大的纹理,甚至进入iPad 3。

所以你必须传输纹理数据。你需要的东西叫做 clipmap (由扩展的megatexture技术的id软件推广)。

请在此处阅读此文档,其中包含描述技术的文档链接:http://en.wikipedia.org/wiki/Clipmap

答案 1 :(得分:0)

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

如果进行数学计算,则无法实时传输1 GB(24,000 x 12,000像素x 4 B)。这也是浪费,因为用户永远不会同时看到它。