在我的iOS应用程序中,我有一组行星地图作为图像,其中一些分辨率高达14k。我可以将缩小版本应用于领域,以在SceneKit中创建行星模型。 但是,我希望用户能够放大以查看全分辨率图像的详细信息。我也希望能够在没有我的应用程序内存不足的情况下执行此操作。 有没有办法将纹理自动贴图到像Google Maps那样的球体上,只在需要时才加载部件和分辨率?将极高分辨率映射到SceneKit中的球体
回答
您可以使用很少的编程工作就可以应用的两种优化技术是mipmap和详细程度。
如果您设置代表行星地图的SCNMaterial
的mipFilter
属性,您将获得自动生成的mipmap。
如果您为地球的SCNGeometry
提供了一些SCNLevelOfDetail
实例,则会得到高度减少的多边形数量的版本,这将节省内存。
这些都是在2013年WWDC SceneKit谈话中提到的。 2014年再次提到了SCNLevelOfDetail
.2014示例代码包含两个示例:AAPLPresentationViewController中的mipmap生成和第58张幻灯片中的LOD。
您需要做的是将纹理拆分为更小的部分并提供不同的大小在细节层面。当您的相机放大到足够深时,您可以使用具有最高分辨率的纹理,但是您还需要限制要显示的纹理数量。当你显示一个行星的表面放大时,只有一小部分可以在屏幕上看到,但缩小了整个前表面。因此,将您的纹理分成小块,并为其他缩放级别生成较低分辨率的纹理。您还需要创建自定义几何图形并在其上分配小高分辨率纹理片段。最后,您需要根据距离或视角来决定为哪个相机视图显示哪个纹理几何图形。使用视锥体,您还需要决定在当前场景中看到哪些部分。我目前面临同样的问题。我已经使用SCNNode创建了所有子网格和所有较小的纹理(不要在这里加载纹理 - 它们只需要按需加载!),但是我没有测试的工作解决方案,哪些子节点是可见。在这个场景的截锥体内部看不见这个东西,因为它只做边界框测试,并且边界框很大,其中大部分将总是部分在视锥体内部(所以我现在正在试图实现我的自己的测试)。而且您还需要一些曲面法线来测试曲面的正面是否指向相机的方向。不幸的是,因为我还没有工作解决方案,所以我不能在这里发布任何代码 - 我只能描述我的“编码计划”,这将起作用(至少使用OpenGL,我已经实现了像几年前那样的东西)。也许这个解决方案的基本思想对你有帮助吗?否则,也许我们可以一起找出其余的...... :-)
- 1. HTML到PDF高分辨率
- 2. 如何在MATLAB中将低分辨率图像转换为高分辨率?
- 3. 将立方体贴图映射到球体的问题
- 4. 将2d空间中的点映射到球体
- 5. OpenGL ES帮助 - 提高PanoramaGL的球形分辨率?
- 6. 分辨率和宽高比
- 7. 获取高分辨率pygame
- 8. 高分辨率iPhone背景
- 9. Ghostscript和高分辨率?
- 10. 高分辨率支持 - Android
- 11. Chrome将高分辨率图像呈现为非常低的分辨率?
- 12. 导出SWF到高分辨率JPEG/PNG
- 13. 将图片映射到球体或圆柱体
- 14. 如何将球体映射到四面体?
- 15. uiwebview中的高分辨率图像
- 16. 测试一个高分辨率显示器上低分辨率
- 17. 同时支持高分辨率和低分辨率图像
- 18. HTML:在低分辨率下渲染高分辨率图像
- 19. 如何将高分辨率图像转换为低分辨率图像?
- 20. 具有多分辨率映射的碰撞检测
- 21. 如何排序与含有从高分辨率到低分辨率
- 22. 如何从MediaWiki中的低分辨率SVG获取高分辨率缩略图?
- 23. 什么比例因子用于映射高分辨率显示器上的字体大小?
- 24. Android可绘制分辨率映射 - 新老命名
- 25. 高分辨率再分析数据
- 26. 将实体映射到DTO
- 27. 将NativeQuery映射到实体
- 28. 将纹理映射到一个球体OpenGL ES
- 29. 来自PDF的高分辨率图像
- 30. 支持高分辨率的MobileFIrst
从我对mipFilter不太科学的测试中,它看起来石灰内存使用率基于缩放级别保持不变。无论对象是超级小而远或靠近,对象上的8k纹理都占用〜400mb的内存。我正在使用线性滤波器模式。还有什么我必须实现它吗? – Timestretch