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