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)點擊烘焙