unity3d 学习笔记四 skybox(天空盒) light(光源) halo(光晕)

Unity3D学习笔记(四)天空、光晕和迷雾

六年前第一次接触《魔兽世界》的时候,被其绚丽的画面所折服,一个叫做贫瘠之地的地方,深深印在我的脑海里。当时在艾泽拉斯大陆还不能使用飞行坐骑,试想一下孤身一人在银色的月光下赶路,可能还有你的战斗小伙伴,静谧的夜晚,皎洁的月光,一起走过了六年……即便是现在回想起来,浮现在脑海中的不是T123456S123456,而是十字路口的夜空。

 

回到正题,在Unity中要创建这样的效果并不困难,用专业一点的术语讲就是只需要创建一个天空盒,并给予它天空纹理即可。通俗一点来讲,就是在我们的前面几章创建的地形四周罩上一个立方体盒,并把盒子上面添上星空的照片就搞定了。有软件可以将魔兽世界的素材提取出来,然后加以利用到我们自己的游戏中。

不过这一章我并不准备讲述这些,因为主题是为了把天空盒和镜头光晕的知识点整理一下,如果有时间,我会另写一篇关于如何使用强大的”Wow Model Viewer”来导出魔兽世界的模型、贴图等素材,并导入到Unity中。其实具体操作并不困难,心急的朋友们可以去google code下载这个软件:http://code.google.com/p/wowmodelviewer/downloads/list

Unity自带了好几种天空盒,从白天到黄昏再到夜晚,拿来做场景练习已经完全够用了。要使用天空盒素材,只需要导入Skyboxes素材包即可(至于如何导入可以参考我之前的笔记,每次都重复一遍略显蛋疼^_^)。导入成功后可以在项目资源面板的“Standard Assets->Skyboxes”目录下看到好多天空盒素材,Unity已经把盒子都造好了,我们直接拿来用就OK,非常人性化。

接下来要把天空盒素材添加到游戏场景里,有两种添加天空盒的方法,这里先写比较容易理解的一种,另外一种将在以后写预设和组件的时候再解释。

点击主菜单“Edit(编辑)->Render Settings(渲染设置)”,检视面板视图里就会出现渲染设置选项了,注意有个Skybox Material(天空盒材质)选项,点击它右边的小圆圈,就会弹出选择天空盒材质的对话框。单击任意一个材质球,设计视图中会立即提供预览,双击则表示确认使用,相当便捷。

 

光这样是不够的,还记得之前添加的”线性光”吗?没错,就是那个“无限远、无限大类似于太阳的手电筒”^_^。它现在正静静地躺在层次面板中默默地燃烧自己,照亮世界,它不叫雷锋,它的名字叫做Directional light。这个名字有点拗口,选中它并按快捷键F2修改,换成Sun,就把它当作游戏里的太阳。细心的朋友会发现,太阳光的方向和天空盒上那个假的太阳的方向不一定会一致,可能导致太阳的位置和影子的位置有悖现实,所以必须手动调整,让它们重合。

这里提供一种便捷的方法,首先在设计视图中拖动视角,让镜头中心对准天空盒上的太阳,然后在渲染设置中临时将天空盒设置为无(为了方便调整Sun的角度,否则天空盒太亮看不清楚)。然后选中Sun并使用旋转工具(快捷键E),将光线的方向正对自己,然后再将天空盒恢复即可。这样一来就不会闹太阳和影子在同一个方向的笑话了。

 

玩过摄影的朋友应该都有这么个常识,当把镜头着阳光时,可能会出现一个或者多个七彩光环的光晕现象。百度一下光晕,发现全是关于某个游戏的@_@,好不容易找到张照片,就委屈一下大妈您嘞。右上角就是传说中的光晕啦。导入Unity自带的素材包“Light Flares(闪光)”,选中线性光“Sun”,在Sun的检视面板中找到Flare属性,选择一个光晕图片(我选的是50 mm Zoom),当当当当~看看天上的太阳,是不是耀眼多了?

  

 

完成光晕之后顺便把迷雾之类的设置也了解一下吧,所谓“欲穷千里目,更上一层楼”,放在当今城市里已经不太合适了。因为污染呀,各种细小的粉尘漂浮在空气中,平时可能难以察觉,但是当举目远眺的时候就会发现远处根本就是一片迷茫嘛,跟大雾天一样的。在Unity的渲染设置中可以方便地调节这种迷雾的效果,甚至可以改变颜色和浓度等等:

  • Fog(是否启用迷雾效果)
  • Fog Color(迷雾的颜色)
  • Fog Mode(迷雾模式) 可以选择“Linear(线性)”、“Exponential(指数性)”、“Exp2(指数性2)”三种渲染模式,具体动手尝试一下即可,差别不是很大。
  • Fog Density(迷雾浓度)
  • Linear Fog Start(线性迷雾起始距离)
  • Linear Fog End(线性迷雾终止距离) 当选择线性的迷雾模式时,这两个参数表示了相对于镜头的迷雾的范围。在这个范围内迷雾的浓度会被平均化,也就是说当范围很小的时候,远处的物体会很清晰,近处的物体反倒一点都看不见。
  • Ambient Light(环境光) 调节这个颜色会影响到整个游戏场景的光线,比如调成粉红色的话……就好暧昧啊 哈哈。
  • Skybox Material(天空盒材质)
  • Halo Strength(光环强度,没弄明白)
  • Flare Strength(光晕强度)
  • Halo Textrue(光环贴图,没弄明白)
  • Spot Cookie(光斑?没弄明白)
 

最后上张效果图,骄阳似火闷得慌啊哈哈~看来下一章非得加点水不可了:)


Unity3D学习笔记(七)光与影

还记得大明湖畔的容嬷嬷吗?噢不对,还记得第二章里在游戏世界里添加的太阳光吗?虽然作为上帝创造了光,照亮了世界,但为了平衡世界还缺少一样东西,没错,它就是——影子!仔细观察一下游戏场景,发现的确所有东西都没有影子呢。那么本章就再以上帝的角色用LightMapping(光照贴图)为这个虚拟世界添加影子。

选中太阳光对象,当时我把它改名成了“Sun”,在检视面板里可以看到Shadow Type(阴影类型)是No Shadows(无阴影)。点击下拉列表,有两种阴影类型可以选择:Hard Shadow(硬化阴影)和Soft Shadow(柔化阴影)。所谓硬化不是说影子比较坚硬,而是影子的轮廓比较清晰。后者比前者多了两个选项:Softness(柔化度)和Softness Fade(柔化渐隐),调整这两个参数可以让影子的边缘看起来模糊一点,更加逼真。

另外还有Strength(强度)选项,可以用来调节阴影的强度。调整Resolution(分辨率)选项可以更改产生阴影的质量,越高效果越好,当然性能消耗也越大。Bia(偏斜度)不知道是用来干什么的,拖到最小和最大好像对阴影没什么影响,暂时就先放一边。

unity3d 学习笔记四 skybox(天空盒) light(光源) halo(光晕)_第1张图片


咦,本章这么快就结束了?不,好戏才刚刚开始呢。

unity不仅仅提供了(Directional Light)平行光源,还提供了Spot Light(投射光源)、(Point Light)点光源、(Area Light)区域光源类型,用官方的图来表达更直接点吧。其中区域光源是用来做烘焙用的,这个以后再介绍。我是不会告诉你其实我也一知半解的啊哈哈……

unity3d 学习笔记四 skybox(天空盒) light(光源) halo(光晕)_第2张图片

可以在选中光源对象后更改检视面板中的Type(光源类型),不过太阳光已经是平行光源了,所以为了测试,就再创建一个光源来练手。点击主菜单中的“游戏对象→创建其他对象→投射光源”。在检视面板中可以调整投射光源的Range(距离)和Spot Angle(投射角度),这两个参数很好理解。然后用旋转工具和移动工具调整好光源的照射方向,此时由于太阳光太亮,几乎看不到投射光源的光。因此要么减少太阳光的Intensity(强度),要么增加投射光源的强度,方便起见我选择了后者。顺便也可以把光源的Color(颜色)调整喜欢的类型比如说……粉红?^_^。啊啊,我还是改回白色吧。不管怎么说,光的颜色和亮度对游戏场景的气氛渲染起着至关重要的作用。

还有一个压轴参数,Cookie(请原谅我也不知道该如何翻译它,可以理解为光照纹理),点击右边的小圆点,然后选择一张纹理。用技术型的表述方式是该纹理的透明通道(Alpha通道,点这里叫度娘来科普啦)将被作为蒙板,以决定光照在各个位置的亮度。如果是投射光源或平行光,则必须是2D纹理。其中如果是平行光源,则还可以设置CookieSize(光照纹理缩放)。另外如果是点光源,则需要一个CubeMap(映射立方体)。

听起来蛮复杂的,但是动手操作一下发现其实很好理解,选择好纹理后越透明的地方光线越暗,否则越亮。那么这个有什么用呢?呵呵,看自己发挥想象力了呗!

unity3d 学习笔记四 skybox(天空盒) light(光源) halo(光晕)_第3张图片


unity3d 学习笔记四 skybox(天空盒) light(光源) halo(光晕)_第4张图片


如果是点光源,那么就必须要制作一个映射立方体,右键点击工程面板“创建→映射立方体”。选中它之后就会在检视面板中出现6个面,分别对应前后左右上下的Cookie。方式与投射光源的Cookie制作相同,只要把纹理拖上去即可。制作完映射立方体后别忘了拖到点光源的Cookie上。

unity3d 学习笔记四 skybox(天空盒) light(光源) halo(光晕)_第5张图片

其实我觉得吧,如果把映射立方体的六个面分别贴上蜂窝状的纹理,然后让它旋转起来,颜色还要不停的变化,那不就是一个舞厅里的旋转球灯了吗?哈哈。那么下一章就来写写Unity动画功能的使用。


你可能感兴趣的:(unity3d)