2016-11-07 42 views
5

在我的iOS应用程序中,我有一组行星地图作为图像,其中一些分辨率高达14k。我可以将缩小版本应用于领域,以在SceneKit中创建行星模型。 但是,我希望用户能够放大以查看全分辨率图像的详细信息。我也希望能够在没有我的应用程序内存不足的情况下执行此操作。 有没有办法将纹理自动贴图到像Google Maps那样的球体上,只在需要时才加载部件和分辨率?将极高分辨率映射到SceneKit中的球体

回答

1

您可以使用很少的编程工作就可以应用的两种优化技术是mipmap和详细程度。

如果您设置代表行星地图的SCNMaterialmipFilter属性,您将获得自动生成的mipmap。

如果您为地球的SCNGeometry提供了一些SCNLevelOfDetail实例,则会得到高度减少的多边形数量的版本,这将节省内存。

这些都是在2013年WWDC SceneKit谈话中提到的。 2014年再次提到了SCNLevelOfDetail.2014示例代码包含两个示例:AAPLPresentationViewController中的mipmap生成和第58张幻灯片中的LOD。

+0

从我对mipFilter不太科学的测试中,它看起来石灰内存使用率基于缩放级别保持不变。无论对象是超级小而远或靠近,对象上的8k纹理都占用〜400mb的内存。我正在使用线性滤波器模式。还有什么我必须实现它吗? – Timestretch

1

您需要做的是将纹理拆分为更小的部分并提供不同的大小在细节层面。当您的相机放大到足够深时,您可以使用具有最高分辨率的纹理,但是您还需要限制要显示的纹理数量。当你显示一个行星的表面放大时,只有一小部分可以在屏幕上看到,但缩小了整个前表面。因此,将您的纹理分成小块,并为其他缩放级别生成较低分辨率的纹理。您还需要创建自定义几何图形并在其上分配小高分辨率纹理片段。最后,您需要根据距离或视角来决定为哪个相机视图显示哪个纹理几何图形。使用视锥体,您还需要决定在当前场景中看到哪些部分。我目前面临同样的问题。我已经使用SCNNode创建了所有子网格和所有较小的纹理(不要在这里加载纹理 - 它们只需要按需加载!),但是我没有测试的工作解决方案,哪些子节点是可见。在这个场景的截锥体内部看不见这个东西,因为它只做边界框测试,并且边界框很大,其中大部分将总是部分在视锥体内部(所以我现在正在试图实现我的自己的测试)。而且您还需要一些曲面法线来测试曲面的正面是否指向相机的方向。不幸的是,因为我还没有工作解决方案,所以我不能在这里发布任何代码 - 我只能描述我的“编码计划”,这将起作用(至少使用OpenGL,我已经实现了像几年前那样的东西)。也许这个解决方案的基本思想对你有帮助吗?否则,也许我们可以一起找出其余的...... :-)