osgEarth的Rex引擎原理分析(四十八)osgEarth::Drivers::RexTerrainEngine::DrawState的作用

目标:(四十五)中的110

 

每帧都会创建一个DrawState

创建在TerrainRenderData::setup(这里存在内存泄漏的问题,因为只有new没有delete,不存在的,_drawState是智能指针,超出范围时会自动销毁,也就是在TerrainRenderData销毁时销毁)

osgEarthDrivers/engine_rex/TerrainRenderData.cpp
void
TerrainRenderData::setup(const MapFrame& frame,
                         const RenderBindings& bindings,
                         unsigned frameNum,
                         osgUtil::CullVisitor* cv)
{
    _drawState = new DrawState();
    _drawState->_frame = frameNum;
    _drawState->_bindings = &bindings;
}

在addLayerDrawable时传递

osgEarthDrivers/engine_rex/TerrainRenderData.cpp
LayerDrawable*
TerrainRenderData::addLayerDrawable(const Layer* layer, const MapFrame& frame)
{
    LayerDrawable* ld = new LayerDrawable();
    ld->_drawState = _drawState.get();
}

更新赋值的时机,其实是每次遍历时都会创建出一个新的DrawState

osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp
void
RexTerrainEngineNode::traverse(osg::NodeVisitor& nv)
{
    else if ( nv.getVisitorType() == nv.CULL_VISITOR )
    {
        TerrainCuller culler(cv, this->getEngineContext());
        culler.setup(_mapFrame, _cachedLayerExtents, this->getEngineContext()->getRenderBindings());
    }
}

在绘制时复制和使用

osgEarthDrivers/engine_rex/LayerDrawable.cpp
void
LayerDrawable::drawImplementation(osg::RenderInfo& ri) const
{
    PerContextDrawState& ds = _drawState->getPCDS(ri.getContextID());
    ds.refresh(ri, _drawState->_bindings);
    for (DrawTileCommands::const_iterator tile = _tiles.begin(); tile != _tiles.end(); ++tile)
    {
        tile->draw(ri, *_drawState, 0L);
    }
}
osgEarthDrivers/engine_rex/DrawState.cpp
void
PerContextDrawState::refresh(osg::RenderInfo& ri, const RenderBindings* bindings)
{
    // Establish a GL Extensions handle:
    if (!_ext.valid())
    {
        _ext = osg::GLExtensions::Get(ri.getContextID(), true);
    }

    // Size the sampler states property:
    if (_samplerState._samplers.size() < bindings->size())
    {
        _samplerState._samplers.resize(bindings->size());
    }

    const osg::Program::PerContextProgram* pcp = ri.getState()->getLastAppliedProgramObject();
    if (pcp && (pcp != _pcp))
    {
        // Reset all sampler matrix states since their uniform locations are 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值