unity灯光Lightmapping、LightProbes
1、为什么要用Lightmapping?
简单来说就是实时灯光计算十分耗时,随着光源越多,计算耗时会倍增。使用Lightmap模拟灯光带来的效果,便不用去计算灯光,会带来性能上的大大提升。
当然一个复杂的游戏场景不可能只用一个光源。如果要得到一个逼真的光照环境需要很多不同的灯光相互配合。我们知道灯光会消耗很大的资源。如果一个游戏我们打了很多盏灯。游戏就会运行缓慢。Unity3d给我们提供一种很好的方式来解决这个问题。就是讲灯光信息烘焙到物体表面。以贴图的形式进行存储,这样既保证了场景的效果,又节约了资源。
那么在游戏制作中这种灯光贴图是怎么得到的呢。现在一般用到两种方式
1:在3dmax等模型制作软件中对场景进行烘焙。将烘焙好的模型以及贴图导入到unity3d。
2:用unity3d自身的烘焙系统对场景进行烘焙。两者方式选择一个即可!都差不多!
既然两者都能达到差不多的效果,那么究竟他们之间有什么差别呢?
3dmax烘焙:
1、可以使用各种高级渲染器对模型进行烘焙,比如Vray。
2、可以烘焙像反射这样的效果。
3、因为光影是固定了,所以在引擎里面只能按照在3DMax里面的摆放,不然就会穿帮。所以模型贴图不能在各个不同场景通用。
unity的LightMapping烘焙:
1、设置的参数相对没有3DMax里面高级渲染器丰富。
2、只能烘焙光影的追踪效果,不能烘焙反射。
2、为什么要使用LightProbes?
因为场景中都是假光,只是把光影烘焙到贴图上面,所以并不会对周围的动态物体产生真正的光照效果。动态的物体或角色没有受光会很突兀,显得格格不入。若觉得没关系便不需要管了,想要角色也有这样的效果就需要用到LightProbes。
3、烘焙前展UV
无论哪种烘焙,你都需要对模型进行展UV操作,假如UV没有展,或者UV的范围超出了0-1的框,烘焙都是会出错的。
选中要烘培的模型,在Inspector面板勾选“Generate Lightmap UVs”,应用-Apply。读条完成后UV成功展开,模型面数越多展UV时间越长。
4、调整好灯光
聚光灯和点光源阴影是最昂贵的---最耗费资源的!
在这之前先对灯光几个参数进行说明
Cookie:这个纹理的阿尔法(alpha)通道作为一个遮罩,使光线在不同的地方有不同的亮度。(摄像机的渲染模式顶点模式Vertex Lit是不支持的!)
如果灯光是聚光灯或方向光,这必须是一个2D纹理。如果灯光是一个点光源,它必须是一个立方图(Cubemap)。
我们来设置一下平行光的Cookie,2D纹理图片为一张背景透明的星星图片如左图,设置好Cookie之后,场景如右所示
也就是说纹理透明的部分会显示为亮度暗的地方,其他颜色则为亮的地方!
有alpha通道的图片表示形式有两种:
一种就是向这个星星一样的,背景为透明的图片
另一种就是有alpha通道的,如下
他设为Cookie的表现效果如下:
要想知道一个图片,是否带aphla通道,最简单的方法就是把此纹理的Texture Type设为Sprite,如果有透明区域,即带alphla通道
在这分享一个photoshop制作带alpha通道的图片的方法
我们先看看带透明通道纹理的通道是什么样的
不带透明通道纹理的通道
选择 魔棒工具 → 点击图片 → 按住shitf键选择选取 如下:
然后 菜单栏下: 选择 → 存储区域 → 填写名称 → 确定
选择 → 取消选择
图片通道就会生成对应的alpha通道
应用于平行光的Cookie效果为
Cookie Size:缩放Cookie投影。只用于方向光。
size为1时 size为10时
在场景内设置好灯光位置和光亮,并选择一种阴影模式。默认情况下只有平行光才能实时显示阴影,其它类型光照没有实时阴影。
其中软阴影(Soft Shadows)更为昂贵。(耗资源)不建议使用
其中分辨率Resolution有如下设置:
Use Quality Settings表示使用Edit → Project Settings → Quality 下对阴影的设置,如下面箭头所指的地方
也就是说不同的灯光可以使用不同的分辨率,分辨率越高,渲染出来的图片越精细,如下,第一张是原图,第二张是Low Resolution,第三张是Very High Resolution
当然了,根据项目需求,我们得自己根据效果和效率来权衡使用哪一个!
虽然平行光是可以实时显示阴影,但是这也是和摄像机Camera的渲染路径Rendering Path有关的
渲染路径请参考http://www.cnblogs.com/MrZivChu/p/RenderingPath.html
摄像机的渲染路径有四个选项,Use Player Settings表示渲染路径依照Edit → Project Settings → Player 下面的设置来渲染
也就是说不同的摄像机可以使用不同的渲染模式
当使用Vertex Lit顶点光照的时候,平行光是无法渲染出实时阴影的,只有设置为其他两项(Deferred Lighting延迟光照 Forward正向渲染)才可以显示出来!
如果不在乎实时阴影效果,为了获得最佳性能,使用VertexLit 着色。这个着色器(shader)只进行顶点光照,在低端卡提供高得多的吞吐量。
点光源、聚光源也想要实时阴影怎么办?
我们先为点光源和聚光源的Shadow Type设为Hard Shadows,他会提示你“Only directional lights have shadows inforward rendering”,此时我们只需把对应摄像机的渲染路径改为延迟光照 Deferred Lighting模式即可!只有延迟光照Deferred Lighting模式才能实时显示阴影,其他两种模式对于不是平行光的光源来说是不行的!
如果我们的摄像机的渲染模式应用的是Use Player Settings的话
那么我们打开PlayerSettings面板(Edit > Project Settings > Player)。将Rendering Path 设置为延迟光照 Deferred Lighting,这时点光源的阴影也被显示出来了
或者也可以直接设置摄像机应用哪一个渲染模式
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)点击烘焙