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

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

目标:(五十一)中的问题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设置VirtualProgram。

osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp
void
RexTerrainEngineNode::updateState()
{
    osg::StateSet* terrainStateSet   = _terrain->getOrCreateStateSet();   // everything
    terrainStateSet->setName("Terrain Group");
    VirtualProgram* terrainVP = VirtualProgram::getOrCreate(terrainStateSet);
    terrainVP->setName( "Rex Terrain" );
    package.load(terrainVP, package.ENGINE_VERT_MODEL);
}

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

5、这个地方比较隐蔽,在RexTerrainEngineNode的成员变量_imageLaye

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值