osgEarth的Rex引擎原理分析(五十二)osgEarth::VirtualProgram默认出现在哪些位置

本文分析了osgEarth::VirtualProgram在RexTerrainEngine中的使用,包括在RexTerrainEngineNode、osgEarth::TileRasterizer、osgEarth::ImageLayer等节点中的着色器设置和作用。详细探讨了不同节点加载的着色器代码,并列出了一系列后续要分析的问题,涉及osgEarth的各个组件和功能。

目标:(五十一)中的问题121

默认出现在五个地方:

1、osgEarth::Drivers::RexTerrainEngine::RexTerrainEngineNode节点会设置VirtualProgram,该vp是抽象的,也就是能够被继承使用,在自身节点的渲染中不会起作用

osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp
RexTerrainEngineNode::RexTerrainEngineNode() :
TerrainEngineNode     ( ),
_terrain              ( 0L ),
_tileCount            ( 0 ),
_tileCreationTime     ( 0.0 ),
_batchUpdateInProgress( false ),
_refreshRequired      ( false ),
_stateUpdateRequired  ( false )
{
osg::StateSet* stateset = getOrCreateStateSet();
        stateset->setName("RexTerrainEngineNode");
        VirtualProgram* vp = VirtualProgram::getOrCreate(stateset);
        vp->setName("RexTerrainEngineNode");
        vp->setIsAbstract(true);    // cannot run by itself, requires additional children
        Shaders package;
        package.load(vp, package.SDK);
}

其加载的着色器代码为RexEngine.SDK.vert.glsl

2、osgEarth::TileRasterizer节点会设置VirtualProgram,该vp是非继承的的,也就是只使用自己加载的着色器代码,不使用状态机已经加载的其它着色器代码。

osgEarth/TileRasterizer.cpp
TileRasterizer::TileRasterizer() :
osg::Camera()
{
    osg::StateSet* ss = getOrCreateStateSet();
    VirtualProgram* vp = VirtualProgram::getOrCreate(ss);
    vp->setInheritShaders(false);
}

该节点并没有加载任何着色器代码

3、osgEarth::ImageLayer节点会设置VirtualProgram。

osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp
void
RexTerrainEngineNode::addTileLayer(Layer* tileLayer)
{
    ImageLayer* imageLayer = dynamic_cast<ImageLayer*>(tileLayer);
    osg::StateSet* stateSet = imageLayer->getOrCreateStateSet();
    VirtualProgram* vp = VirtualProgram::getOrCreate(stateSet);
    shaders.load(vp, shaders.ENGINE_FRAG);
}

其加载的着色器代码为RexEngine.frag.glsl

4、RexTerrainEngineNode的地形节点_terrain设置VirtualProgra

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、付费专栏及课程。

余额充值