unity3d WorldComposer1 卫星地图生成地形

时间:2021-09-01 09:13:05

http://blog.csdn.net/myarrow/article/details/42709113

1. 简介

1.1 TerrainComposer(TC)

一个Unity扩展工具,可用于创建AAA质量的Unity地形。

1.2 WorldComposer

是Unity3d扩展工具,可从现实世界中提取数据。它可以单独运行或作为TerrainComposer的扩展。

WorldComposer有一个独一无二阴影删除工具。卫星图像(它使用Microsoft卫星地图,因为Google卫星地图有Logo,而它没有)总是有阴影的,如果在游戏或模拟器中直接使用卫星图像,为配合此阴影,需要把太阳放在一个固定的位置。WorldComposer的阴影删除算法使效果看起来更好,且允许有白天和黑夜周期。

WorldComposer像Google地图一样提供滚动和缩放功能,你可以创建多个区域,每个区域显示真实世界的几公里。卫星图像可以导出到缩放级别19,每个像素的分辨率为0.3米。海拔数据可以导出到缩放级别14,这是每个像素的分辨率10米。
          WorldComposer仅输出海拔高度图(elevation heightmaps)卫星图像(satellite images),使用它就可以创建看起来像真实世界的地形。
          当于TerrainComposer组合使用时,可混合/修改高度图,或增加perlin噪点以增强细节,如把卫星图像与图片纹理进行混合,增加云的阴影等等。还可在上面放置树、草和对象,以进行无限制的调整和编辑。

1.3 RTP Relief Terrain Pack

主要是搭配Terrain Composer用来设置地形的材质 ( 是Unity中最好的Terrain Shader)

1.4 Ufs Flight Simulation Engine Forum

则是用来模拟空战游戏或是飞航效果。

2. 基本概念

2.1 Heightmap(高度图)

通常Heightmap高度图储存成Gray Scale Image也就是常说灰度图。越白该点就越高,纯黑表示最低点,纯点表示最高点。8位灰度图有256阶。16位灰度图有65536阶。如果依然精度不够用的话(例如绘制大型场景),那么可以使用标准的RGB位图来储存高度图,那么精度就是256的3次方=16777216阶。同理还可以再升为RGBA。 
      Heightmap可以用3D软件(Unity的地形也可以)来绘制,或者用Photoshop来绘制

高度图主要用在3个地方。

(1) 地形  Terrain

(2) 凹凸纹理 Bump Map

(3) 置换贴图 Displacement mapping

Unity3d自带地形编辑器,可以绘制地形。地形的起伏即高度信息可以用高度图(Heightmap)储存。 既可以导入raw后缀的HeightMap生成地形,也可以在Unity3d里绘制好地形导出raw后缀的Heightmap。HeightMap比起用3D地形模型节省很多储存空间。

2.2 烘焙(bake)

把物体模型放进场景之后, 引擎会计算光线,光线照到你的物体的表面形成反射和阴影。 如果不烘焙, 游戏运行的时候,这些反射和阴影都是由GPU和CPU实时进行计算。在执行烘焙之后,这些反射和阴影都记录到模型里了,变成了新的贴图,运行的时候,GPU和CPU不需要进行对环境光效果进行实时运算了。

2.3 着色器(Shader)

Shader是运行在GPU上的一段程序。

可以让程序员去通过编写代码去参与到GPU渲染图形的具体流程中去,去制作一些精美的特效和动画甚至是让模型发生奇怪的形变;简单点就是可以把它理解成一种对呈现到屏幕上画面的一种美化工具。

  编写Shader目前比较知名的是基于DirectX的HLSL和基于OpenGL的GLSL,而我们Unity用的ShaderLab是基于Nvida和Microsoft一同开发的CG(C for Graphic)语言,从名字上我们就能知道,只是一门类C的语言,如果你接触过C语言或者C++,甚至是JAVA,C#那对他的基本语法一定不会陌生。CG语言他是跨平台的,他可以基于OpenGL也可以DirectX来运行,也就是说他是工作在DX和OpenGL上层的抽象语言,这三种语言在某些具体方面可能有性能和扩展性上的区别,但是对于背后的实质技术并无过大区别。

  Unity3D使用的并不是完全的CG语言,从官方的API可知Shader分为三大类:

1)Fixed function shader(固定渲染管线 Shader):

现在已经很少使用,一般用来做默认处理,以一种固定的模式去处理渲染流程,但是他完全使用ShaderLab语法让你很简单的去修改一些参数,功能有限,很多Unity内置的默认效果用的是这个Shader。

2)Surface Shader (表面Shader):

这个Shader是Unity官方文档里用的最多的了,而且在国外很多的UnityShader学习教材里也很多用它来举例子,这个Shader其实和第三种已经很像了,只是不需要自己来写所有的片段着色器代码,Unity给你自带了很多封装好的,如果你想要自己写也可以,它与第三种最大的区别在于它的光照模型不能确定到底是外面哪个光源。另外在Surface Shader中的同一个SubShader中不可以使用多个Pass。

3)Vertex and Fragment Shader(顶点和片断Shader):  这类Shader很好很强大,顶点着色器和片段着色器完全由我们自己来控制,这样子我们就能最大化使用我们掌握的东西,当然这类Shader也是最需要时间学习的。

在一个shader中我们主要通过两个部分来参与渲染,顶点着色器(Vertex)和片段着色器(Fragment),他们两个参与的时机不同,VertexShader是在顶点变换的时候,而FragmentShader是在光栅化到将最终计算完成的像素值写入帧缓冲区。在VertexShader中我们可以对模型顶点实施一些坐标转换甚至形变,也可以通过计算和赋值把一些片元默认并不含有的属性带入FragmentShader来进行一些需要的操作。而在FragmentShader中我们可以做的就很多了,很多光照处理都是在这里进行的(当然在VertexShader中也可以进行光照计算,不过效果不是十分好),而且也可以做一些比较复杂的色彩变换和处理。