osgearth
文章平均质量分 64
hankern
Code World,Cool Life
展开
-
osgEarth的Rex引擎原理分析(八十二)rex引擎创建图层的过程
目标:(八十一)中的问题159以高程层为例进行说明,在earth文件中高程是这样配置的:<elevation name="googleterrain" driver="xyz"> <url>http://mt0.google.cn/vt/lyrs=t&scale=2&hl=zh-CN&gl=cn&am...原创 2020-03-20 07:30:06 · 855 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(八十一)获取的高程图像为什么除了设置纹理还要设置栅格
目标:(八十)中的问题158在加载高程图像后,除了设置渲染纹理外还设置了高程栅格,如下:osgEarthDrivers/engine_rex/TileNode.cppvoidTileNode::merge(const TerrainTileModel* model, const RenderBindings& bindings){ // Elevation: ...原创 2020-03-14 06:51:12 · 609 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(七十八)TileNodeRegistry和LayerDrawable中_tiles的关系
目标:(七十二)中的问题150TileNodeRegistry中的_tiles本质是随机快速访问的结构体,主要用于管理rex引擎中活跃的瓦片,对于处于休眠的瓦片会进行标记,达到一定数量后,通过rex的卸载器进行卸载。osgEarthDrivers/engine_rex/TileNodeRegistrytypedef RandomAccessTileMap TileNodeMap;Ti...原创 2020-02-15 14:15:35 · 442 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(七十七)rex引擎中绘制瓦片的调度过程原理
目标:(七十二)中的问题151主要是分析瓦片什么时候进入场景树,什么时候从场景树中移出1、初始化osgEarthDrivers/engine_rex/RexTerrainEngineNode.cppvoidRexTerrainEngineNode::dirtyTerrain(){ // Build the first level of the terrain. ...原创 2020-02-15 13:40:20 · 800 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(七十五)rex的瓦片高程影像和高程文件中的影像尺寸如何对应
目标:(七十二)中的问题145高程层默认的尺寸大小为256*256osgEarth/TerrainLayer.cppvoidTerrainLayerOptions::setDefaults(){ _exactCropping.init( false ); _reprojectedTileSize.init( 256 ); _minLevel.init(...原创 2020-02-11 11:21:35 · 767 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(七十四)osgEarth::TerrainLayerOptions高程层选项中参数的含义
目标:(七十二)中的问题143主要用来说明高程、影像层的参数。osgEarth::TerrainLayerOptions高程层选项中参数的含义_tileSize(256):高程瓦片的默认大小_maxDataLevel(99):_minLevel(0):最小的LOD级别_maxLevel(23):最大的LOD级别待继续分析列表:9、earth文...原创 2020-02-11 10:51:37 · 678 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(七十三)从高程文件读取的高程信息如何填充rex的高程瓦片
目标:(七十二)中的问题147高程文件的划分规则和rex瓦片是不一样的,高程文件的0级就是文件本身,不管文件实际范围多大,然后采用二分法逐级增加。rex瓦片的0级对应整个地球表面。两个范围一般不是一一对应的,秘密尽在1、首先根据rex瓦片的范围从高程文件中找出相交的高程文件瓦片(该瓦片不同于rex瓦片,是和高程文件对应的瓦片,瓦片尺寸和rex瓦片最为接近)2、从相交的高程文件瓦片构...原创 2020-02-11 10:20:40 · 988 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(七十二)如何从高程影像变成高程网格
目标:(七十一)中的问题143有两种方法:1、对高程影像进行采样,用采样值来设置高程,通过CPU实现2、通过着色器来实现,在GPU上进行操作待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)...原创 2020-02-08 07:54:14 · 742 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五十八)osgEarth::ShaderFactory osgEarth::ShaderLoader关系
目标:(五十四)中的问题130osgEarth::ShaderFactory osgEarth::ShaderLoader关系ShaderFactory主要用来产生各个着色器阶段的main函数,一般用户不需要直接使用它,除非有特殊的定制需要。用户只需要创建和使用VirtualProgram就可以了。ShaderFactory对象存放在osgEarth的注册表中。ShaderLoader...原创 2020-02-05 17:34:33 · 551 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五十七)osgEarth中多个着色器的源代码的编译链接过程
目标:(五十四)中的问题129osgEarth中多个着色器的源代码的编译链接过程1、先一个一个编译void Shader::PerContextShader::compileShader(osg::State& state){ _extensions->glShaderSource( _glShaderHandle, 1, &sourceText,...原创 2020-02-05 17:32:22 · 491 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(七十一)高程瓦片的绘制过程
目标:(五十五)中的问题1421、在RexTerrainEngineNode遍历时生成renderleaf,其中的drawable为LayerDrawable(其对应earth文件中每一个高程、影像层)。在TerrainCuller进行遍历时,会对LayerDrawable添加实际瓦片对应的高程影像纹理,这样绘制出来就能看到高程影像效果了。osgEarthDrivers/engine_r...原创 2020-02-06 09:53:16 · 751 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(七十)TileRenderModel中的RenderingPass和RenderBindings
目标:(五十五)中的问题141TileRenderModel中的RenderingPass和RenderBindingsRenderingPass渲染通道主要存放Samplers采样器列表,采样器存放的是用来渲染影像、高程的纹理和矩阵RenderBindings渲染绑定用来存放SamplerBinding采样器绑定,每个采样器绑定记录采样器的名字(对应glsl文件中的uniform变量...原创 2020-02-06 09:41:12 · 336 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(六十九)状态树和渲染树的关系
目标:(五十五)中的问题140状态树和渲染树的建立是在CullVisitor中完成的。状态树你可以看成是一个二叉树,非叶子节点StateGraph和叶子节点ReaderLeaf组成,然后一个ReaderLeaf你可以看成有一个Drawable对象,但是场景渲染的是渲染树,状态树只是为了好转换成渲染树而存在的。 渲染树你也可以看成一棵二叉树,RenderStage(渲染台)是根节点,Rende...原创 2020-02-06 09:38:09 · 393 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(六十八)stateset中的adduniform、setTextureAttribute等最后是如何反应到opengl上的
目标:(五十五)中的问题139秘密在于(真正是在渲染时做的)osgUtil/RenderLeaf.cppvoid RenderLeaf::render(osg::RenderInfo& renderInfo,RenderLeaf* previous){ state.apply(rg->getStateSet()); state.apply(_parent...原创 2020-02-06 09:35:44 · 462 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(六十七)TileNode中的_surface(SurfaceNode)作用是什么
目标:(五十五)中的问题138每个瓦片TileNode都有一个_surface(SurfaceNode),这里面会存放瓦片的几何信息_drawable(TileDrawable),这个几何信息会传给DrawTileCommand,用于绘制该瓦片。osgEarthDrivers/engine_rex/TileNodeclass TileNode : public osg::Group,...原创 2020-02-06 09:29:34 · 403 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(六十六)DrawTileCommand中的采样器
目标:(五十五)中的问题137DrawTileCommand中的颜色采样器_colorSamplers和共享采样器_sharedSamplers的区别,能不能用一个。RenderBindings将采样器分为6个,前2个是颜色采样器,后4个是共享采样器。osgEarthDrivers/engine_rex/RenderBindingsenum Usage{ COLOR ...原创 2020-02-05 20:48:37 · 261 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(六十五)几个uniformmap的关系
目标:(五十五)中的问题136program中uniformmap(_uniformInfoMap)和stateset中的uniformlist(_uniformList)的关系以及state中的uniformmap(_uniformMap)1、program中uniformmap(_uniformInfoMap)在执行link的时候构造的,主要从shader文件中来,渲染遍历阶段...原创 2020-02-05 20:27:50 · 593 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(六十四)EngineContext的作用
目标:(五十五)中的问题135EngineContext的作用,主要是用来记录RexTerrainEngineNode方方面面的信息的。在rex引擎构建时,创建该上下文,并将引擎的四梁八柱信息都存放在该上下文环境中。osgEarthDrivers/engine_rex/RexTerrainEngineNodeclass RexTerrainEngineNode : public T...原创 2020-02-05 20:20:47 · 455 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(六十三)TerrainTileModel与TileRenderModel的关系
目标:(五十五)中的问题134TileRenderModel主要记录渲染各个瓦片的通道,一个通道对应一个可视化层(颜色、高层、法线等),每个瓦片TileNode都包含一个TileRenderModel。TileRenderModel在每个瓦片创建(有父TileNode情况下)/merge时进行构造每个LoadTileData请求中都包含一个TerrainTileModel。每个Ter...原创 2020-02-05 20:04:11 · 437 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(六十二)从earth文件加载高层图层的过程
目标:(五十五)中的问题133从earth文件加载高层图层的过程待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)11、rex地理信息引擎的四梁八柱((九)中问题)12、osgEarth::TerrainEngineNode中setMap方法作用((十二)中...原创 2020-02-05 20:01:07 · 467 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(六十一)如何提取出指定范围的高程网格
目标:(五十五)中的问题132如果从dem/img等文件中提取出指定范围的高程网格,需要用到gdal库进行读取。遥感影像一般包含至少一个波段,波段对应波长,比如红、绿、蓝等,也包含透明度。osgEarthDrivers/gdal/ReaderWriterGDAL.cpposg::HeightField* createHeightField( const TileKey&...原创 2020-02-05 19:57:04 · 991 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(六十)TileNode与DrawTileCommand的关系
目标:(五十五)中的问题131TileNode与DrawTileCommand的关系DrawTileCommad的几何图形和瓦片编号从TileNode来,最终绘制是用DrawTileCommand的draw函数来实现的,DrawTileCommand还包含影像和高程纹理。TileNode参与场景图的构建工作。rex引擎的的裁剪(TerrainCuller)和osg的裁剪(CullVis...原创 2020-02-05 18:06:16 · 270 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五十九)rex引擎如何将瓦片构造成地球形状
目标:(二十五)中的问题79秘密就在于convertLocalToModel函数,它会根据不同的投影方式生成瓦片的顶点osgTerrain/Locator.cppbool Locator::convertLocalToModel(const osg::Vec3d& local, osg::Vec3d& world) const{ switch(_coord...原创 2020-02-05 17:47:10 · 448 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五)osgDB::Registry和osgEarth::Registry的关系
都是程序中的唯一实例,通过instance方法保证唯一性。osgDB::Resigstry主要用于存放文件的读写器。osgEarth::Registry主要用于存放地球相关的全局参数信息。 待继续分析列表:1、osg是如何根据文件扩展名寻找需要加载的动态链接库插件的((一)中问题)2、加载动态库插件的过程是什么((一)中问题)3、osgDB::Registry的作用是什...原创 2018-11-10 21:52:47 · 744 阅读 · 0 评论 -
osgEarth对Shaders.cpp.in的处理
为什么要使用Shaders.cpp.in(还有MPShaders.cpp.in SimpleSkyShaders.cpp.in SplatShaders.cpp.in DetailShaders.cpp.in)?主要是为了实现shader的单独成文件,不用硬编码到cpp文件中。借助CMake对Shaders.cpp.in进行处理,重新生成cpp文件,从而将shader文件编码到这个新cpp中...原创 2019-01-27 16:59:38 · 659 阅读 · 2 评论 -
osgEarth使用对数深度缓存
使用对数深度缓存可以在一定程度上解决z冲突(Z-Fighting),osgEarth也支持使用对数深度缓存,方法是: if ( useLogDepth ) { OE_INFO << LC << "Activating logarithmic depth buffer (vertex-only) on main camera" <&l...原创 2019-01-22 06:03:09 · 2457 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(四十三)osgEarth的Geographic、Geodetic、Geocentric和Project的关系
目标:(三十六)中的103Geographic采用经纬高,高度是平均海平面高(需要有垂直水准面辅助)Geodetic采用经纬高,高度是相对椭球体的法线高ECEF(也即Geocentric)采用地心直角坐标系XYZProject采用投影坐标系 osgEarth/SpatialReference class OSGEARTH_EXPORT SpatialRefere...原创 2019-01-13 16:25:33 · 1760 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(四十二)osgEarth::SpatialReference和osgEarth::Profile的关系
目标:(三十六)中的问题102osgEarth::Profile关注空间范围、初始LOD数目等信息。GeoExtent中有SpatialReference信息,因此通过Profile能获取到SpatialReference信息。每一个高程、影像层都有自己的Profile。osgEarth/Profile class OSGEARTH_EXPORT Profile : public...原创 2019-01-13 16:00:32 · 1478 阅读 · 1 评论 -
osgEarth的Rex引擎原理分析(四十一)osg::State和osg::StateSet的关系
目标:(三十四)中的101osg::State是osg封装的opengl状态机,是全局的。osg状态机会在各个StateSet中切换,以完成图形的绘制。osg/State/** Encapsulates the current applied OpenGL modes, attributes and vertex arrays settings, * implements lazy...原创 2019-01-13 07:25:44 · 1004 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(三十七)osgEarth如何对投影坐标系和大地坐标系进行显示处理的
目标:(二十九)中的问题87osgEarth如何对投影坐标系和大地坐标系进行显示处理的为什么一个能显示成球,一个显示成平面<map name="MBTiles" type="geocentric" version="2"> <options> <profile>epsg:4326</profile>原创 2019-01-01 16:05:19 · 2484 阅读 · 2 评论 -
osgEarth的Rex引擎原理分析(三十六)为什么要删除设置过的垂直水准面
目标:(二十九)中的问题86椭球体 水平面 应该不是删除,而是信息创建出一个没有垂直水准面的Profile 待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)11、rex地理信息引擎的四梁八柱((九)中问题)12、osgEarth::Terra...原创 2019-01-01 16:03:25 · 371 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(三十四)资源释放器子节点的作用
目标:(十二)中的问题19资源释放器器子节点在rex引擎的setMap中创建,用于释放过期对象的opengl资源osgEarthDrivers/engine_rex/RexTerrainEngineNode.cppvoidRexTerrainEngineNode::setMap(const Map* map, const TerrainOptions& options){...原创 2019-01-01 15:59:37 · 837 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(四十四)如何控制父子TileNode节点的显隐
目标:(三十七)中的105rex渲染出的地球是靠一块块TileNode瓦片拼接起来的,瓦片之间存在父子关系,一般显示父TileNode就不应显示子TileNode,反之亦然。那么rex是如何做这种显隐控制呢?1、每一个TileNode瓦片在遍历时,会根据是否有子节点及子节点的准备情况来决定是否遍历其_surface(负责具体的显示内容)。osgEarthDrivers/engine_...原创 2019-02-16 07:06:14 · 580 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五十)rex引擎shader文件中的#pragma vp_entryPoint vp_location等含义
目标:(四十五)中的问题114#pragma vp_entryPointvp_location指示该shader是顶点shader还是片段shader,以及在相应着色器中的位置。比如"vertex_model"表示在顶点着色器的模型处理阶段,"vertex_view"表示在顶点着色器的视图处理阶段,"vertex_clip"表示在顶点着色器的裁剪/投影处理阶段;"tess_contr...原创 2019-02-21 22:08:31 · 976 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(四十六)如何定制椭球体并进行椭球体间坐标转换
目标:目标:(四十五)中的108可以用于CGCS2000和WGS84的坐标转换osg::EllipsoidModel默认创建wgs84椭球体将CGCS2000和WGS84的经纬高坐标分别转换为XYZ,然后比较其差值osg/CoordinateSystemNodeclass EllipsoidModel : public Object{inline void conve...原创 2019-02-16 18:29:27 · 910 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五十五)Rex引擎如何给shader文件中的uniform变量赋值
目标:(五十四)中的问题128有几个地方RexEngine.SDK.vert.glsl中的uniform sampler2D oe_tile_elevationTex;osgEarthDrivers/engine_rex/RexTerrainEngineNode.cppvoidRexTerrainEngineNode::setupRenderBindings(){ ...原创 2019-07-25 23:59:08 · 512 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五十二)osgEarth::VirtualProgram默认出现在哪些位置
目标:(五十一)中的问题121默认出现在五个地方:1、osgEarth::Drivers::RexTerrainEngine::RexTerrainEngineNode节点会设置VirtualProgram,该vp是抽象的,也就是能够被继承使用,在自身节点的渲染中不会起作用osgEarthDrivers/engine_rex/RexTerrainEngineNode.cppRexT...原创 2019-07-11 22:56:41 · 766 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五十四)rex引擎默认的几个着色器功能分析
目标:(五十一)中的问题1221、顶点着色器函数(1)RexEngine.SDK.vert.glsl这个着色器文件中的函数会加载到各个阶段的着色器程序中。主要用在osgEarth::Drivers::RexTerrainEngine::RexTerrainEngineNode节点中。所有地形渲染都可以使用此着色器中的函数。从纹理坐标获取高程值,用r值作为高程值。这个着色器中的函数会...原创 2019-07-12 21:36:06 · 886 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五十二)CGCS2000与WGS84坐标系的比较
目标:(四十六)中的119文章《2000中国大地坐标系及其与WGS84的比较》对此有详细的比较https://max.book118.com/html/2017/0614/114928909.shtm结论是:实现上相容的(仅在扁率上有微小差异);精度上是一致的。...原创 2019-05-25 20:33:15 · 1036 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(四十八)osgEarth::Drivers::RexTerrainEngine::DrawState的作用
目标:(四十五)中的110每帧都会创建一个DrawState创建在TerrainRenderData::setup(这里存在内存泄漏的问题,因为只有new没有delete,不存在的,_drawState是智能指针,超出范围时会自动销毁,也就是在TerrainRenderData销毁时销毁)osgEarthDrivers/engine_rex/TerrainRenderData....原创 2019-02-17 12:56:00 · 598 阅读 · 0 评论