osgEarth的Rex引擎原理分析(七十一)高程瓦片的繪製過程

目標:(五十五)中的問題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::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((十四)中問題)

34、分頁瓦片加載器在更新遍歷時對請求處理過程((十四)中問題)

35、分頁瓦片加載器在更新遍歷時對已處理請求裁剪過程((十四)中問題)

36、已處理的請求隊列_requests((十四)中問題)

37、DatabasePager中的_fileRequestQueue和_httpRequestQueue((十六)中問題)

38、瓦片請求的生成到處理過程詳解((十六)中問題)

39、瓦片節點TileNode的創建過程((十七)中問題)

40、request請求加載瓦片優先級的含義((十七)中問題)

41、request的_internalHandle的作用((十七)中問題)

42、DatabaseRequest中_objectCache含義((十七)中問題)

42、osgEarth的多線程分析((十七)中問題)

43、osgEarth的緩存及其結構((十七)中問題)

44、DatabaseThread從緩存加載數據過程((十七)中問題)

45、DatabaseThread從文件加載數據過程((十七)中問題)

46、決定創建TileNode的時機條件((十七)中問題)

47、TerrainEngineNode的createTileModel過程詳解((十七)中問題)

48、DatabaseThread中CompileSet的含義((十七)中問題)

48、PagerLoader的traverse過程詳解((十七)中問題)

49、DatabaseThread的run過程詳解((十七)中問題)

50、LoadTileData的invoke過程詳解((十七)中問題)

51、TileNode的cull過程詳解((十七)中問題)

52、遮罩生成器osgEarth::Drivers::RexTerrainEngine::MaskGenerator((十八)中問題)

53、RexTerrainEngineNode::traverse過程詳解((十八)中問題)

54、TileNode節點下的場景樹分析((十八)中問題)

55、地形瓦片大小尺寸和LOD的關係((十八)中問題)

56、TileNode的_tileKeyValue作用((十八)中問題)

57、TileNode的_morphConstants作用((十八)中問題)

58、TileNode的_stitchNormalMap作用((十八)中問題)

59、TileNode的_renderModel作用((十八)中問題)

60、初始化高程柵格過程詳解((十八)中問題)

61、LoadTileData中的CreateTileModelFilter作用((十八)中問題)

62、TileNode節點何時會從場景樹中移除((十八)中問題)

63、osgEarth::Map的Profile創建過程((二十)中問題)

64、osgEarth::TerrainTileModelFactory添加顏色層和影像層的區別((二十一)中問題)

65、osgEarth::PatchLayer修補層的作用((二十一)中問題)

66、osgEarth::TerrainLayer中的_memCache(osgEarth::MemCache)詳解((二十一)中問題)

67、osgEarth::Layer::RenderType圖層渲染類型的作用((二十一)中問題)

68、osgEarth::TerrainLayer中TileSource的作用((二十一)中問題)

69、earth文件沒有設置高程圖層會不會有默認高程層(高程均爲0)((二十一)中問題)

70、TerrainTileModelFactory::addColorLayers過程詳解((二十一)中問題)

71、TerrainTileModelFactory::addElevation過程詳解((二十一)中問題)

72、osgearth中可能用到的幾個全局實例對象(osgDB::Registry osgEarth::Registry osg::Timer osg::DisplaySetting)((二十三)中問題)

73、osgEarth::Map::addLayer過程詳解((二十三)中問題)

74、TileNode::setDirty過程詳解((二十三)中問題)

75、請求四個狀態的含義(IDLE RUNNING MERGING FINISHED)((二十三)中問題)

76、什麼時候刪除TileNode節點,不會一直增加吧((二十三)中問題)

77、寄存器中請求狀態活動記錄的含義Registry::instance()->endActivity( req->getName() )((二十三)中問題)

78、瓦片TileNode的生命週期流程詳解((二十三)中問題)

79、rex引擎如何將瓦片構造成地球形狀((二十五)中問題)

80、高程、影像文件格式詳解((二十五)中問題)

81、TileNode的merge過程詳解((二十六)中問題)

82、osgEarth支持的空間參考座標系詳解(osgEarth::SpatialReference、osgEarth::CubeSpatialReference、osgEarth::TangentPlaneSpatialReference)((二十九)中問題)

83、osgEarth地球橢球體ellipsoid 大地基準面datum 地圖投影Projection詳解((二十九)中問題)

84、空間參考座標系和座標系統類型的關係(geocentric projected)((二十九)中問題)

85、proj4是什麼((二十九)中問題)

86、爲什麼要刪除設置過的垂直水準面((二十九)中問題)

87、osgEarth如何對投影座標系和大地座標系進行顯示處理的((二十九)中問題)

88、TileNode的節點構成,一個surface、tilenode((三十)中問題)

89、MapFram和MapInfo的關係((三十)中問題)

90、ModifyBoundingBoxCallback的使用時機和場合((三十)中問題)

91、MapFrame爲什麼要單獨存放高程層_elevationLayers,而不是放在圖層_layers中((三十)中問題)

92、MapFrame和Map中高程池的作用osg::ref_ptr<ElevationPool> _elevationPool((三十)中問題)

93、osgEarth::Drivers::RexTerrainEngine::TileDrawable分析((三十)中問題)

94、請求讀取地理信息失敗會如何處理((三十二)中問題)

95、RexTerrainEngineNode的遍歷過程詳解((三十三)中問題)

96、osgEarth::Drivers::RexTerrainEngine::TerrainCuller的apply過程詳解((三十三)中問題)

97、RexTerrainEngineNode的updateState過程詳解 設置了很多着色器變量((三十三)中問題)

98、什麼時候分配opengl資源((三十三)中問題)

99、TileNode釋放opengl資源過程releaseGLObjects詳解((三十三)中問題)

100、最近一次遍歷的幀號和時間是怎麼設置呢(在渲染遍歷裏),怎麼就不會再渲染遍歷該瓦片節點了((三十三)中問題)

101、osg::State和osg::StateSet的關係((三十四)中問題)

102、osgEarth::SpatialReference和osgEarth::Profile的關係((三十六)中問題)

103、osgEarth的Geographic、Geodetic、Geocentric和Project的關係((三十六)中問題)

104、TileNode繪製過程詳解((三十七)中問題)

105、如何控制父子TileNode節點的顯隱((三十七)中問題)

106、GeometryPool的createGeometry過程詳解((三十七)中問題)

107、TileNode如何從地圖中提取與其分辨率相適應的圖像數據((三十七)中問題)

108、如何定製橢球體並進行橢球體間座標轉換((四十五)中問題)

109、Horizon Cull是什麼意思((四十五)中問題)

110、osgEarth::Drivers::RexTerrainEngine::DrawState的作用((四十五)中問題)

111、osgEarth的線程分析((四十五)中問題)

112、從osgEarth到osg到Opengl((四十五)中問題)

113、osg::Program與osgEarth::VirtualProgram的關係((四十五)中問題)

114、rex引擎shader文件中的#pragma vp_entryPoint vp_location等含義((四十五)中問題)

115、rex引擎的着色器如何區分頂點和片段((四十五)中問題)

116、osg::Program是如何對着色器及其變量進行管理的((四十五)中問題)

117、osg的窗口是如何與opengl集成的((四十五)中問題)

118、osg是如何實現opengl的初始化的((四十五)中問題)

119、CGCS2000餘WGS84座標系的比較((四十六)中問題)

120、着色器代碼文件到着色器程序的過程((五十一)中問題)

121、osgEarth::VirtualProgram默認出現在哪些位置((五十一)中問題)

122、rex引擎默認的幾個着色器功能分析((五十一)中問題)

123、osgEarth::TileRasterizer功能詳解((五十二)中問題)

124、osgEarth::ImageLayer如何使用VirtualProgram((五十二)中問題)

125、osgEarth::ShaderFactory osgEarth::ShaderLoader關係((五十四)中問題)

126、osgEarth::URI和osgEarth::URIContext的作用((五十四)中問題)

127、RexTerrainEngineNode中_renderBindings的作用((五十四)中問題)

128、Rex引擎如何給shader文件中的uniform變量賦值((五十四)中問題)

129、osgEarth中多個着色器的源代碼的編譯鏈接過程((五十四)中問題)

130、osgEarth::ShaderFactory osgEarth::ShaderLoader關係((五十四)中問題)

131、TileNode與DrawTileCommand的關係((五十五)中問題)

132、如何提取出指定範圍的高程網格((五十五)中問題)

133、從earth文件加載高層圖層的過程((五十五)中問題)

134、TerrainTileModel與TileRenderModel的關係((五十五)中問題)

135、EngineContext的作用((五十五)中問題)

136、幾個uniformmap的關係((五十五)中問題)

137、DrawTileCommand中的採樣器((五十五)中問題)

138、TileNode中的_surface(SurfaceNode)作用是什麼((五十五)中問題)

139、stateset中的adduniform、setTextureAttribute等最後是如何反應到opengl上的((五十五)中問題)

140、狀態樹和渲染樹的關係((五十五)中問題)

141、TileRenderModel中的RenderingPass和RenderBindings((五十五)中問題)

142、高程瓦片的繪製過程((五十五)中問題)

143、如何從高程影像變成高程網格((七十一)中問題)

 

 

發佈了379 篇原創文章 · 獲贊 35 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章