OsgEarth是一个跨平台的库,可以使用版本号为2.6.2或更新版本的Cmake对其进行编译。
1.1、获取源码
三个方法可以获取osgearth源码:
Option1:使用GIT
osgEarth源码托管于GitHub,所以我们需要一个Git客户端。Windows下推荐TortoiseGit,SVN 小乌龟的 Git 版本。
评价:该有的功能基本都有了,还是不错的。 备注:
GitHub是一个为那些使用Git版本控制系统的项目提供基于互联网的存取服务的Git存取站点。它是由GItHub公司(先前被称作用Logical Awesome)的开发者Chris Wanstrath, PJ Hyett, 和 Tom Preston-Werner 使用Ruby on Rails写成的。 最新版本是 Version 2.0,osgearth_2.0_T2011-02-24。
Option2: 下载tarball
1
tarball是linux下最方便的打包工具,是以tar这个指令来打包与压缩的档案。下载页面: http://github.com/gwaldron/osgearth/downloads
Option3:使用版本控制SVN
在您的SVN客户端上键入:http://svn.github.com/gwaldron/osgearth.git
1.2、准备工作
osgEarth需要第三方支持库才能编译。
所需的依赖服务如下:
OpenSceneGraph 2.8或更新的
GDAL 1.6或更新的,Geospatial Data Abstraction Layer的缩写。是一个
在X/MIT许可协议下的开源栅格空间数据转换库
CURL- HTTP transfer library,是一个利用URL语法在命令行方式下工
作的文件传输工具。
可选依赖如下(没有他们,osgEarth可以运行,但将会失去一些功能): GEOS3.2.0或更高版本-C++拓展库,这个库是用来osgEarthFeatures模
块执行各种几何处理操作,如缓冲和交集 。如果您计划显示矢量/功能osgEarth数据,就需要这个依赖。
SQLite3.6或更高版本-嵌入式关系数据库引擎。是一款轻型的数据库,遵
守ACID的关联式数据库管理系统。
LibZIP-读取,创建和修改ZIP的C库。OsgEarth有一个实验性的压缩文
件需要用到这个库。
2
1.3、编译osgEarth
OsgEarth使用Cmake生成系统,版本可以说2.6.2或更新的。 备注:
对于可选依赖(像GEOS),您可以舍弃或者不选。
只要输入OSG_DIR值,在Cmake中生成,Cmake将会自动找到其他OSG
的文件夹。
保证“DYNAMIC_OSGEARTH”标识是“ON”的,建立osgEarth这种静态库还
没有在所有平台上都能顺利完成的。
有时Cmake可能无法运行osgversion,在大多数情况下,您可以放心的忽略
这个问题。
3
1.4、测试
在命令行输入:osgviewer sample.earth进行简单测试 Sample.earth
基本故障:
最普遍的问题是共享库的路径配置问题 路径应包括: OSG和osgEarth 库 其他osgEarth所依赖的工具
OSG的第三方支持(特别是zlib和libpng) 如果提示丢失CURL plugin:
由于在OSGCMake配置管理时,CURL是可选的。确定你启用并已经生成了CURL。
GDAL驱动无法正常工作
确定你的PATH包含了GDAL共享库
设置环境变量GDAL_DATA 指向包含了GDAL’s.csv文件的文件夹
4
2、建立地图
(即:如何用以.earth为后缀的 XML文件定义自己的地图)
osgEarth 使用一个基于XML的文件格式,被称为Earth File的文件来说明数据是怎样加载进OSG的。当您创建一个Earth File时,对可用的功能想详细了解,请参阅“Earth File 元素索引”。 Earth File的核心作用是指明以下3点:
你创建的地图类型(geocentric 或 projected) 可使用的图像、三面图elevation、矢量和模型数据 你的数据缓存在哪里
这是Earth File 文件库,包含大量Earth files并告诉你如何使用它们:https://github.com/gwaldron/osgearth/tree/master/tests/
5
2.1地图文件元素索引 2.1.1.简单图像文件
这是一个很简单的例子,从WMS服务器读取数据,并渲染在一个圆形地球的三维模型上。
这个文件建立了一个地图“MyMap”,geocentric类型,GeoTIFF图片源名称是“bluemarble”(GeoTiff是包含地理信息的一种Tiff格式的文件)。驱动driver属性告诉osgearth哪个驱动去加载这些图片,所有子元素针对特定的驱动。
2.1.2.多重图像层
osgEarth支持有多个图像源的地图。这允许你创建的地图时,在基础层上覆盖高分辨率的插图,当然了基础图层是一个较低分辨率的底图。要添加多个图像到Earth File,只需添加多个“image”元素到你的Earth file。
上述地图使用本地数据源(使用GDAL插件)提供的两个图像。osgEarth使用各种方法来渲染图像层,所以可以渲染多少图像层的取决于您的硬件。顺序是很重要的,定义多个图像源时,它们在该earth文件中指定的顺序是从在底部到顶部的。
7
2.2高程数据
添加高程数据到地球的文件与添加图像非常相似。高程数据可以通过将高程元素加入到XML从而添加到地球文件中去。
这个earth file有基础层image:bluemarble,以及一个从本地加载 的GEOTIFF文件作为高程网格。Earth 文件可以添加任意的高程数据,他们将通过osgEarth结合在一起 。图像,顺序是很重要的高程数据以及的 。例如,如果你有一个基地海拔的数据源,低分辨率覆盖整个世界和一个高分辨率的科罗拉多州丹佛市的插图,您将指定的基础数据的第一, 高分辨率数据。
多数驱动在osgEarth支持阅读heightfields以及图像。但是,重要的是要注意,只有16位和32位数据源可以作为heightfield数据源使用。
8
3、.Earth文件索引
Osgearth
此元素控制的方法,osgEarth使用复合图像层。 值: Auto 这种模式是默认的。osgEarth会自动选择一个基于图形硬件的构图方法。它将测试硬件的能力,以支持以下技术,在外观下面的顺序,第一个支持的技术和解决。 将每个图像层自身的纹理图像单元,GPU上的复合材料层。允许的图像层的最大数量是有限的纹理图像,通过你的GPU硬件支持的单位的数量。(注:现代GPU暴露更多的纹理图像时使用片段着色器,比他们在固定功能管线单位。) multitexture 复合材料在GPU上的图像层,使用Texture2DArray构造。这项技术有效地为您提供了无限的图像层。它需要的图形硬件支持 texture_array GL_TEXTURE_2D_ARRAY_EXT扩展和GL_EXT_gpu_shader4支持。 multipass 复合材料由多个渲染的图像,通过对场景图。这种技术对图像层,你可以有数量没有,但可能会影响性能,因为每个额外的层意味着另一个渲染传递的场景图。 10 示例: 11 4、Driver 4.1图像/高程图层驱动器 这些驱动程序生成那些构成地形的图片或者高程数据。 AGGLite ArcGIS GDAL OSG 将数据栅格化成若干图像片 从ESRI ArcGIS 地图服务系统或者网上ArcGIS服务读取图像数据 支持大量格式读取地理参考的影像和高程数据包括GeoTIFF 使用 OpenSceneGraph 图片reader/writers 来读取那些非地理参考的图像比如jpeg格式的图片 Composite 融合多层 TileCache Reads image tiles from a MetaCarta TileCache cache folder 从NASA WorldWind TileService库读取图像片 TileService TMS WCS WMS VPB 从OSGeo TileMapService库读取图像片 从OGC Web Coverage Service 读取图像片 从OGC Web Mapping Service 读取图像片 融合 VirtualPlanetBuilder地形 12 4.2模型驱动Model Drivers 模型驱动程序采集数据,并创建地形上可以放置的节点。这些可能是”褶皱”层,也可以是三维模型。 Feature Geometry OSG的几何渲染矢量数据 Feature Stencil Simple 使用模板缓冲技术褶皱化地形矢量数据 加载外部模型,并放置在场景图 4.2.1.Feature Geometry model driver 建立矢量特征数据的OSG几何形状 如今,这个驱动程序可以简单的将矢量数据嵌合进几何图形中,同时会有一个可选择的高度偏移(这样你可以将几何图形放置于地形上),将来它将支持足迹挤压,纹理化和其他一些功能。 结构 4.2.2.Feature Stencil model driver特征模板模型驱动 使用模板缓冲技术褶皱化地形矢量数据,技术根据:Schneider和Klein提出的方法《Efficient and Accurate Rendering of Vector Data on Virtual Landscapes》 结构 此驱动程序支持以下子元素 多边形需要用到”fill”这个css参数 2、 SLD/XML样式 SLD / XML是一个冗长的XML的样式特征数据的描述。这种支持是仍在开 18 发中。 造型方法:Styling Approaches 当您要为一个模型层做样式描述时,你可以 1)整个层用一种样式(一般方法)-> General styling 2)你可以将特征数据分解成很多“类”,然后单独描述-> Styling by feature class 相应举例: General styling 只要包含一个 注意 CSS标签”world”必须跟你所要styling的特征源名称相匹配。为什么这样做呢? 因为你还可以包含外部的.css文件,同时你还可以有其他的样式表。内 19 联.earth文件只是一个捷径。 Styling by feature class 如果特征源支持它(请看OGR driver),你可以将特征分解成多个目录,对于不同子特征单独进行样式描述,这是一个对矢量数据符号化的很好应用。 下面例子法语国家黄色表示,非法语国家红色表示: 20 备注: 键入回购样品feature_stencil_polygon_draping.earth,看到它在行动。 定义一个特征类,该特征类将一个数据集分解为基于过滤器查询的目录,不同风格不同归类。 用法 使用一个特征类去获取一个子集的特征 21 或者,您可以使用多种功能类,以不同的方式呈现不同的特性和功能。请参阅 开发人员备注 这个驱动程序使用OpenGL模板缓冲。如果你采用从代码使用该驱动,请保证为OSG viewer分配了有足够的模板位。 如果您正在使用osgviewer,你是否得到模板位因平台而异。您可以像这样强制分配: osgviewer --stencil file.earth 如果您采用从代码使用该驱动,请确保创建viewer之前,分配了足够的模板位: osg::DisplaySettings::instance()->setMinimumNumStencilBits( 8 ); ... osgViewer::Viewer viewer(args); 4.2.3 Simple 模型驱动 目前对于已加载的模型没有任何转换,也 没有地形夹紧,这些功能可能会在即将到来的“点模型替代”(point model substitution)驱动中实现。如果你想 23 使用这个驱动器,可以暂时使用OSG的.trans/.rot/.scale 结构 例子 24 4.3特征驱动Feature Drivers 特征驱动程序是用来读取原始的GIS矢量数据的。他们不直接创造可见的几何图形;显示矢量数据模型的驱动程序将使用功能的驱动程序读取矢量数据。 OGR 使用GDAL/OGR工具包从 Shapefiles 读取原始矢量功能数据,也支持其它大量的格式 OGR Fearth Driver 这个特征驱动使用GDAL/OGR矢量库来读取特征(矢量数据的属性) 用法: 数据源位置 optional optional 请参考 矢量数据格式 《OGR Vector Formats》列出的都是理论上支持的格式,一些格式是具有固定的’ one-layer” 像ESRI shapefile,因此不需要使用一个 25 它的要求从数据源call out一个 Ogr_driver指定使用哪一个 查询支持 OGR驱动支持在feature classes中使用SQL查询,对于大多数OGR格式,你可以使用 可以看 可以选择性的指定你的几何图形在.earth文件中的位置,像这样: POLYGON((-71.096 42.332, -71.096 42.386, -70.988 42.386, -70.988 42.332)) 内联WKT字符串必须符合这个规定的格式 http://en.wikipedia.org/wiki/Well-known_text#Geometric_objects 26 4.4缓存驱动Cache Drivers 缓存驱动器是用来为osgearth提供高速缓存实现的 tms 在硬盘上存储TMS层次结构文件的缓存切片 (默认) sqlite3 硬盘上的一个sqlite3数据库的缓存切片 4.4.1 TMS 用法 结构 相关网站:http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification 4.4.2 sqlite3 Sqlite3缓存驱动 用法 27 结构 Sqlite3数据库的安装路径 必选 数据库的近似最大值(单位MB) 设置为0:没有最大值(默认是:可100) 选 可选 Sqlite官网:http://www.sqlite.org/ 28 4.5地形引擎驱动Terrain Engine Drivers 提供一个渲染实现的地形皮肤(图片+高程数据) osgterrain 基于OSG的osgTerrain库地形渲染。(默认) 29 5、处理数据源 如果你想在osgearth中查看地理数据,你可以使用GDAL驱动程序。你一旦选择用GDAL,以下一些性能指南该遵守: Reproject your data重建数据(栅格空间数据转换) 如果你的数据没有必需的坐标系统,osgearth将重建数据。 有无正确坐标系统的重要性?举个例子,在大地测量中查看一个UTM图像(epsg:4326),如果你的数据已经在正确的坐标系统中,osgearth会运行得更快。 你可以使用任何可以的工具去重建数据比如GDAL,Global Mapper或者ArcGIS。 下面是使用gdal_warp重建大地测量中UTM图像的一个例子: gdalwarp -t_srs epsg:4326 my_utm_image.tif my_gd_image.tif 5.1 Build tile imagery建立平铺图像 典型的格式如GeoTiff以扫描线方式存储它们的像素数据,这种方式一般表现得很好,但是随着在osgearth中平铺方法(tiled approach)访问数据,你会发现使用一个平铺化的数据集将会更有效率,因为osgearth提取一个tile不需要从磁盘读取很大的数据。 使用gdal_translate建立一个瓦片化的GeoTiff: gdal_translate -of GTiff -co \"TILED=YES\" myfile.tif myfile_tiled.tif 30 Build overviews建立概述 添加概述(也可以叫金字塔或rsets)将极大的增加osgearth数据源的表现力。你可以使用gdaladdo这个实用工具向一个数据集添加概述: gdaladdo -r average myimage.tif 2 4 8 16 31 5.2生成平铺化的数据集 当在osgearth中直接使用地理空间数据成为可能,将数据预先平铺化成一个平铺优化层次的数据将会更加有效。 Osgearth 一个创建好的平铺化的数据源的最好方法是使用osgearth内置缓存机制。Osgearth创建的缓存是基于开放标准的,比如TMS.一旦它们被缓存,就可以直接作为一个数据源。举个例子,我们要平铺化一个NASA BlueMarble图片的GeoTiff文件 首先,建立一个bluemarble.earth地图文件(使用GDAL插件) 32 osgviewer bluemarble.earth 你会看到tile开始缓存到c:/osgearth_cache/bluemarble,我们可以使用osgearth_seed program让缓存进程自动化。 运行: osgearth_seed --max-level 7 bluemarble.earth 一旦编译,你将有一个完全缓存的TMS数据源,在目录c:/osgearth_cache/bluemarble。 现在,让我们删除原来需要的GeoTiff文件,直接访问TMS数据源,创建一个地图文件bluemarble_tms.earth 直接运行osgviewer将直接命中缓存,您可以自由移动的bluemarble数据源到你想要的任何地方,甚至一个网络服务器!你可以通过复制bluemarble 目录到你网络服务器上的一个公共文件夹实现调配tiles. 33 之后,你应该改变你的bluemarble_tms.earth文件: 现在运行osgviewer将命中你服务器上的tiles,为了完整,你也可以复制bluemarble_tms.earth 到你的网络服务器然后使用时从网上下载它: osgviewer http://www.myserver.com/maps/bluemarble_tms.earth 重要的是要注意,此过程不会只适用于您的源计算机上的地理空间数据。这是完全有可能使用此过程中,如WMS服务器,将数据缓存到本地缓存TMS! Maptiler MapTiler是一个小巧的GUI tile 生成器,最初是作为GDAL脚本gdal2tiles开发出来的。可以生成被osgearth目录使用的TMS tile子集。 重要注意点: MapTiler输出文件tilemapresource.xml中的 BoundingBox元素有x和y的反转,所以一旦tile生成完成,用记事本打开tilemapresource.xml,交换 34 minx/miny,maxx/maxy的值然后保存。 然后您应该能够创建一个新的[TileSourcePluginTMS TMS的图像源引用的tilemapresource.xml文件 TileCache TileCache是一个Python WMS-C 实现,可以容易发布缓存tile服务器,一旦你根据官网的指南安装了TileCache,你可以,你可以设置osgearth去访问作为一个WMS或者TMS服务器的TileCahce,当你浏览时TileCahe将缓存这些tiles。还有一个好处是,你可以使用TileCahce的“disk”缓存模式然后使用osgearth的TileCache驱动程序访问缓存文件目录。 35 6、Caching Osgearth 可以缓存源码程序tiles以提高性能。 一张图片或者heightfield已经创建以后,一般访问本地缓存比重新建立这个程序或者从网上下载来的更快。 地图中所有图层共享一个缓存对象,有多种缓存类型可以用在osgearth,但是所有缓存必须以如下的格式定义: 参数type:要建立的缓存类型。所有的属性及相应的值将被传递到缓存配置。 36 6.1一般注意事项 所有的基于磁盘的缓存使用图像和heightfield的名称来创建文件夹用来缓存。 请确保各个缓存路径使用图层名称是唯一的。 OsgEarth 使用OpenSceneGraph现有的插件来读写数据。确保你指定的缓存 格式对于读写有良好的支持。举个例子,OpenSceneGraph2.6.1中的tiff插件对于写16位和32位的数据集存在一些问题,所以它对于缓存hetghtfields是不合适的。DDS插件不支持16位和32位数据集写入磁盘。Tiff插件推荐使用OSG2.8或更高版本的OSG。 osgEarth 完全关闭缓存的运行,只要设置环境变量 OSGEARTH_CACHE_ONLY就可以了,或者使用属性 禁用某个层的缓存 Seeding the Cache 有时在某一特定领域,预先处理(pre-seed)你的缓存是很有用的。 osgEarth提供一个实用的应用程序,osgearth_seed去完成这项任务。Osgearth_seed采用(take)一个Earth file并填充你的缓存 osgearth_seed 用法: Command: osgearth_seed [options] filename Options: --bounds minx miny maxx, maxy The geospatial extents to seed. --min-level level The minimum level to seed down to. --max-level level The maximum level to seed down to. 37 -b Shorthand for --bounds. --cache-path Use a different cache path than the one defined in the earth file --cache-type Override the cache type if you override the cache path (tms or disk). 缓存类型 TMS(默认) 如果cache类型是tms那么osgearth缓存文件必须使用与“http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification”所规定的格式 Tms样式属性: Path-磁盘上缓存切片的路径 Format-缓存的格式(如png,jpg,dds等)。如果不指定格式将使用首选的图片或者heightfield源码,如果首选的格式也没有,那默认的格式是png Tms_type –如果tms_type的值是google,那么y tile index将反转变为0,0是左上角的tile 而不是左下角的tile. 38 Sqlite3 设置缓存类型是sqlite3,用sqlite数据库文件来存储你的缓存,全部的缓存仅仅是一个单独的文件,如果需要转移它将是非常容易的 属性: Path-数据库文件路径 例子 39 Tile Cache 如果缓存类型是tile cache,osgearth缓存文件到磁盘的格式是与Metacarta的“Disk”风格缓存想兼容的格式。这意味着:osgearth缓存的结果可以被那些客户端访问,这些客户端可以公开访问tileCache磁盘高速缓存如OpenLayers或者osgearth.这是很有意义的,当你在浏览和缓存tiles时,你实际上是在创建一张可以被其他客户端访问地图。所以假如没有缓存类型指定,可以考虑tileCache。 属性 Path-缓存tiles的磁盘路径 Format-缓存的格式(如png,jpg,dds等)。如果不指定格式将使用首选的图片或者heightfield源码,如果首选的格式也没有,那默认的格式是png 例子 40 41 7、Osgearth开发指南(版本2.x) Osgearth的一个主要目标是易于应用集成,实际上有2种方式去整合osgearth.a)你可以建立一个earth file,然后在你的应用程序中加载它.b)在您使用osgearth API的时候以编程方式动态建立一个地图。 标题: 地图 公共库 着色合成 建立自己的驱动 42 7.1地图 7.1.2加载一张地图 绝大多数osgearth的功能是包含在OpenSceneGraph插件里的,所以从earth file加载一张地图是很容易的,只要一行代码就可以了: osg::Node* globe = osgDB::readNodeFile(\"myglobe.earth\"); 你现在有一个可以被加载到你的场景图并可以显示的OpenSceneGraph节点了。这种加载地图的方法不是所有的应用程序必须做的。如果你的应用程序支持VirtualPlanetBuilder地形数据库,整合osgearth就可以做很少的工作,因为场景图形之间是极其相似的。两者都是基于osgTerrain和PagedLOD系统,都是以osg::CoordinateSystemNode修饰的。唯一的不同是一个osgearth数据库是动态生成的而不是预先生成的 7.1.3编程方式创建地图 Osgearth也提供一个API供您动态创建地图。如果您的应用程序允许在运行时从不同层中选择一个层显示,那么这种方式就显得很有用。 基本步骤: 建立一个地图对象 加入您认为合适的影像和高程地图 建立将渲染地图对象的地图节点 向场景加入你的地图节点 43 你可以在任何时候加入图层。但是,一旦向地图加入了一个图层,这张地图就有了选项的副本,你不能再改变它了。 #include #include using namespace osgEarth; using namespace osgEarth::Drivers; ... // Create a Map and set it to Geocentric to display a globe Map* map = new Map(); // Add an imagery layer (blue marble from a TMS source) { TMSOptions tms; tms.url() = \"http://labs.metacarta.com/wms-c/Basic.py/1.0.0/satellite/\"; ImageLayer* layer = new ImageLayer( \"NASA\ map->addImageLayer( layer ); } // Add an elevationlayer (SRTM from a local GeoTiff file) 44 { GDALOptions gdal; gdal.url() = \"c:/data/srtm.tif\"; ElevationLayer* layer = new ElevationLayer( \"SRTM\ map->addElevationLayer( layer ); } // Create a MapNode to render this map: MapNode* mapNode = new MapNode( map ); ... viewer->setSceneData( mapNode ); Working with a MapNode at runtime 不论这个地图是从earth file加载的还是运行时动态建立,地图在运行时是可以修正改良的。 如果地图是从Earth文件加载的,首先你必须获得地图节点的reference. Map::findMapNode方法: //Load the map osg::Node* loadedModel = osgDB::readNodeFile(\"mymap.earth\"); //Find the MapNode 45 osgEarth::MapNode* mapNode = MapNode::findMapNode( loadedModel ); 一旦获取了地图节点MapNode的reference,就可以加入图像或高程数据。 // Add an OpenStreetMap image source TMSOptions driverOpt; driverOpt.url() = \"http://tile.openstreetmap.org/\"; driverOpt.tmsType() = \"google\"; ImageLayerOptions layerOpt( \"OSM\ layerOpt.profile() = ProfileOptions( \"global-mercator\" ); ImageLayer* osmLayer = new ImageLayer( layerOpt ); mapNode->getMap()->addImageLayer( osmLayer ); 你也可以删除或者重新排列各图层 // Remove a layer from the map. All other layers are repositioned accordingly mapNode->getMap()->removeImageLayer( layer ); // Move a layer to position 1 in the image stack mapNode->getMap()->moveImageLayer( layer, 1 ); Working with Layers 地图包含ImageLayers和ElevationLayers.在运行时你可以修改一些属性。比 46 如,你可以切换一个图层的状态使它开或者关,还可以修改一个ImageLayers的透明度。 ImageLayer* layer; ... layer->setOpacity( 0.5 ); // makes the layer partially transparent 47 7.2公共库 Osgearth 提供一个公共的库叫osgEarthUtil ,它包含大量有用的类,在您的应用程序中可以使用。 Controls:一个简单,容易使用的2D UI工具包 EarthManipulator:一个完全可编程的osgGA::CameraManipulator EarthManipulator:一个可编程的面向地理地图可视化的OSG相机控制者, 它有许多功能: 自定义鼠标/键盘输入绑定,设置视角界限等等的API接口 保存和恢复通过纬度/经度或者其他空间坐标表示的观察点 Smooth fly-to-Viewpoint function that's smart about round-earth maps 对象绑定,自动与任何OSG节点绑定你的基准点 灵敏度控制 轻松获取关于地图的空间参考信息 ObjectPlacer-通过纬度/长度定位对象的实用工具 负责定位将OSG众节点放置于一个地形上这样一个共同任务: 将节点放置于纬度/经度坐标系上 在用户指定的LOD地形上进行可选性地形夹合操作 生成任何纬度/经度的布局矩阵 AutoClipPlaneHandler:调整基于地平线的剪裁平面 这是一个OSG::GUIEventHandler,能自动调节一个geocentric地图上剪裁平面的远近 当你选择使用geocentric地图时,你会发现这样一个问题,当你太靠近地面时,出现近剪裁不堪入目的画面,这是一个地形引擎如何剔除tiles造成的问题。 AutoClipPlaneHandler:通过自动调节从你的相机到水平面的距离进而解决这个难题。 48 AutoClipPlaneHandler的安装: osgViewer::Viewer viewer; ... viewer.addEventHandler( new AutoClipPlaneHandler() ); ObjectLocator:方便放置和移动实体的基类 49 7.3 Shader Composition Osgearth在它的一些渲染模式中使用GLSL(OpenGL Shading Language)着色器。默认情况下,osgearth将检查你的图形硬件能力,自动选择一种合适的模式。 由于osgearth依赖于着色器,同时作为开发者你也希望使用你自己的着色代码,osgearth提供了一个着色组成框架(osgearth shader composition),当你把你自己的着色器融合进osgearth时,这个框架表现出了强大的灵活性。 下面我们将介绍一些融合自己着色器到osgearth的方法。当然前提是你已经理解了osgearth 着色组成框架的基本原理。 Framework Basics Osgearth会安装默认的着色器,默认的着色器如下所示: 请注意以下功能类型: 内置功能:osgearth默认安装的功能(可以覆盖) 用户功能:“inject”到着色器之前或之后的内置插件的功能 // VERTEX SHADER: void main(void) { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; ... // \"LOCATION_PRE_VERTEX\" user functions are called here: pre_vertex_function_1(...); ... 50 // the built-in functions are called next: osgearth_vert_setupTexturing(); if ( lighting_enabled ) osgearth_vert_setupLighting(); // \"LOCATION_POST_VERTEX\" user functions are called last: post_vertex_function_1(...); } // FRAGMENT SHADER: void main(void) { vec4 color = vec4(1,1,1,1); ... // \"LOCATION_PRE_FRAGMENT\" user functions are called here: pre_fragment_function_1(color); ... // then the built-in osgEarth functions are called: osgearth_frag_applyTexturing(color); if (osgearth_lighting_enabled) osgearth_frag_applyLighting(color); 51 ... // \"LOCATION_POST_FRAGMENT\" user functions are called last: post_fragment_function_1(color); ... gl_FragColor = color; } Virtual Program Osgearth包含一个叫VirtualProgram的OSG状态属性,表示shader composition的运行状态。由于VirtualProgram是一个osg::StateAttribute,所以你可以附加在场景图形中的任何节点。你可以在osgearth中覆盖个人着色功能(In the way you can override individual shader functions in osgEarth)。下面的集成部分将演示如何使用Virtual Program: Integrating Custom Shaders集成自定义着色器 使用着色组成shader composition有2种方法: Injecting user functions用户函数 Sampling image layers采样图像层 52 Injecting user functions用户函数 在上述着色器核心代码中,你会发现一些“user functions”比如pre_fragment_function_1()等,它们不存在于osgearth 生成的默认着色器中,你作为开发者能够向内置着色器的不同位置添加”inject”相应的用户函数的代码。 举个例子: 用户自定义函数实现一个简单的“朦胧”效果(可在osgearth_shadercomp.cpp查看完整代码) static char s_hazeVertShader[] = \"varying vec3 v_pos; \\n\" \"void setup_haze() \\n\" \"{ \\n\" \" v_pos = vec3(gl_ModelViewMatrix * gl_Vertex); \\n\" \ static char s_hazeFragShader[] = \"varying vec3 v_pos; \\n\" \"void apply_haze(inout vec4 color) \\n\" \"{ \\n\" \" float dist = clamp( length(v_pos)/10000000.0, 0, 0.75 ); \\n\" \" color = mix(color, vec4(0.5, 0.5, 0.5, 1.0), dist); \\n\" \ osg::StateAttribute* 53 createHaze() { osgEarth::VirtualProgram* vp = new osgEarth::VirtualProgram(); vp->setFunction( \"setup_haze\osgEarth::ShaderComp::LOCATION_POST_VERTEX ); vp->setFunction( \"apply_haze\osgEarth::ShaderComp::LOCATION_POST_FRAGMENT ); return vp; } ... sceneGraph->getOrCreateStateSet()->setAttributeAndModes( createHaze() ); 函数”setup_haze”是核心顶点着色器调用内置顶点函数之后被调用 apply_haze是核心碎片着色器调用内置碎片函数之后被调用 插入点有以下4个: Location ShaderComp::LOCATION_PRE_VERTEX ShaderComp::LOCATION_POST_VERTEX Shader VERTEX VERTEX Signature void functionName(void) void functionName(void) ShaderComp::LOCATION_PRE_FRAGMENT FRAGMENT void functionName(inout vec4 color) ShaderComp::LOCATION_POST_FRAGMENT FRAGMENT void functionName(inout vec4 color) 正如你看到的,用户函数是向主着色器无缝的插入代码 使用自定义ShaderFactory (着色器工厂)覆盖osgearth的内置功能。Customizing 54 the Shader Factory 如果你想替换osgearth内置着色函数(比如osgearth_vert_setupLighting()等),你可以安装一个自定义ShaderFactory..ShaderFactory存储在osgearth注册表,包含建立内置函数的所有方法。你可以这样安装你自己的ShaderFactory: #include class CustomShaderFactory : public osgEarth::ShaderFactory { ... override desired methods here ... }; ... osgEarth::Registry::instance()->setShaderFactory( new CustomShaderFactory() ); 上述示例代码是替换osgearth内置照明着色器的代码。注意这一点,替换内置纹理函数不一定好使,因为osgearth的图像层组成机制是覆盖这些方法,自己执行图层渲染。 55 Sampling image layers采样图像层 如何从你的着色器访问地图的ImageLayers?由于osgearth内部自己管理各图像层,纹理单元以及组成,这不是简单的调用GLSL的texture2D()函数。下面告诉你如何去做。 使用接口TextureCompositor为你想查询的图层创建一个采样器方法,这样你可以从你的着色器访问这个方法。 举个简单的例子: // assume \"layer\" is the image layer you want to sample, and \"vp\" is a VirtualProgram state attribute: osgEarth::ImageLayer* layer; osgEarth::VirtualProgram* vp; // first get a reference to the texture compositor. osgEarth::TerrainEngine* engine = mapNode->getTerrainEngine(); osgEarth::TextureCompositor* comp = engine->getTextureCompositor(); // next, request a sampling shader for the layer in question. osg::Shader* sampler = comp->createSamplerFunction( layer, \"sampleMyLayer\ // add it to your VirtualProgram: vp->setShader( \"sampleMyLayer\ ... 之后在你的着色器代码中调用函数“SampleMyLayer“ 56 // FRAGMENT SHADER void sampleMyLayer(void); // declaration ... void someFunction() { ... vec4 texel = sampleMyLayer(); ... } 采样器函数会自动进行与当前的纹理坐标匹配的正确采样 系统格式System Uniforms 由于OpenSceneGraph系统格式是以”osg_”打头,osgearth则以“osgearth_”为前缀 各种uniforms: 布尔型bool osgearth_LightingEnabled-GL灯光是否可用 Bool[]osgearth_ImageLayerEnabled-图像层“n”是否可用 Float osgearth_CameraRange-相机位置与当前顶点的距离 57 8、Geospatial Data Sources地理空间数据源 8.1 Imagery 1. USGS(美国地质勘探局无缝服务器)-美国拥有大量的影像和高程数据的服 务器 2. JPL onEarth(喷气推进实验室)–JPL提供的采集WMS数据的服务器 3. NASA蓝色大理石-访问NASA蓝色大理石影像库 4. ICEDS-综合地球探测卫星委员会的欧洲数据服务器-包含大量图像层的WMS 服务器,特别是关于欧洲和非洲的 5. NRL GIDB OpenGIS Web Services(海军实验室GIDB 与OpenGIS Web服务器 6. Natural Earth自然地球-一个公共领域的地图数据集,比例尺有 1:10000000,1:50000000和1:110000000; 7. Virtual Terrain Project虚拟地形项目-全球图像库 8.2 高程数据Elevation data 1. CGIAR SRTM90m国际农业研究磋商小组的SRTM90m-全球90m高程数据集 2. SRTM 30 Plus地形-全球高程数据 包括海洋探测数据,google earth也是使用 这个高程数据 3. SRTM GLCF全球土地覆盖基金的SRTM数据,这里有一个漂亮的30弧秒的 数据 4. GEBCO (General Bathymetric Chart of theOceans)通用海底地形图 1.3功能数据Fearture data OpenStreeMap-全世界的街道和土地利用的数据(矢量和栅格化矢量数据) DIVA-GIS-免费下载全球矢量数据(DCW,VMAP等) 58 Natural Earth-一个公共领域的地图数据集,比例尺有1:10000000,1:50000000和1:110000000; 59
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务