分类:Unity、C#、VS2015

创建日期:2016-05-19

一、简介

在Unity 5中,Lighting是—种增强场景光照和阴影效果的技术,它可以通过较少的性能消耗使静态场景看上去更真实、丰富,以及更具有立体感,又可以对动态对象进行处理。

早期版本的Unity 4只能对“静态”对象和“动态”对象分别进行处理,称为Lightmapping(光照贴图),但是,Lightmapping不能被用来实时地处理“动态”光照;而在Unity 5中,与Lightmapping相关的功能被重新整合在Unity引擎中并通过【Window】->【Lighting】打开设置窗口,在Lighting窗口中,开发人员只需要简单的操作,就可以制作出平滑、真实且不生硬的光影效果。

Light Probes是一种在运行时将“动态对象”融入“静态场景”的技术,利用它可解决实时处理“动态”光照的问题。其基本原理是:先在场景空间中放置一些采样点来收集其周围的明暗信息,然后在运行时对动态对象邻近的采样点进行插值运算,并将插值结果作用于动态对象上。由于插值运算并不会耗费太多的性能,因此这种方式既能实现动态游戏对象和静态场景的实时融合效果,又不会导致内存资源的极大消耗。

二、全局光照(GI)

使用Unity 5提供的功能实现光照贴图和光影效果前,首先需要掌握两个基本概念:一个是GI,另一个是Realtime GI。

GI(Global Illumination,全局光照)是指世界坐标系(Global)中模型A被光照射后反射到其他模型表面的光(间接光),而不是光源直接照射到模型A的直接光。例如,阳光照在红色的沙发上会导致红光反弹到它背后的墙上,从而使墙看上去也有浅浅的红色光照效果。另一个例子是阳光照射在顶部只有一个小口的房间里,这会导致该房间内的其他部分也被物体反弹(反射)的光照亮了。

下图是一个应用了全局光照(GI)效果的场景,在这个图中,由于反弹光(间接光)的作用,导致整个场景看起来明亮、华丽、更具有立体真实感。

传统的电影技术一般只有直接光(如直射光、点光、……等光源)产生的效果,当实时地模拟间接光产生的效果时,由于模拟间接光需要进行大量的计算,会导致电影播放性能大大降低,因而在实际的电影制作时一般分两步来做这件事:前期拍摄和后期制作。

在Unity中,这种类似于电影前期拍摄的工作称为预处理。预处理是在Unity编辑器中进行的,主要针对静态的对象进行处理,该技术称为Baked GI(也叫Baked Lightmaps),即预先对间接光进行烘培(Bake)处理,烘培的目标是场景中事先被标记为Static的对象;而类似于电影后期制作的工作在Unity中称为Light Probes,即先通过在场景中添加一些采光点(采样点),再在运行时利用采光点的反弹(间接光)效果照亮其周围,从而使整个场景看起来明亮华丽、赏心悦目。

在Unity 5.0之前的版本中,这种将Baked GI和Light Probes组合起来的技术就是全局光照(GI),也叫光照贴图(lightmaps)。换言之,先在Unity编辑状态下对场景中的静态对象进行“预处理”,然后再在运行时利用Light Probes进行后期处理。这样一来,游戏运行的场面看起来就会明亮、华丽、气派。

三、实时GI(Realtime GI)

除了全局光照技术(GI)以外,Unity从5.0开始,又提供了一种新的称为“Precomputed Realtime GI”的技术,其原理类似于5.0以前的早期版本提供的Baked GI技术。不过,虽然该技术针对的仍然是静态的对象(即仅限于对被标识为static的对象进行处理),但是,它和Baked GI最主要的区别是:通过“Precomputed Realtime GI”预处理的结果还可以直接用于运行时(runtime)的动态对象照明。其实现原理是:Unity先把预先烘培(Bake)的信息(位置、方向、颜色、……等属性)保存下来,这样一来在运行时就可以直接通过这些预处理信息对动态对象进行照明处理了。换言之,在Unity 5中,只需要通过“Realtime GI”技术,就可以在运行时大大提高照明渲染处理的性能,而不需要再使用Baked GI+Light Probes进行组合处理了。

四、结论

总之,实现全局照明提供光阴效果时,要么采用方式1(Unity 5之前的早期版本提供的“Baked GI”+“Light Probes”组合起来的技术),要么采用方式2(从Unity 5.0开始提供的“Precomputed Realtime GI”技术)。但是,不能同时采用方式1和方式2,否则很快就会把内存吃光,从而导致非正常的自动关机(这应该是个新的bug,估计后续的版本会解决这个问题)。

再次提醒注意:“Baked GI”和“Precomputed Realtime GI”都是对“静态”的对象而言的,即都需要先将被烘培的对象标识为“Static”才能对其进行照明烘培预处理。而对于动态的对象来说,如果烘培静态对象时使用的是“Baked GI”技术而不是“Precomputed Realtime GI”技术,那么还可以利用预先放置的采光点在运行时通过“Light Probes”实现对动态对象照明;如果烘培静态对象时使用的是“Precomputed Realtime GI”技术,由于在运行时它可以直接对动态对象进行照明处理,因此这种情况下就不要再使用“Light Probes”了。

【Unity】第13章 光照贴图和光影效果的更多相关文章

  1. 【Unity】13.3 Realtime GI示例

    分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图和光影效果相关的概念和基本设置办法,这样可避免实际复杂场景中 ...

  2. 【Unity】13.1 场景视图中的GI可视化

    分类:Unity.C#.VS2015 创建日期:2016-05-19 一.简介 在场景视图中设计不同的场景内容时,可以根据需要勾选相关的渲染选项,以便让场景仅显示其中的一部分或者全部渲染效果. 在这些 ...

  3. unity中使用自定义shader进行光照贴图烘培无法出现透明度的坑爹问题

    最近开发中在对场景进行光照贴图烘焙时发现一个坑爹问题,在使用自定义shader的时候,shader命名中必须包含Transparent路径,否则烘焙的时候不对alpha通道进行计算,烘焙出来都是狗皮膏 ...

  4. 第五章 Unity中的基础光照(3)

    目录 1. 在Unity Shader中实现高光反射光照模型 1.1 实践:逐顶点光照 1.2 逐像素光照 1.3 Blinn-Phong光照模型 2. 召唤神龙:使用Unity内置的函数 @ 1. ...

  5. ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行

    ★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...

  6. 【Unity】13.2 通过Lighting Window设置相关参数

    分类:Unity.C#.VS2015 创建日期:2016-05-19 一.简介 Unity 5.3.4的Lighting Window有3个选项卡:Object.Scene.Lightmaps. 二. ...

  7. Linux就这个范儿 第13章 打通任督二脉

    Linux就这个范儿 第13章 打通任督二脉 0111010110……你有没有想过,数据从看得见或看不见的线缆上飞来飞去,是怎么实现的呢?数据传输业务的未来又在哪里?在前面两章中我们学习了Linux网 ...

  8. 【RL-TCPnet网络教程】第13章 RL-TCPnet之TCP服务器

    第13章      RL-TCPnet之TCP服务器 本章节为大家讲解RL-TCPnet的TCP服务器实现,学习本章节前,务必要优先学习第12章TCP传输控制协议基础知识.有了这些基础知识之后,再搞本 ...

  9. 第13章 GPIO—位带操作

    第13章     GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

随机推荐

  1. jQuery 2.0.3 源码分析 Deferred(最细的实现剖析,带图)

    Deferred的概念请看第一篇 http://www.cnblogs.com/aaronjs/p/3348569.html ******************构建Deferred对象时候的流程图* ...

  2. 谷歌chrome浏览器www.tradeadexchange.com广告弹窗跳转劫持病毒

    近期大量网友出现chrome浏览器被劫持的情况,表现如下:           ·  点击(访问)任意网站任意链接均有概率弹出www.tradeadexchange.com.           ·  ...

  3. Swift 和 C# 的语法比较

    昨天看到Jacob Leverich 写了一篇文章 Swift is a lot like Scala 介绍Swift 和 Scala 的语法对比,从这篇文章的确可以看到Swift 的语法和 Scal ...

  4. mysql 截取身份证出生日期

    ,) ,) as date), '%m-%d') as 生日 from t_person

  5. 2013 duilib入门简明教程 -- 前言(1)

        关于duilib的介绍就不多讲了,一来不熟,二来小伙伴们想必已经对比了多个界面库,也无需赘述.下面进入正题:     不看广告看疗效! 已有众多知名公司采用duilib做为界面库,如华为网盘. ...

  6. BUG级别定义标准

    通过图片另存为 或者 放大浏览器倍率 查看.

  7. MongoDB 聚合操作

    在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...

  8. SSIS Design5:使用暂存

    以数据流的方式来设计Package,将核心数据处理移动到数据流中,一般情况下,能够减少临时表的创建,获得较高的处理性能,在某些情况下,使用暂存表(staging table)能够优化package设计 ...

  9. js高程读书笔记(第4章--变量、作用域和内存)

    JavaScript变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何总数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变. 1. ...

  10. python统计某一个进程名所占用的内存

    设计思路: 通过python,执行cmd中tasklist命令,获取要统计的进程的相关信息:通过正则表达式,查找出进程名称.进程pid.内存使用,然后打印出来. 作为pythoner,有时候需要统计p ...