前言
最近需要在ios平台下进行DataEarth开发,主要是基于osgEarth渲染引擎做二次开发。源码版本:OpenScenGraph3.6.5、osgEarth 2.10.2和Xcode 11.3做集成开发。碰到一个比较奇葩的问题,主要是tif格式的地形release版本无法在mp和rex插件下渲染,现已解决特此记录。
解决方法
确认第三方库是否正确加载
ios比较特别,它会编译一个osgdb_imageio插件出来,这个插件主要是读取图片文件。大家不妨可以打开看一下ReaderWriterImageIO这个类,类的构造方法中包含了很多格式的图片,而且最坑的是默认使用这个库来读取图片文件。所以我把这个文件的tiff和tif这两个格式给注销掉,强制让它调用osg的tiff库来读取地形,到这已经可以加载出地形了,就是距离地面比较进时地形就会变成砖块状了,这个初步猜测应该是采样出了问题或者是线性插值有问题,接下来带着这两个问题一步一步刨根问题。
源码程序中查找问题
- osgEarth文件下的ImageToHeightFieldConverter类中有一个convert方法,这个方法主要获取32位或者16位的高程数据(我项目中使用的是16位的),由于三方库加载的问题会导致这个地方出现问题,所以要特别留意一下此处。
- osgEarth文件下的TerrainTileModelFactory类,找到addElevation方法,此方法中调用了convertTo32F这个方法,我们需要将其改为convertTo16F,同时找到createElevationTexture方法,将tex->setInternalFormat(GL_R32F)这个方法删除掉,增加一行tex->setInternalFormatMode(osg::Texture::USE_IMAGE_DATA_FORMAT),然后从新编译即可正常渲染地形