osgEarth的Rex引擎原理分析(一一二)每帧会重复生成着色器程序吗

本文分析了osgEarth中的Rex引擎如何管理着色器程序,指出一般情况下着色器程序不会重复生成,除非其状态(着色器向量)发生改变。着色器程序创建后会被缓存,下一帧直接从缓存中获取,确保性能。动态添加着色器代码时,使用锁同步操作。文章还列举了一系列后续将分析的Rex引擎相关问题。
摘要由CSDN通过智能技术生成

目标:(一一一)中的问题198

一般是不会的,但是着色器程序状态改变的话还是会的。着色器程序的状态用其中的着色器向量来表示,如果着色器向量的长度和其中的内容没有变化,就认为着色器程序的状态没有变化。

着色器程序在创建完成后,会放入缓存,下一个帧循环从缓存中取出使用即可,如果缓存中不存在才会再次生成着色器程序。这也说明可以在程序运行时动态地向着色器程序添加着色器代码。

1、着色器程序写入缓存

osgEarth/VirtualProgram.cpp
void
VirtualProgram::apply( osg::State& state ) const
{

{
                    ProgramEntry& pe = _programCache[local.programKey];
                    pe._program = program.get();
                    pe._frameLastUsed = frameNumber;
}

2、着色器程序读取缓存

osgEarth/VirtualProgram.cpp
void
VirtualProgram::apply( osg::State& state ) const
{
_programCacheMutex.lock();
            const_cast<VirtualProgram*>(this)->readProgramCache(local.programKey, frameNumber, program);
            _programCacheMutex.unlock();
}

3、在积累着色器时,使用了锁,就是用来同步动态向着色器程序添加着色器代码的,避免同时操作_shaderMap

osgEarth/VirtualProgram.cpp
void
VirtualProgram::addShadersToAccumulationMap(VirtualProgram::ShaderMap& accumMap,
                                            const osg::State&          state) const
{
    //Threading::ScopedReadLock shared( _dataModelMutex );
    _dataModelMutex.lock();

    for( ShaderMap::const_iterator i = _shaderMap.begin(); i != _shaderMap.end(); ++i )
    {
        if ( i->data().accept(state) )
        {
            addToAccumulatedMap(accumMap, i->key(), i->data());
        }
    }

    _dataModelMutex.unlock();
}

 

待继续分析列表:

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

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

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

12、osgEarth::TerrainEngineNode中setMap方法作用((十二)中问题)

13、RexTerrainEngineNode中_mapFrame的作用((十二)中问题)

14、地形变形(Terrain morphing)((十二)中问题)

15、地球瓦片过期门限的含义((十二)中问题)

16、高分辨率优先的含义((十二)中问题)

17、OSGEARTH_DEBUG_NORMALS环境变量的作用((十二)中问题)

18、活跃瓦片寄存器的作用((十二)中问题)

19、资源释放器子节点的作用((十二)中问题)

20、共享几何图形池子节点的作用((十二)中问题)

21、分页瓦片加载器子节点的作用((十二)中问题)

22、分页瓦片卸载器子节点的作用((十二)中问题)

23、栅格化器子节点的作用((十二)中问题)

24、地形子节点的作用((十二)中问题)

25、绑定渲染器的作用((十二)中问题)

26、地图回调函数的作用((十二)中问题)

27、如何将地图图层添加到rex引擎中((十二)中问题)

28、选择信息的作用((十二)中问题)

29、瓦片包围盒修改回调函数的作用((十二)中问题)

30、刷新rex引擎((十二)中问题)

31、刷新边界作用((十二)中问题)

32、osgEarth::Metrics类的意义((十四)中问题)

33、请求合并队列_mergeQueue((十四)中问题)

3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值