
osgEarth的Rex引擎原理分析
文章平均质量分 75
对开源数字地球软件osgEarth的Rex地理信息引擎进行深入细致分析,一来作为学习总结,二来为研究osgEarth的同仁提供学习参考。
hankern
Code World,Cool Life
展开
-
osgEarth的Rex引擎原理分析(一二八)rex的引擎和图层投影及其关系
目标:(一二七)中问题214主要存在三个地方:一是map的type属性,可取两个值geocentric、projected,前者用于三维显示,后者用于二维显示;二是map的options属性的srs,可以取spherical-mercator world-mercator wgs84 plate-carre,用于设置显示的投影方式,可以根据显示需要随意设置;三是影像和高层图层属性的srs,可以取spherical-mercator world-mercator wgs84 plate-carre,用于设原创 2022-07-12 18:33:38 · 1361 阅读 · 2 评论 -
osgEarth的Rex引擎原理分析(一二七)rex影像层属性及其设置
目标:(一二六)中问题213osgEarthDrivers/earth/EarthFileSerializers2.cpp bool addLayer(const Config& conf, Map* map) { std::string name = conf.key(); Layer* layer = Layer::create(name, conf); if (layer) { .原创 2022-03-31 06:14:25 · 1084 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一二六)rex瓦片组织方式
目标:(一二五)中问题2121、初始第0级,横向2个,纵向1个,是硬编码在程序中的osgEarth/Registry.cppconst Profile*Registry::getGlobalGeodeticProfile() const{ if ( !_global_geodetic_profile.valid() ) { GDAL_SCOPED_LOCK; if ( !_global_geodetic_profile.vali.原创 2022-03-25 20:50:14 · 1195 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一二五)着色器源代码加工处理过程
目标:(一二四)中问题2111、添加默认着色器这类着色器源代码是内置在程序里的,不会经过osgEarth着色器框架的整合。osg/StateSet.cppstatic const char* gl3_VertexShader = { "#version " GLSL_VERSION_STR "\n" "// gl3_VertexShader\n" "#ifdef GL_ES\n" " precision highp float;\n"原创 2022-01-29 06:53:16 · 891 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一二四)osgEarth着色器文件与场景树节点的对应关系
目标:(一二三)中问题210场景树rex|terrain--------------------------------------------------------------------------ResourceReleaser|surface|Layer-------------------------------LayerN| |RenderLeaf...原创 2022-01-23 17:52:47 · 452 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一二二)着色器程序的opengl过程
目标:(一二一)中问题2081、创建着色器程序glCreateProgram2、创建着色器glCreateShader,如果有多个着色器(比如多个顶点、多个片段着色器,多个情况下只有一个有main函数),2-4三步需要执行多次3、上传着色器代码glShaderSource4、编译着色器glCompileShader以及判断Shader是否编译成功5、关联着色器和着色器程序glAttachShader,如果有多个着色器,这里需要执行多次6、链接着色器程序glLi..原创 2021-12-12 06:29:38 · 1114 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一二一)osgEarth::TileRasterizer功能详解
目标:(五十二)中的问题123本质是一个相机,用于将下面的节点渲染到纹理中。src\osgEarth\TileRasterizerclass OSGEARTH_EXPORT TileRasterizer : public osg::Camera{}rex引擎用到了该节点src\osgEarthDrivers\engine_rex\RexTerrainEngineNode.cppvoidRexTerrainEngineNode::setMap(const Map* map,.原创 2021-01-02 10:14:19 · 481 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一二零)如何显示瓦片编号
目标:(九十四)中的问题175效果如下:思路如下:绘制瓦片编号采用glsl着色器实现,由于glsl不能直接显示数字,这里将数字变为纹理图片,通过组合数字纹理图片,达到显示数字的目的。瓦片编号是0..9和/十一个符号组成的,纹理图片需要包含这些数字符号。步骤如下:1、生成数字、分隔符的纹理图片。 int imagePixelSize=256;//图片的像素大小,指宽度,每个瓦片的像素大小为256*256 int charactorNum=11;//图片中字符的.原创 2020-08-01 14:02:43 · 1362 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一一九)为什么rex的瓦片分级为21级,Google为23级
目标:(一一八)中的问题206原因可能有这么几条:1、实际使用的要求,rex21级的分辨率可达0.15m(osgEarth的Rex引擎原理分析(一零九)19级瓦片分辨率估算),基本上能满足一般的要求。2、有效数字精度的要求,对于瓦片编号而言,23级的最大瓦片编号为2^22,如果用float存放的话,这不超float能够存放的极限2^23-1(C++学习(一三九)float、double的有效数字),如果是24级瓦片编号2^23(8388608)则超出了float的极限,不能正确存下。..原创 2020-08-01 06:47:38 · 1231 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一一八)TileNode的_tileKeyValue作用
目标:(十八)中的问题56用于给着色器传递瓦片的编号x/y/z/range。1、创建瓦片时,设置此变量osgEarthDrivers/engine_rex/TileNode.cppvoidTileNode::create(const TileKey& key, TileNode* parent, EngineContext* context){ unsigned tw, th; _key.getProfile()->getNumTiles(_key.getL原创 2020-07-26 18:30:17 · 784 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一一七)无法加载部分tif文件的原因
目标:(一一六)中的问题204tif文件的坐标系与rex的坐标系不一致,导致转换失败。解决办法:缺少proj.dll,将此文件拷贝到gdal.dll文件所在路径即可。待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)11、rex地理信息引擎的四梁八柱((九)中问题)12、osgEarth::TerrainEngineNode中setMap方法作用((十二)中问题..原创 2020-07-19 07:39:44 · 1225 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一一六)地理数据坐标系分类
目标:(一一五)中的问题205地理数据的坐标系一般有两大类,一是地理坐标系(GCS),是经纬度单位的椭球坐标系;二是投影坐标系(PCS),是平面直角坐标系。投影坐标系(PCS)的定义一般会包含两方面的定义信息:(1)基准面/Datum — 与GCS相应(2)投影方法/Projection MethodPROJCS["WGS 84 / UTM zone 49N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,29.原创 2020-07-18 07:22:51 · 1311 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一一五)tif文件分辨率的计算
目标:(一一四)中的问题202maxX为右经度,minX为左经度maxY为上纬度,minY为下纬度 double resolutionX = (maxX - minX) / (double)_warpedDS->GetRasterXSize(); double resolutionY = (maxY - minY) / (double)_warpedDS->GetRasterYSize(); double maxRes原创 2020-07-17 22:05:17 · 911 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一一四)rex与mp引擎的关系
目标:(一一三)中的问题201rex与mp都是osgEarth加载地理高程和影像的引擎。rex比mp新,功能更强大。rex引擎支持随机瓦片加载、地图颜色渐变、更快的添加删除待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)11、rex地理信息引擎的四梁八柱((九)中问题)12、osgEarth::TerrainEngineNode中setMap方法作用((...原创 2020-07-11 07:01:38 · 2433 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(三十五)osgEarth地球椭球体ellipsoid 大地基准面datum 地图投影Projection详解
目标:(二十九)中的问题83地球椭球体的中心为地心,形状为椭球体大地基准面是适应某一区域的椭球体,球体中心不一定在地心地图投影是球面和平面映射关系的方法待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)11、rex地理信息...原创 2019-01-01 16:01:35 · 1340 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一一三)state获取着色器文件中有效define的过程
目标:(一零九)中的问题196状态机State在遍历每一个状态集StateSet时会记录其中的define到其_defineMap。如果shaderDefines(一般来自于着色器Shader或着色器程序Program)和_defineMap中属性为ON重合,则会形成一条有效的define。osg/State.cppstd::string State::getDefineString(const osg::ShaderDefines& shaderDefines){ ..原创 2020-05-16 07:52:01 · 538 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一一二)每帧会重复生成着色器程序吗
目标:(一一一)中的问题198一般是不会的,但是着色器程序状态改变的话还是会的。着色器程序的状态用其中的着色器向量来表示,如果着色器向量的长度和其中的内容没有变化,就认为着色器程序的状态没有变化。着色器程序在创建完成后,会放入缓存,下一个帧循环从缓存中取出使用即可,如果缓存中不存在才会再次生成着色器程序。这也说明可以在程序运行时动态地向着色器程序添加着色器代码。1、着色器程序写入缓存osgEarth/VirtualProgram.cppvoidVirtualProgram::apply原创 2020-05-16 07:19:57 · 579 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一一一)着色器上下文环境的准备过程
目标:(一一零)中的问题197osg/Shader.cppShader::PerContextShader* Shader::getPCS(osg::State& state) const{ if( getType() == UNDEFINED ) { OSG_WARN << "Shader type is UNDEFINED" << std::endl; return 0; } if (..原创 2020-05-15 07:01:00 · 606 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一一零)state中_defineMap构建过程
目标:(一零九)中的问题195是在绘制过程中,每经过一个状态集StateSet就会将该状态集中的模式、属性、一致变量、定义都放入State的相应变量中。定义都放入_defineMap.osg/State.cppvoid State::pushStateSet(const StateSet* dstate){ pushModeList(_modeMap,dstate->getModeList()); pushAttributeList(_attribu.原创 2020-05-13 06:49:52 · 389 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一零九)19级瓦片分辨率估算
目标:(一零八)中的问题194rex的瓦片分级为0、1、...、19第0级角度分辨率 180°第1级角度分辨率 180°/2...第19级角度分辨率 180°/2^19=0.00034332275390625°每个瓦片默认像素为256*256,则每个像素的角度分辨率为180°/2^19/256=0.0000013411045074462890625°,在赤道位置,地球半长轴简单取6400km,则每个像素的长度分辨率为:6400*(180°/2^19/256*3.14/18原创 2020-05-12 06:16:05 · 1551 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一零八)章节目录
目标:(一零七)中的问题1911、导论2、三棵树场景树、状态树、渲染树3、资源调度4、着色器5、设计模式6、实战应用待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)11、rex地理信息引擎的四梁八柱((九)中问题)12、osgEarth::TerrainEngineNode中setMap方法作用((十二)中问题...原创 2020-05-11 06:00:22 · 528 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一零七)rex的状态树和渲染树
目标:(一零六)中的问题1901、状态树rex|terrain----------|surface|layer|RenderLeaf2、渲染树Stage|bin|Layer待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)11、rex地理信息引擎的四梁八柱((九)中问题)12、osgEarth::TerrainEng...原创 2020-05-10 18:12:39 · 543 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一零六)术语定义
目标:(一零五)中的问题189VirtualProgram:虚拟着色器程序,之所以是虚拟的,是因为它是osgEarth用来组织着色器代码的,而不是GPU的,最终虚拟的着色器程序会转换为GPU使用的真正的着色器程序。使用虚拟着色器程序可以让用户更加专注于着色器程序的开发上,避免陷入与GPU交互的不必要的细节问题解决上。Morph:渐变或混合。主要用于高程和影像的均匀过度处理。...原创 2020-05-05 07:15:05 · 839 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一零五)如何将文字变为图片
目标:(一零四)中的问题187QSize size(200,200); //指定图片大小;QImage image(size,QImage::Format_ARGB32); //以ARGB32格式构造一个QImage,//image.fill(qRgba(0,0,0,100));//填充图片背景,120/250为透明度QPainter painter(&image...原创 2020-05-04 07:44:58 · 581 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一零四)rex如何在地球上绘制一张图片
目标:(一零三)中的问题186借鉴例子osgearth_annotation.cpp,这不是直接在瓦片上绘制的,因为它压住了瓦片上的边界线。应当是rex球渲染完成后在渲染的。和绘制一个几何图形,设置几何图形的问题没有什么区别。 osgEarth::Annotation::ImageOverlay* imageOverlay = 0L; osg::ref_ptr<osg...原创 2020-05-03 07:49:59 · 1214 阅读 · 1 评论 -
osgEarth的Rex引擎原理分析(一零三)着色器如何绘制文字
目标:(一零一)中的问题1841、利用着色器直接绘制文字是一种理想但不贴合实际的做法。文字是一个非常高深的问题。Opengl作为一个底层API已经不适合提供对应的接口。2、正确的做法是把文字生成纹理,再由glsl采样绘制为了避免文字模糊或有毛刺2.1采用矢量文字2.2绘制不同尺寸的文字待继续分析列表:9、earth文件中都有哪些options((九)中问题)...原创 2020-05-03 07:01:11 · 666 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一零二)如何判断瓦片的添加删除
目标:(一零零)中的问题1801、瓦片何时删除的事件是无法监听,貌似意义也不大2、瓦片的添加监听步骤如下:2.1瓦片在创建、有高程修改时会发出通知osgEarthDrivers/engine_rex/TileNode.cppvoidTileNode::create(const TileKey& key, TileNode* parent, EngineContext*...原创 2020-05-03 06:35:11 · 743 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一零一)TileNode::merge为什么只是不合并最后一个图层
目标:(一零零)中的问题181因为有些瓦片需要多个图层的数据共同来绘制。如下图。第一层图像数据是不全的,需要第二层的图像数据来填充。绘制时先绘制第二层,再绘制第一层,第一层中没有数据的位置像素点透明。待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)1...原创 2020-05-02 06:58:09 · 483 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(一零零)有影像和无影像的瓦片在一起如何保证无影像的瓦片被绘制
目标:(九十九)中的问题1791、TerrainCuller在遍历每个TileNode时,会将_firstTileDrawCommandForTile=02、在遍历TileNode下的SurfaceNode时,会创建绘制瓦片的指令DrawTileCommand2.1如果瓦片有影像,则生成有影像的绘制指令,并赋给_firstTileDrawCommandForTile。2.2如果瓦片...原创 2020-05-01 13:54:22 · 563 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(九十九)如何定义裸球颜色并在绘制时起作用
目标:(九十八)中的问题1781、在earth文件中定义,默认是白色<terrain driver="rex" color="#ffffffff" ></terrain>osgEarthDrivers/engine_rex/RexTerrainEngineOptionsRexTerrainEngineOptions( const ConfigOption...原创 2020-05-01 06:34:01 · 758 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(九十八)边界处瓦片颜色混合的实现
目标:(九十)中的问题172参看文章osgEarth的Rex引擎原理分析(九十五)地形变形(Terrain morphing)待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)11、rex地理信息引擎的四梁八柱((九)中问题)12、osgEarth::Terra...原创 2020-04-29 07:11:52 · 564 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(九十七)rex引擎如何绘制等高线
目标:(八十八)中的问题1701、思路:相同高程点用同样颜色着色。2、效果图:3、glsl代码:#version $GLSL_VERSION_STR$GLSL_DEFAULT_PRECISION_FLOAT#pragma vp_name REX Engine - Fragment#pragma vp_entryPoint lzy_last_frag#pr...原创 2020-04-29 06:54:58 · 1228 阅读 · 1 评论 -
osgEarth的Rex引擎原理分析(九十六)RenderingPasses和RenderBindings
目标:(九十五)中的问题177RenderBindings用于声明rex引擎要渲染哪些种类的图层信息,比如影像、父影像、高程、法线等,只指定绑定类别,对每一个绑定类别都会设置其对应的采样器、偏移矩阵、纹理单元号,在rex的setupRenderBindings中有详细描述。RenderingPasses用于声明rex实际有哪些图层要渲染,这里的图层中,同一类型的可能有多个,比如多个影像层、...原创 2020-04-25 19:39:51 · 656 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(九十五)地形变形(Terrain morphing)
目标:(十二)中的问题14先看两张图,左图是使用了Image morphing,右图没有使用。morph的作用是使视域边界处的瓦片颜色和高程均匀变化。Image morphing控制颜色,Terrain morphing控制高程。1、实现原理2、如何控制待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文...原创 2020-04-25 17:42:55 · 1862 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(九十四)rex引擎如何显示瓦片的边界
目标:(八十八)中的问题171效果图如下:思路:在文章(osgEarth的Rex引擎原理分析(九十一)晕眩图的制作与实现)的基础上,判断纹理坐标的范围,在边界处用特殊颜色即可。着色器代码如下:if(oe_layer_tilec.s<0.01 || oe_layer_tilec.s>0.99 || oe_layer_tilec.t<0.01 || oe_lay...原创 2020-04-25 08:04:29 · 774 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(九十三)rex在渲染时会不会纹理单元内容频繁更改
目标:(九十一)中的问题173答案:会的,这是rex引擎启动后cpu、gpu占用率高德一个原因。1、每一个图层(影响层、高层)在绘制时会往显存上传数据osgEarthDrivers/engine_rex/LayerDrawable.cppvoidLayerDrawable::drawImplementation(osg::RenderInfo& ri) const{ ...原创 2020-04-25 06:44:22 · 702 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(九十二)rex自带的着色器代码会硬编码进动态库吗
目标:(九十一)中的问题175思路是将着色器文件的源码都放入一个cpp文件的变量中,再编译链接,就将着色器文件写死在动态库中了。秘密在rex引擎目录下的文件Shaders.cpp.in(最终该模板变成AutoGenShaders.cpp)// ***DO NOT EDIT THIS FILE - IT IS AUTOMATICALLY GENERATED BY CMAKE***#...原创 2020-04-24 21:50:42 · 654 阅读 · 1 评论 -
osgEarth的Rex引擎原理分析(四十九)rex引擎的着色器如何区分顶点和片段
目标:(四十五)中的问题115osgEarth组织着色器是有一套流程的,这套流程可以让用户很方便地添加自定义的着色器函数:1、在构建场景图阶段,加载着色器文件,这些文件只包含不同管线阶段的处理函数,并没有main函数,从文件中#pragma vp_location可以解析出来是顶点或者片段着色器,比如vertex_model、vertex_view、vertex_clip对应顶点着色器中的...原创 2019-02-21 06:44:56 · 1103 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(九十一)晕眩图的制作与实现
目标:(七十八)中的问题152思路是:不同的高程采用不同的颜色进行着色,需要对rex引擎现有的片段着色器进行修改。默认的片段着色器是这样的(见osgEarth的Rex引擎原理分析(五十四)rex引擎默认的几个着色器功能分析):#version 330 compatibility #pragma vp_name VP Fragment Shader Main#extension GL...原创 2020-04-19 18:43:23 · 1502 阅读 · 5 评论 -
osgEarth的Rex引擎原理分析(九十)如何设置高度单位(m、km等)
目标:(八十二)中的问题160默认的单位是m,如果要修改为其它单位,需要直接修改profile文件,或者设置缩放比例 <profile srs="+proj=merc +a=6378137 +b=6356752.3142 +lat_ts=0.0 +lon_0=0.0 +x_0=0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +n...原创 2020-04-19 12:15:34 · 769 阅读 · 2 评论