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