1、为什么要用Lightmapping?

简单来说就是实时灯光计算十分耗时,随着光源越多,计算耗时会倍增。使用Lightmap模拟灯光带来的效果,便不用去计算灯光,会带来性能上的大大提升。

当然一个复杂的游戏场景不可能只用一个光源。如果要得到一个逼真的光照环境需要很多不同的灯光相互配合。我们知道灯光会消耗很大的资源。如果一个游戏我们打了很多盏灯。游戏就会运行缓慢。Unity3d给我们提供一种很好的方式来解决这个问题。就是讲灯光信息烘焙到物体表面。以贴图的形式进行存储,这样既保证了场景的效果,又节约了资源。

那么在游戏制作中这种灯光贴图是怎么得到的呢。现在一般用到两种方式

1:在3dmax等模型制作软件中对场景进行烘焙。将烘焙好的模型以及贴图导入到unity3d。

2:用unity3d自身的烘焙系统对场景进行烘焙。两者方式选择一个即可!都差不多!

既然两者都能达到差不多的效果,那么究竟他们之间有什么差别呢?

3dmax烘焙:

1、可以使用各种高级渲染器对模型进行烘焙,比如Vray。

2、可以烘焙像反射这样的效果。

3、因为光影是固定了,所以在引擎里面只能按照在3DMax里面的摆放,不然就会穿帮。所以模型贴图不能在各个不同场景通用。

unity的LightMapping烘焙:

1、设置的参数相对没有3DMax里面高级渲染器丰富。

2、只能烘焙光影的追踪效果,不能烘焙反射。

                      3、可以一个模型放在不同场景单独烘焙,模型可以通用。 
                      4、由于每个场景需要烘焙一组贴图,所以如果场景多了,也会增加贴图数量。
 
Unity内置的光照贴图烘培工具是Illuminate Labs 的Beast。烘培光照贴图流程被完美的整合到Unity中。这就意味着使用Beast可以根据你的网格物体,材质贴图和灯光属性的设置来烘培你的场景,从而得到完美的光照贴图。同时也意味着光照图将作为渲染引擎的一部分。只要你烘培一次光照贴图你就不需要其他任何操作。光照图将自动指定到物体上。

2、为什么要使用LightProbes?

因为场景中都是假光,只是把光影烘焙到贴图上面,所以并不会对周围的动态物体产生真正的光照效果。动态的物体或角色没有受光会很突兀,显得格格不入。若觉得没关系便不需要管了,想要角色也有这样的效果就需要用到LightProbes。

3、烘焙前展UV

无论哪种烘焙,你都需要对模型进行展UV操作,假如UV没有展,或者UV的范围超出了0-1的框,烘焙都是会出错的。

选中要烘培的模型,在Inspector面板勾选“Generate Lightmap UVs”,应用-Apply。读条完成后UV成功展开,模型面数越多展UV时间越长。

unity灯光Lightmapping、LightProbes-LMLPHP

4、调整好灯光

聚光灯和点光源阴影是最昂贵的---最耗费资源的!

在这之前先对灯光几个参数进行说明

Cookie:这个纹理的阿尔法(alpha)通道作为一个遮罩,使光线在不同的地方有不同的亮度。(摄像机的渲染模式顶点模式Vertex Lit是不支持的!)

如果灯光是聚光灯或方向光,这必须是一个2D纹理。如果灯光是一个点光源,它必须是一个立方图(Cubemap)。

我们来设置一下平行光的Cookie,2D纹理图片为一张背景透明的星星图片如左图,设置好Cookie之后,场景如右所示

unity灯光Lightmapping、LightProbes-LMLPHP  unity灯光Lightmapping、LightProbes-LMLPHP

也就是说纹理透明的部分会显示为亮度暗的地方,其他颜色则为亮的地方!

有alpha通道的图片表示形式有两种:

一种就是向这个星星一样的,背景为透明的图片

另一种就是有alpha通道的,如下

unity灯光Lightmapping、LightProbes-LMLPHP

他设为Cookie的表现效果如下:

unity灯光Lightmapping、LightProbes-LMLPHP

要想知道一个图片,是否带aphla通道,最简单的方法就是把此纹理的Texture Type设为Sprite,如果有透明区域,即带alphla通道

unity灯光Lightmapping、LightProbes-LMLPHP unity灯光Lightmapping、LightProbes-LMLPHP

在这分享一个photoshop制作带alpha通道的图片的方法

我们先看看带透明通道纹理的通道是什么样的

unity灯光Lightmapping、LightProbes-LMLPHP unity灯光Lightmapping、LightProbes-LMLPHP

不带透明通道纹理的通道

unity灯光Lightmapping、LightProbes-LMLPHP

选择 魔棒工具 → 点击图片 → 按住shitf键选择选取 如下:

unity灯光Lightmapping、LightProbes-LMLPHP

然后 菜单栏下: 选择 → 存储区域  → 填写名称 → 确定

选择 → 取消选择

图片通道就会生成对应的alpha通道

unity灯光Lightmapping、LightProbes-LMLPHP unity灯光Lightmapping、LightProbes-LMLPHP

应用于平行光的Cookie效果为

unity灯光Lightmapping、LightProbes-LMLPHP

Cookie Size:缩放Cookie投影。只用于方向光。

size为1时                           size为10时

unity灯光Lightmapping、LightProbes-LMLPHP unity灯光Lightmapping、LightProbes-LMLPHP

在场景内设置好灯光位置和光亮,并选择一种阴影模式。默认情况下只有平行光才能实时显示阴影,其它类型光照没有实时阴影。

unity灯光Lightmapping、LightProbes-LMLPHP

其中软阴影(Soft Shadows)更为昂贵。(耗资源)不建议使用

其中分辨率Resolution有如下设置:

unity灯光Lightmapping、LightProbes-LMLPHP

Use Quality Settings表示使用Edit → Project Settings → Quality 下对阴影的设置,如下面箭头所指的地方

unity灯光Lightmapping、LightProbes-LMLPHP

也就是说不同的灯光可以使用不同的分辨率,分辨率越高,渲染出来的图片越精细,如下,第一张是原图,第二张是Low Resolution,第三张是Very High Resolution

unity灯光Lightmapping、LightProbes-LMLPHPunity灯光Lightmapping、LightProbes-LMLPHPunity灯光Lightmapping、LightProbes-LMLPHP

当然了,根据项目需求,我们得自己根据效果和效率来权衡使用哪一个!

虽然平行光是可以实时显示阴影,但是这也是和摄像机Camera的渲染路径Rendering Path有关的

渲染路径请参考http://www.cnblogs.com/MrZivChu/p/RenderingPath.html

unity灯光Lightmapping、LightProbes-LMLPHP

摄像机的渲染路径有四个选项,Use Player Settings表示渲染路径依照Edit → Project Settings → Player 下面的设置来渲染

unity灯光Lightmapping、LightProbes-LMLPHP

也就是说不同的摄像机可以使用不同的渲染模式

当使用Vertex Lit顶点光照的时候,平行光是无法渲染出实时阴影的,只有设置为其他两项(Deferred Lighting延迟光照  Forward正向渲染)才可以显示出来!

如果不在乎实时阴影效果,为了获得最佳性能,使用VertexLit 着色。这个着色器(shader)只进行顶点光照,在低端卡提供高得多的吞吐量。

unity灯光Lightmapping、LightProbes-LMLPHP

点光源、聚光源也想要实时阴影怎么办?

我们先为点光源和聚光源的Shadow Type设为Hard Shadows,他会提示你“Only directional lights have shadows inforward rendering”,此时我们只需把对应摄像机的渲染路径改为延迟光照 Deferred Lighting模式即可!只有延迟光照Deferred Lighting模式才能实时显示阴影,其他两种模式对于不是平行光的光源来说是不行的!

unity灯光Lightmapping、LightProbes-LMLPHP

如果我们的摄像机的渲染模式应用的是Use Player Settings的话

那么我们打开PlayerSettings面板(Edit > Project Settings >  Player)。将Rendering Path 设置为延迟光照 Deferred Lighting,这时点光源的阴影也被显示出来了

unity灯光Lightmapping、LightProbes-LMLPHP

或者也可以直接设置摄像机应用哪一个渲染模式

5、烘焙

http://game.ceeger.com/Manual/LightmappingInDepth.html

http://blog.sina.com.cn/s/blog_471132920101etyp.html#cmt_2435395

相关参数说明:

Mode:
(1)Dual Lightmap mode:近景烘焙图(near lightmaps)和远景烘焙图(far lightmaps)都会被烘焙,只有deferred rendering path支持该模式

选择这项,会多出这一项的设置:Use in forward rendering:一般可以忽略这个。针对Dual lightmaps的设定,只在Mode选的是Dual时才会出现。在forward rendering模式下是否激活      dual lightmaps,需要自己写对应的Shader。
(2)Single Lightmap mode:只有远景烘焙图(far lightmaps)会被烘焙
(3)Directional Lightmap mode:

Quality:
          High low 2个选项。决定采集射线的数量,对比界限,以及反锯齿等设置。

Bounces:
Global Illumination模拟中 light bounces的数量。0表示只有直接光照会被计算,如果要加入柔软的,真实的间接光照的话,则至少填1。

双通道后配出后不带影子,灯光需要保留。

单通道烘培后附带影子,可以不保留灯光。单通道烘培省资源。(适当的调节参数效果更好)

参考:http://unity.jb51.net/meigongsheji/shanweisheji/35.html

6、AreaLight

Area Light,俗称面灯。没有任何实时光照的效果,仅用于Light baking即烘焙。

Color:颜色
Intensity:强度,
Width:宽
Height:高
Scale缩放对光没有任何影响。主要是宽高调整面的区域大小。选中Arealight后,Arealight的区域会在Scene窗口中以黄线框显示,AreaLight的Z轴指向的方向即光照的方向。

用AreaLight烘焙室内灯光效果
(1)创建一个空场景
(2)创建Cube并缩放成扁平面后。复制Cube并旋转拼接搭建成一个敞口的盒子。
(3)再创建一个Cube拉伸成下图中的简易灯模型,并把Shader改为Self-Illumin/Diffuse。
(4)创建Arealight,并旋转使z轴朝下。之后调整Arealight的宽高,使AreaLight的框与灯符合。最后光的颜色选择黄色。
(5)点击烘焙

unity灯光Lightmapping、LightProbes-LMLPHP

05-17 12:56