osgEarth的Rex引擎原理分析(七十一)高程瓦片的绘制过程

本文详细解析osgEarth中RexTerrainEngineNode如何处理高程瓦片,从生成renderleaf、设置高程影像纹理到使用顶点着色器进行绘制,揭示高程瓦片在地图上的呈现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标:(五十五)中的问题142

1、在RexTerrainEngineNode遍历时生成renderleaf,其中的drawable为LayerDrawable(其对应earth文件中每一个高程、影像层)。在TerrainCuller进行遍历时,会对LayerDrawable添加实际瓦片对应的高程影像纹理,这样绘制出来就能看到高程影像效果了。

osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp
void
RexTerrainEngineNode::dirtyState()
{
    LayerDrawable* lastLayer = 0L;
    for(LayerDrawableList::iterator i = culler._terrain.layers().begin();
            i != culler._terrain.layers().end();
            ++i)
    {
        lastLayer = i->get();
        cv->apply(*lastLayer);
    }
}
osgUtil/RenderLeaf
inline RenderLeaf(osg::Drawable* drawable,osg::RefMatrix* projection,osg::RefMatrix* modelview, float depth=0.0f, unsigned int traversalOrderNumber=0):
            osg::Referenced(false),
            _parent(0),
            _drawable(drawable),
            _projection(projection),
            _modelview(modelview),
            _depth(depth),
            _traversalOrderNumber(traversalOrderNumber)
        {
            _dynamic = (drawable->getDataVariance()==osg::Object::DYNAMIC);
        }

2、在渲染时从renderleaf中取出drawable进行绘制,此时会用到顶点着色器,对顶点位置进行设置,对高程进行设置的着色器代码为RexEngine.Elevation.glsl(它里面调用了RexEngine.SDK.vert.glsl的函数)

osgEarthDrivers/engine_rex/LayerDrawable.cpp
void
LayerDrawable::drawImplementation(osg::RenderInfo& ri) const
{
    for (DrawTileCommands::const_iterator tile = _tiles.begin(); tile != _tiles.end(); ++tile)
    {
        tile->draw(ri, *_drawState, 0L);
    }
}
osgEarthDrivers/engine_rex/DrawTileCommand.cpp
void
DrawTileCommand::draw(osg::RenderInfo& ri, DrawState& dsMaster, osg::Referenced* layerData) const
{
    _geom->render(ptype, ri);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值