zoukankan      html  css  js  c++  java
  • unity灯光Lightmapping、LightProbes

    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时间越长。

    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)点击烘焙

  • 相关阅读:
    C#泛型学习
    C#事件复习
    C#学习笔记之接口
    C#委托复习
    C#图解教程学习笔记(二)
    C#图解教程学习笔记
    Linq学习2
    Linq学习
    转载 协变与逆变的概念
    SqlServer在关联的情况下的增删改查
  • 原文地址:https://www.cnblogs.com/MrZivChu/p/light.html
Copyright © 2011-2022 走看看