使用预计算实时全局光照优化照明-设置场景
本文地址:https://blog.csdn.net/t163361/article/details/123883151
翻譯說明:
教程翻譯主要用谷歌翻譯,然后對特別不通順的地方進行了微調。同時針對一些比較重要的地方保留了英語或英語和漢語同時存在的方式方便大家理解。
教程目錄
設置場景
中級 20分鐘
在本教程中,您將使用預計算的實時全局照明(GI)設置您的場景照明,并啟動預計算過程。
1.概述
在這第一個教程中,你將使用預計算的實時全局照明(GI)來設置你的場景照明。
2.在你開始之前
如果你還沒有這樣做,下載項目資源,并在Unity編輯器中打開它們。
3.打開Lighting窗口
使用預計算實時 GI 為照明設置場景時,需要做出的首要決定之一是確定場景的默認間接分辨率(Indirect Resolution)。間接分辨率是指每個世界單位中使用的實時光照貼圖texels(紋理像素)的數量。
你可以在“Lighting”窗口中觀察或設置間接分辨率,步驟如下:
4.間接分辨率簡介
在設置場景時,了解項目所需的單位比例(unit scale)很重要。 在您的項目中,單位可能是米、英尺或厘米。 Unity 單位在現實世界比例中沒有默認等效值,因此由用戶決定單位(unit)代表什么。
在我們的示例項目中,我們決定單位等于1米。某些物理概念也有相同的假設。例如,重力以單位每秒表示,這是Unity的默認值。因此,假設一個單位相當于1米,對于真實世界類的游戲場景來說是一個很好的設置。
選擇適當的間接分辨率
通常,您的場景的間接分辨率可以根據您的游戲世界的規模來確定。 例如,您的場景是否是一個小而豐富的室內環境,反射光照變化很大? 在這種情況下,更高的光照貼圖分辨率(例如每單位 2-3 個紋素(texels))可能是合理的,以便捕獲這種更詳細或“高頻”的光照。
也許你的場景是一個大型戶外環境,其世界規模要大得多。你可能有數百甚至數千個單位的表面,而這些區域幾乎沒有變化來修改反射光的顏色。在這種情況下,適合捕捉室內場景中錯綜復雜的照明細節的分辨率,在應用于戶外環境的大范圍和不太有特色的區域時,將是一種浪費。我們將浪費寶貴的CPU時間和可用的內存,因為我們必須存儲和更新對場景整體外觀沒有太大貢獻的光照貼圖紋素(texels)。更重要的是,出于本教程的目的,我們將增加光照預計算過程中必須考慮的光照貼圖紋素(texels)的數量。這可能會對預計算時間產生巨大影響。
在室外環境的情況下,適當的光照貼圖分辨率對于場景中的大型對象可能介于每單位 0.5 -1紋素(texels)之間,或者對于地形而言可能介于 0.1 - 0.5紋素(texels)之間。
5.選擇間接分辨率的值
Unity的預計算實時GI所需要的間接分辨率值要比“傳統的”光照貼圖紋理像素密度小幾個數量級。這是因為你在這些光照貼圖中只捕捉了間接光線,而這往往是非常柔和或“低頻”的。當你使用預計算的實時GI時,清晰的陰影通常是由實時陰影提供的,而不是高分辨率的光照貼圖。
使用在傳統光映射技術中看似合適的值(例如,每個單元30個紋素(texels))可能會導致預計算失敗或無法完成。假設您正在使用單位大小為 1 個單位 = 1 米的人體比例場景,更合適的值是:
- 室內場景:每單位 2 到 3 個紋素(texels)
- 戶外場景:每單位 0.5 到 1 紋素(texels)
- 地形場景:每單位 0.1 到 0.5 紋素(texels)
注:如果世界范圍有很大不同,則需要對這些值進行相應調整。
當最初設置場景的間接分辨率時,你為場景中的靜態對象指定了默認分辨率。帶有在 Inspector 頂部標記為 Contribute GI 的 MeshRenderer 的新游戲對象將使用此值,除非另有修改。
逐對象光照貼圖分辨率
除了為整個場景選擇間接分辨率外,您還可以選擇基于每個對象更改光照貼圖分辨率。 如果您需要更高分辨率提供的額外保真度,您可以有選擇地增加此值。
通常,將最常見的分辨率設置為場景默認值,然后在需要更多照明細節的對象上手動提高分辨率的工作量較少。我們將在本教程的后面討論修改每個對象分辨率的方法。
6.設置場景的間接分辨率
如果您想繼續學習,您將在 Unity 項目中包含的 LightingTutorialStart 場景中工作,以獲得此學習體驗。
在示例場景中,有一個具有中等大小地形且顏色相當一致的戶外環境。 為此,每單位 0.5 紋素的低間接分辨率就足以捕捉場景中其他對象的反射光照。 但是,也有一些木屋。 這些要詳細得多。
因為在場景中房屋的數量比地形物體的數量要多,所以你應該將間接分辨率設置為適合房屋的大小。然后,您可以單獨修改地形對象使用的分辨率。這將減少在準備場景時所需的工作量。
考慮到這一點,為默認的間接分辨率設置每個世界單位1個紋素:
假設我們已經決定場景的比例為1單位= 1m,這意味著由Unity的Precomputed Realtime GI創建的單個光照貼圖紋素的大小將等效為1x1米。這可能看起來很低,但請記住,你只是捕捉間接光。來自直接照明的清晰陰影和鏡面反射將由場景中的實時燈光提供。
7.介紹圖表(Charts)
在 Unity 的預計算實時 GI 中,圖表(Chart)是光照貼圖紋理的一個區域,您可以將給定場景對象的光照貼圖 UV 映射到該區域。 您可以將其視為包含影響該對象的照明圖像的小圖塊(tile)。 圖表(Chart)由兩部分組成:輻照度(照明)和方向性(編碼主要光的方向)。
生成預計算實時GI時,會為圖表(Chart)中包含的每個紋素計算光照。場景中大量的圖表(Charts)可能是對預計算時間的最大損害之一,因此了解圖表(Charts)的工作原理以及如何管理它們以優化照明預計算時間非常重要。
圖表(Charts)是如何工作的?
默認情況下,每個圖表至少有 4x4 紋素。 因此,一個圖表至少有16個紋素,而不管世界中對象的比例或相應 UV 殼(shell)的大小。 例如,如果一個對象是 1x1 米,該對象有 1 個圖表(Chart)且間接分辨率為 1,則該對象需要 16 個紋素。
這個最小尺寸使 Unity 能夠將圖表(Charts)拼接在一起,以實現跨幾何邊緣的無縫照明。 Unity 需要沿圖表(Charts)邊緣至少有 4 個紋素,以便在找到并縫合相應的伙伴之前唯一標識它。
實時 GI 不需要填充(No padding is needed for realtime GI),因為在網格導入管道的打包階段,Unity 會鉗制光照貼圖 UV 以在圖表內提供半紋素邊框。 這意味著圖表可以彼此相鄰,并且仍然可以進行雙線性插值而不會交叉出血(cross bleeding),從而節省寶貴的光照貼圖空間。
圖表和優化
想象一下同一個示例 1x1 米對象有 50 個圖表。 Unity 將為該對象創建 800 個紋素,盡管它相對較小。 這演示了擁有大量圖表會如何快速增加紋素的數量。 更多的紋素意味著更多的光照計算和更多的數據來計算、壓縮和存儲。在復雜的場景中,所有這些加起來會導致冗長的預計算和運行時的性能下降。
不適當的圖表是導致預計算未完成或耗時過長的主要原因。考慮到這一點,許多減少預計算時間的明顯策略就是減少場景中圖表的數量。
8.將游戲對象標記為GI貢獻者
要使用預計算實時GI生成照明解決方案,必須啟動預計算進程。首先,你必須在我們的場景中至少有一個對象被標記為Contribute GI。
在Hierarchy視圖中組織和分組游戲對象使它能夠快速和容易地選擇游戲對象以包含在照明預計算中。組織游戲對象層次結構的策略有很多。詳細討論這些不同的策略超出了本教程的范圍。然而,重要的是要理解,當你在場景中進行重復選擇時,擁有一些組織游戲對象的方案將大大提高你的生產力。
在示例場景中,GameObject被組織成到一個名為Environment的父對象下的分類中。這個組包含了所有的可見的,靜態的MeshRenderers,它們組成了我們場景的環境。在此之下,有一些對象的子組,它們在大小或拓撲方面具有相似的特征。
最有效的方法是從粗略地應用照明設置開始,然后隨著您的前進逐步細化細節。 選擇所有環境子游戲對象:
9.啟動預計算進程
現在場景有了一些靜態游戲對象,你可以開始預計算過程:
注意:我們建議您在學習這些教程時保持Auto Generate模式。
10.下一個步驟
在本教程中,您設置了場景,并啟動了照明的預計算過程。接下來,你將在場景中創建和布置光探針。
下一篇 布置光照探針
總結
以上是生活随笔為你收集整理的使用预计算实时全局光照优化照明-设置场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拉扎维RFIC总结与笔记
- 下一篇: 直播http-flv原理