【Unity】第13章 光照贴图和光影效果
分类: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章 光照贴图和光影效果的更多相关文章
- 【Unity】13.3 Realtime GI示例
分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图和光影效果相关的概念和基本设置办法,这样可避免实际复杂场景中 ...
- 【Unity】13.1 场景视图中的GI可视化
分类:Unity.C#.VS2015 创建日期:2016-05-19 一.简介 在场景视图中设计不同的场景内容时,可以根据需要勾选相关的渲染选项,以便让场景仅显示其中的一部分或者全部渲染效果. 在这些 ...
- unity中使用自定义shader进行光照贴图烘培无法出现透明度的坑爹问题
最近开发中在对场景进行光照贴图烘焙时发现一个坑爹问题,在使用自定义shader的时候,shader命名中必须包含Transparent路径,否则烘焙的时候不对alpha通道进行计算,烘焙出来都是狗皮膏 ...
- 第五章 Unity中的基础光照(3)
目录 1. 在Unity Shader中实现高光反射光照模型 1.1 实践:逐顶点光照 1.2 逐像素光照 1.3 Blinn-Phong光照模型 2. 召唤神龙:使用Unity内置的函数 @ 1. ...
- ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行
★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...
- 【Unity】13.2 通过Lighting Window设置相关参数
分类:Unity.C#.VS2015 创建日期:2016-05-19 一.简介 Unity 5.3.4的Lighting Window有3个选项卡:Object.Scene.Lightmaps. 二. ...
- Linux就这个范儿 第13章 打通任督二脉
Linux就这个范儿 第13章 打通任督二脉 0111010110……你有没有想过,数据从看得见或看不见的线缆上飞来飞去,是怎么实现的呢?数据传输业务的未来又在哪里?在前面两章中我们学习了Linux网 ...
- 【RL-TCPnet网络教程】第13章 RL-TCPnet之TCP服务器
第13章 RL-TCPnet之TCP服务器 本章节为大家讲解RL-TCPnet的TCP服务器实现,学习本章节前,务必要优先学习第12章TCP传输控制协议基础知识.有了这些基础知识之后,再搞本 ...
- 第13章 GPIO—位带操作
第13章 GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
随机推荐
- UI控件(UIWebView)
本文主要记录UIWebView三方面内容: 1.基本的加载网页链接或文件: 2.网页js调用原生,也就是Cordova混合架构的原理: 3.原生调用js程序: 原生部分主要代码: @implement ...
- 剑指Offer面试题:29.丑数
一.题目:丑数 题目:我们把只包含因子2.3和5的数称作丑数(Ugly Number).求按从小到大的顺序的第1500个丑数.例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做第一个 ...
- Morris.js和flot绘制折线图的比较
[文章摘要] 最近用开源的AdminLTE做框架感觉效果特别好,其针对图表库Morris.js和flot都提供了不错的支持,也都提供了这两者的例子.不过Morris.js是基于Raphael.js来的 ...
- Linux 挂载管理(mount)
标签:mount,umount 概述 在上一章增加linux操作系统空间中已经使用过了mount命令对分区进行挂载,这一章详细介绍挂载管理,该命令涉及的知识点也挺多的而且也还比较重要,是需要掌握的一个 ...
- 利用Hexo搭建个人博客-博客发布篇
通过 <利用Hexo搭建个人博客-环境搭建篇> 以及 <利用Hexo搭建个人博客-博客初始化篇>,我们了解到了利用Hexo搭建个人博客需要的环境以及配置,下面这篇文章将会介绍如 ...
- Outlook HTML渲染引擎
OutLook始终不离不弃 是不是很讨厌为Email代码兼容Outlook? 太遗憾了!虽然光都有尽头,但Outlook始终存在. 为了应付Email的怪癖,我们花了很多时间测试,确保我们搞定了所有O ...
- 在JQ中关于this
this的相关问题 this指代的是什么 这个应该是比较好理解的,this就是指代当前操作的DOM对象. 在jQuery中,this可以用于单个对象,也可以用于多个对象. $('btn').click ...
- spring mvc Error instantiating class ** with invalid types () or values (). Cause: java.lang.NoSuchMethodException:
一般引起这种问题的原因是 bean和mapper里面的字段未对应上,或者 bean里面没有默认的构造函数引起的.我今天是后面的一个,自己写了带参数的构造函数引起的这个问题...
- android 手把手教您自定义ViewGroup(一)
1.概述 在写代码之前,我必须得问几个问题: 1.ViewGroup的职责是啥? ViewGroup相当于一个放置View的容器,并且我们在写布局xml的时候,会告诉容器(凡是以layout为开头的属 ...
- Javascript刷题 》 查找数组元素位置
找出元素 item 在给定数组 arr 中的位置 输出描述: function indexOf(arr, item) { ..... } 如果数组中存在 item,则返回元素在数组中的位置,否则返回 ...