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

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

目标:(五十五)中的问题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);
}
osgEarthDrivers/engine_rex/GeometryPool.cpp
void SharedGeometry::render(GLenum primitiveType, osg::RenderInfo& renderInfo) const
{
    //调用opengl进行绘制,并进入图形管线
    glDrawElements(primitiveType, _drawElements->getNumIndices(), _drawElements->getDataType(), (const GLvoid *)(ebo->getOffset(_drawElements->getBufferIndex())));
}

 

待继续分析列表:

9、earth文件中都有哪些options((九)中问题)

10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)

11、rex地理信息引擎的四梁八柱((九)中问题)

12、osgEarth::TerrainEngineNod

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值