unity如何設置自發光,詳解Unity 5 全局光照系統Enlighten問題(上)

 2023-12-25 阅读 30 评论 0

摘要:Unity 5正式版面世已經一段時間,許多開發者都已經在使用Unity 5進行開發。大家在使用Unity 5時或多或少都會碰到一些問題,今天我們Unity的官方技術工程師,柳振東將在本文中針對Unity 5中全新的Enlighten全局光照系統的一些問題,以及相應的解答與大

Unity 5正式版面世已經一段時間,許多開發者都已經在使用Unity 5進行開發。大家在使用Unity 5時或多或少都會碰到一些問題,今天我們Unity的官方技術工程師,柳振東將在本文中針對Unity 5中全新的Enlighten全局光照系統的一些問題,以及相應的解答與大家進行分享。
? ?? ???為什么Unity 5的全局光照系統會讓大家踩坑呢? 因為Unity 5取締了Unity 4中使用的Beast全局光照系統,采用了全新的Enlighten全局光照系統。而這兩套全局光照系統的算法并不一樣,反映到使用上就是各種參數與操作細節的變化。
? ?? ???對于沒有系統學習過計算機圖形學的開發者,還是非常建議大家去了解一下全局光照明模型的,因為大家可能對局部光照明模型(就是我們平常所說的實時光照)比較熟悉,有時可能會把局部光照明模型的一些知識用在全局光照明系統上,白白花費時間做了一些無用功。
? ?? ???下面挑選一些常見問題與大家分享。
? ?? ???
? ?? ???為什么場景烘焙出來的lightmap上有Realitime燈光的顏色?

? ?? ???相信不少開發者都為這樣的問題頭疼過,因為燈光明明是Realtime的,怎么可能會被烘焙到lightmap里面去呢?但是這在Unity 5里并不是一個bug。
? ?? ???首先我們要知道Unity 5中新增一種全局光照明的使用方式:Precomputed Realtime GI(預計算實時全局光照明),簡稱:實時GI。而另一種Bake GI就是大家在Unity 4中一直用過來的ligtmap烘焙方式。
? ?? ???實時GI與Bake GI一樣,也需要預先的Bake過程,但是與Bake GI不同,實時GI并不預計算場景中光線的反射信息,而是預計算場景中靜態物體表面所有可能的反射光路,然后在游戲運行時結合燈光的位置、方向等信息實時計算出全局光照的結果。
? ?? ???這個計算機制使得預計算GI具備非常大的優勢,在使用預計算GI的燈光,其位置、方向、強度、顏色等各種信息都可以在運行時實時變化。
? ?? ???舉例:使用預計算GI我們就可以在場景中實現非常真實的日光變化效果(別忘了我們其實是在使用全局光照明模型啊,比實時光照效果強多了)。
? ?? ???但是,問題來了,預計算GI有一點非常容易讓人混淆,那就是預計算GI需要燈光類型是Realtime。WTF?Realtime難道不是實時燈光嗎?怎么變成全局光照明模型的燈光了?
? ?? ???Unity 5的燈光屬性中增加了一項,叫做Bounce Intensity,如下圖所示:

?

? ? ? ? Bounce Intensity是指全局光照中的間接光強度,要理解這點可以簡單地把全局光照理解為直接光照與間接光照兩部分。直接光照指直接從光源射到物體上的光,而間接光照指從其他物體表面反射而來的光。那么顯而易見,直接光照的部分其實就是局部光照模型,也就是實時光照計算出來的結果。
? ?? ???回到正題,Bounce Intensity在Unity 5 中默認值是1,意思就是說一盞Realtime燈光默認是使用預計算GI的,并且間接光照的強度不做改變(大于1是強制增大間接光照,這在一些由室外光照射入洞穴這類的場合中可能會用到)。而lighting窗口中的預計算GI選項也是默認開啟的,如下圖所示:? ? ? ??

?

? ? ? ? 所以如果你并不更改這些設置,即使看起來你好像只使用了Realtime的燈光,但是真正運行的時候卻其實是在使用全局光照系統!
? ?? ???接下來要說明的一點是,只要一盞燈的Bounce Intensity大于0,Unity就會認為你需要使用全局光照系統。那么即使你在lighting窗口中取消勾選Precomputed Realtime GI,Unity依然會嘗試使用全局光照。
? ?? ???既然已經取消了預計算GI的選項,Unity會去使用另外一種全局光照的方式,Bake GI(只要你還勾選著Bake GI)。而結果就是,烘焙出來的lightmap里也有那盞Bounce Intensity大于0的Realtime燈光的信息。
? ?? ???總結:Unity 5中燈光有個新屬性Bounce Intensity,這個值只要大于0系統就會認為你需要使用預計算GI計算這個燈光,而如果此時Precomputed Realtime GI沒有被勾選,而Bake GI勾選了那么Unity會把這個燈光也烘焙到lightmap中去。

? ?? ???為什么在Unity 5中動態更換lightmap沒有作用?

? ?? ???在場景中動態更換lightmap是挺常用的需求。例如:同一個場景需要白天與黑夜兩個時間的效果,那么我們就會烘焙兩張不同的lightmap,然后用腳本在運行時切換。在Unity 4中可以通過把lightmap資源load到Texture2D中,然后賦值給一個LightmapData結構,最后賦給LightmapSettings.lightmaps來達到更換當前使用lightmap的目的。
? ?? ???但是在Unity 5中會發現使用這個方法并不湊效。是因為lightmap沒有正確更換嗎?不是的,其實lightmap已經更換了,問題是在于此時使用lightmap的物體并不知道自己應該使用哪張lightmap,也不知道要從lightmap的哪個地方開始采樣,而這其實就是每個Renderer上的兩個參數,lightmapIndex與lightmapScaleOffset。
? ?? ???現在大家肯定會問為什么在Unity 4中沒有問題呢?那是因為這些信息在Unity 4中已經被序列化進場景文件中,當場景加載進來的時候這兩個值就被賦回到每個Renderer中。而在Unity 5中,lightmapIndex與lightmapScaleOffset因為多場景編輯的邏輯需要,不再被序列化到場景文件中去了,而是存在于一個伴隨lightmap烘焙產生的一個新文件,Lighting Data Asset中去了(這個文件在初期的5.x中叫做lightmapSnapShot)。這個文件與lightmap在同層目錄中,并且可以在Editor中隨時更換當前使用的LightingData文件,如下圖所示:

unity如何設置自發光??

? ? ? ? 那么回歸正題,既然LightingData文件存儲著lightmapIndex與lightmapScaleOffset,那么只要保證LightingData文件能被最終的可執行文件使用不就沒有問題了嗎?其實這樣是沒有問題的,如果我們只需要更換燈光條件不同情況下的lightmap,而場景本身并沒有更改的話,那么多套lightmap對于場景中的靜態物體Renderer而言也只需要同一套lightmapIndex與lightmapScaleOffset信息而已。所以在這種情況下要達到運行時更換lightmap的效果,只要保證lighting窗口的Ligtmaps頁面中Light Data Asset里選中了正確的LightingData文件即可(因為很多開發者習慣性刪除掉這個文件,因此也就丟失了lightmapIndex與lightmapScaleOffset信息)。
? ?? ???簡單的情況我們簡單地使用LightingData文件即可。但是還有一種情況,如果我們需要場景本身也有所改變要怎么辦呢?
? ?? ???舉例:我可能需要原始的場景lightmap與一個被炸彈破壞過后的場景lightmap,由于場景中的靜態物體有所改變,這個時候兩次烘焙會產生兩個數據不同LightingData文件,無法簡單使用其中一個。然而比較可惜的是現在Unity并不能在運行時切換LightingData文件,其設計之初就僅僅作為Editor使用的資源。
? ?? ???那么對于這種情況,我們需要自己記錄下每個Renderer上的lightmapIndex與lightmapScaleOffset信息,然后在更換lightmap的時候把這個信息還原回去。
? ?? ???具體做法有很多種,基本原理都是把lightmapIndex與lightmapScaleOffset序列化起來。比如說我們可以給每個靜態物體掛一個腳本,在里面定義一個包含Render,lightmapIndex與lightmapScaleOffset的結構,然后一個Save函數用來在每次烘焙lightmap之后把lightmapIndex與lightmapScaleOffset序列化進結構中,一個Load函數用來在切換lightmap時還原每個Renderer的lightmapIndex與lightmapScaleOffset信息。現在這個問題就解決了。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/196768.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息