osgEarth的Rex引擎原理分析(二十六)TileNode的_renderModel作用

本文分析了osgEarth的RexTerrainEngine的TileRenderModel,讲解了其与采样器和渲染通道的关系。TileRenderModel维护了共享采样器和渲染通道,每个通道负责显示特定图层,采样器包括多种类型,用于处理不同数据。TileNode的_merge函数用于设置_renderModel,子节点会继承并修正这些设置。文章还列出了一系列待继续分析的问题。

目标:(十八)中的问题59

TileRenderModel的内容来自于TerrainTileModel(参考TileNode的merge函数),TerrainTileModel的内容来自于文件或网络(参考LoadTileData的invoke函数)。

osgEarth::Drivers::RexTerrainEngine::TileRenderModel主要维护两个变量:采样器osgEarth::Drivers::RexTerrainEngine::Sampler向量_sharedSamplers和渲染通道osgEarth::Drivers::RexTerrainEngine::RenderingPass _passes向量。

rex引擎是多通道渲染的,每一个通道负责一个可见的图层,通道可以是高层、影像、法线等,一般就是影像或颜色通道。

采样器和通道是相关联的,但TileRenderModel下的有些采样器并没有和通道关联,因此是共享采样器。一个通道可能有多个采样器,采样器只有纹理和矩阵两个成员,纹理需要从文件等途径中读取,采样器分为COLOR、CLOLOR_PARENT、ELEVATION、NORMAL、CONVERAGE和SHARED几种。

顶层TileNode在merge时会往_renderModel中添加通道,并设置其关联的图层和采样器,下级TileNode在create时会继承上级TileNode的通道,也就是设置了下级TileNode的_renderModel的通道。

顶层TileNode在merge时会往_renderModel添加采样器,并设置纹理和矩阵,下级TileNode在create时会继承上级TileNode的采样器并进行修正,也就是设置了下级TileNode的_renderModel的采样器。

顶层TileNode的_renderModel还包含共享采样器,也是在TileNode的merge函数中进行设置,之所以叫共享采样器,应该是因为对于不同LOD的TileNode这个采样器都是一样的。

通道一般只会添加,不会删除。

因为_renderModel是osgEarth::Drivers::Rex

osgEarth 中配置自定义投影类型,主要依赖于 `<map>` 配置文件中的 `<profile>` 元素,它用于指定地图的投影方式和空间参考系统。osgEarth 支持多种内置投影配置,包括 `global-mercator`(Web Mercator)和 `eqc-wgs84`(Equirectangular)等,同时也允许开发者通过定义空间参考系统来实现自定义投影[^3]。 要实现自定义投影,首先需要在地图配置文件中将 `type` 设置为 `projected`,然后在 `<profile>` 标签中指定所需的投影名称或 EPSG 编码。例如,若要使用等距投影(Equirectangular),可以在配置文件中使用 `eqc-wgs84` 作为 profile 名称[^2]。若需要使用其他投影,如 EPSG:3857(Web Mercator),则可以使用 `global-mercator` 作为 profile 名称[^3]。 以下是一个使用等距投影的地图配置示例: ```xml <map name="EquirectangularMap" type="projected" version="2"> <options> <terrain driver="rex"/> <profile>eqc-wgs84</profile> </options> <image name="World Image" driver="gdal"> <url>world.tif</url> </image> </map> ``` 如果需要定义一个 osgEarth 不直接支持的自定义投影,可以通过创建自定义的空间参考系统(SpatialReference)来实现。这通常涉及调用 `osgEarth::SpatialReference::create` 方法并传入对应的 EPSG 编码或 WKT 定义。例如: ```cpp osgEarth::SpatialReference* srs = osgEarth::SpatialReference::create("EPSG:XXXX"); ``` 其中 `"EPSG:XXXX"` 替换为实际的 EPSG 编码或 WKT 描述字符串。随后,可以将该空间参考系统应用到地图的 profile 设置中,以实现特定的投影需求。 在配置过程中,还需确保数据源的空间参考与地图的投影一致,否则需要进行坐标转换。osgEarth 提供了 `osgEarth::GeometryUtils::transformGeometry` 等工具方法用于处理不同坐标系统之间的几何数据转换。 此外,osgEarthRex 引擎支持基于投影的地形渲染,因此在配置文件中指定 `<terrain driver="rex"/>` 可以更好地适配不同的投影方式[^2]。 ### 相关问题 1. osgEarth 中如何配置 EPSG:3857 投影? 2. 如何在 osgEarth 中实现等距投影地图的高效渲染? 3. osgEarth 是否支持通过 WKT 定义自定义空间参考系统? 4. osgEarth 中如何实现不同图层使用不同投影的叠加显示? 5. osgEarthRex 引擎在处理非 Mercator 投影时有哪些优化策略?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值