使用预计算实时全局光照优化照明-优化实时光照贴图
本文地址:https://blog.csdn.net/t163361/article/details/123994783
翻譯說明:
教程翻譯主要用谷歌翻譯后,對特別不通順的地方進行了微調。同時針對一些比較重要的地方保留了英語或英語和漢語同時存在的方式。
教程目錄
優化實時光照貼圖
中級 1 小時
摘要
在本教程中,您將改進由 Unity 的預計算實時 GI 生成的自動展開 UVs功能。
1.概述
現在您已經從光照預計算中排除了合適的對象,您可以開始通過優化 UV 展開來減少剩余圖表(Charts)的數量。
圖表被創建來包含一個靜態網格渲染器的UV光照貼圖坐標。 因此,對象所需的圖表數量在很大程度上取決于展開相關對象所需的 UV 殼(塊)的數量。 展開始終是幾何面上紋理像素分布失真與足夠紋理覆蓋所需的殼數之間的權衡。
2.了解 Unity 的展開算法
Unity 復雜的展開算法通常無需您的干預即可獲得良好的結果;但是,有時您需要提供一些指導。因此,了解自動展開背后的理論和過程非常重要。
讓我們回顧一下如何投影或展開對象上的 UV 的三個不同示例:
示例 1
在第一個示例中,結果基本上沒有失真。用作紋理的方格圖案的映射方式是,紋理的每個圖塊在縱橫比上保持正方形。如果你想象這個棋盤是一個光照貼圖(一張應用在物體上的燈光的“圖像”),你會得到一個看起來正確且沒有失真的結果。
但是,您需要使用六個 UV 殼來獲得這種覆蓋。結果,您將使用 Unity 的預計算實時 GI 系統獲得六個圖表。無論對象的大小如何,每個圖表都需要至少 4x4 紋素,這意味著該對象將使用至少 96 紋素,而與分辨率無關。
示例 2
在第二張圖片中,有一個不同的問題。 對象的 UV 紋理坐標已被投影,因此有一個完整的 UV 殼覆蓋所有面。
雖然這在覆蓋對象所需的圖表數量方面是最佳的,但視覺結果會出現不可接受的失真。 您可能會看到應用在對象表面上的紋理“涂抹”。 對象的面也在 UV 紋理空間中重疊——這意味著如果您引用光照貼圖,來自對象一側的光照將顯示在相對的面上。 這種展開對象的方法不會給您可接受的結果。
示例 3
第三張圖片顯示了理想展開的示例。結果沒有失真:棋盤紋理的瓷磚在縱橫比上保持正方形。我們還成功地覆蓋了對象的所有面,同時僅輸出一個 UV 殼。這是通過連接或縫合與模型上的連續幾何邊緣相對應的 UV 邊緣來實現的。
如果您以編程方式考慮這一點,我們做了什么來實現理想的展開?
首先,我們將 UV 投影正交投影到對象上,以創建單獨的殼。
然后,我們評估這些殼的邊緣,這些邊緣在相應對象的幾何形狀中共享。
在找到共享邊的地方,我們將這些殼移動并縫合到它們相鄰殼的伙伴邊緣。
這就是 Unity 的展開算法嘗試對靜態幾何體自動執行的操作。
3.可視化圖表
在優化展開圖表和光照貼圖圖表之前,您需要一種在編輯器中可視化它們的方法。圖表是在網格導入管線的展開階段生成的。對于預計算實時 GI,這些圖表隨后在預計算過程的幾何階段被打包到圖集中。這是為了確保它們不會重疊。
只有在預計算的幾何階段完成并保存可視化數據后,您才能看到圖表的預覽。
重要提示:如果您作為團隊的一部分使用版本控制,請注意此信息在本地緩存。這意味著在各種診斷繪制模式可用之前,必須在本地計算機上執行預計算。
您可以采用兩種不同的方法來可視化圖表。
選項 1:使用 UV 圖表繪制模式
快速可視化圖表的一種方法是使用場景視圖中的 UV Charts繪制模式。使用此模式,圖表可以被視為不同顏色的面板,上面覆蓋著代表相應光照貼圖分辨率的棋盤紋理。要使用此模式:
選項 2:使用照明窗口預覽窗格
處理復雜對象時,很容易錯過場景視圖中的圖表。通過使用 Lighting 窗口中的 Preview 窗格,您可以查看單個對象使用的所有圖表。這可以幫助您更準確地評估這些對象的展開,這將幫助您減少場景中的圖表計數。
要使用預覽窗格:
該對象使用的圖表數量將由彩色方塊表示,上面覆蓋有相應的淺藍色 UV 坐標。
4.展開參數:Optimize Realtime UVs
您可以調整許多設置以優化 UV 展開。所有這些設置都是針對每個對象的。您可以在“照明”窗口中訪問這些設置:
Optimize Realtime UVs
Unity 的自動展開算法允許用戶在編輯器中創作光照貼圖 UV。您可以使用 Optimize Realtime UVs 選項來訪問這些控件,這些控件可以在 Mesh Renderer 組件的 Lightmapping 折疊下找到。
啟用此選項會公開兩個屬性:Max Distance 和 Max Angle。您將在本教程的后面部分查看這些屬性。
在某些情況下,使用自動展開器可能無法獲得理想的展開。最終可能會在光照貼圖中出現太多圖表或不可接受的失真(在 GI 圖表繪制模式下顯示為拉伸棋盤格)。在這些情況下,可能需要在模型文件的 UV01 通道中手動創作 UV。這是在您選擇的內容創建包中需要完成的工作。
如果是這種情況,請禁用 Optimize Realtime UVs 設置,以強制 Unity 的展開算法保留定義在模型的 UV01 通道中的 UV 殼的形狀。
需要注意的是,這些外殼將始終重新打包以節省光照貼圖空間。這是單獨展開外殼的方式,它將被保留,而不是使用在光照貼圖中的位置(此句翻譯可能有誤,后面是原句:It is the manner in which the shells are unwrapped, individually, which will be preserved rather than the shell’s position within the lightmap)。
重要提示:使用此方法時必須小心。 在光照貼圖 UV 包含大量 UV 殼的情況下,此選項實際上會增加預計算時間。 這是因為繞過了Unity 的自動展開器提供的 UV 合并步驟,并且保留了手動 UV 布局。 請記住,期望的結果是盡可能少的 UV 殼 - 因此盡可能少的圖表 - 同時保持可接受的失真水平。
5.展開參數:Max Distance
Unity 的展開算法試圖通過移動外殼并將 UV 邊緣縫合在一起來簡化光照貼圖 UV。僅當殼在 Max Distance 定義的距離內時,這些UV殼才會被此操作考慮。此范圍以 Unity 的世界空間單位定義。請記住,在示例場景中,我們假設單位為 1 米。
在許多情況下,0.5 個單位的默認值將給出可接受的結果。對于具有很多面的特別大的對象,可能需要增加此值。這是為了防止合適的候選 UV 被拼接算法排除在選擇之外。
增加最大距離通常會減少所選對象所需的圖表數量。減小這個值在光照貼圖紋素可見拉伸的情況下很有用,我們實際上可能需要更多圖表來獲得所需的紋素覆蓋。使用 UV Charts Scene視圖繪圖模式中的棋盤覆蓋可以輕松評估這些更改的結果。找到正確的平衡通常需要一些實驗。
6.展開參數:Max Angle
照明 UV 殼也會根據相應網格的相鄰面之間的角度進行縫合評估。Max Angle定義共享 UV 邊的面之間允許的最大角度,并使用內角進行計算。如果背面之間的角度大于此值,則不會考慮縫合這些 UV 殼。
增加此值將使光照 UV 更有可能通過 Unity 的展開算法進行組合。因此,最大角度是減少選定對象所需圖表數量的好方法。但是,有時當此容差過于寬松時,可能會出現拉伸光照貼圖。減小最大角度將使展開器不太可能合并 UV 邊緣,這將導致更多圖表但更少失真。
同樣,在 UV Charts Scene 視圖渲染模式中使用棋盤疊加是評估您正在使用的值的適用性的好方法。
7.展開參數:Ignore Normals
在某些情況下,網格導入器可能會決定分割幾何體。這也會影響圖表。例如,如果網格具有極高的三角形數,則 Unity 將其拆分為單獨的子網格可能會更高效。通常這是針對硬件特定要求,例如減少每次繪制調用中的三角形數量。這些分裂發生的位置是根據相鄰網格面之間的法線角度存在較大差異的區域(例如硬邊)來確定的。
在模型的網格導入過程中以這種方式拆分網格。在此過程中,圖表可能會被拆分,因為圖表中的邊可能會被分離,從而導致多個外殼,這反過來又需要額外的圖表。
有時不希望以這種方式拆分圖表。圖表數量的增加可能不利于預計算時間,并且光照接縫可能會導致生成的光照貼圖中出現不需要的視覺偽影。在這些情況下,啟用 Ignore Normals 屬性將防止圖表被拆分以用于預計算實時 GI 照明。
注意:只有預計算實時 GI 受此選項影響。選定網格中的分割仍保留用于 Unity 中的其他用途。
8.優化預計算時間:隔離感興趣的對象
復雜的場景可以包含數百甚至數千個靜態對象。為所有這些對象生成圖表圖集可能會導致緩慢的照明預計算,這會對您在場景上迭代的速度產生負面影響。
在嘗試對象的展開設置時,有時將感興趣的對象隔離在空場景中會很有用,您可以在其中以最少的預計算時間快速迭代。然后可以取回您確定的展開設置并將其應用于原始場景中該類型的其他對象。在準備照明場景時,以這種方式工作可以節省大量時間。
讓我們將房屋對象隔離為感興趣的對象:
9.優化預計算時間:查看對象的 UV 展開設置
配置展開參數時,理想的結果是找到導致圖表數量最少且光照貼圖失真最小的值的組合。請記住,當啟用UV圖表繪制模式時,扭曲將可視化為應用于場景視圖中的對象的棋盤紋理的拉伸。
棋盤圖案可用于可視化光照貼圖紋理分布。請注意,在下面的示例中,整個模型中的棋盤格相對一致——這意味著光照貼圖失真很小。
在第二個示例中,這個示例棋盤的拉伸和扭曲表明光照貼圖紋素的分布存在一些不一致。
讓我們應用您學到的關于 UV 展開的知識來優化教程項目中對象的預計算時間:
HouseBig02 在我們的場景中是一個相當復雜的對象,這可能證明使用多個圖表是合理的。但是,我們仍然可以通過修改我們的展開設置來減少這個數字。
10.優化預計算時間:調整最大距離
沒有一種萬能的解決方案來展開對象。 Unity 的展開算法試圖根據適當的默認值做出明智的決定,但在一些用戶指導下,它可能能夠獲得更優化的結果。
減小最大距離
讓我們從減小最大距離開始:
預計算過程將開始。經過簡單的計算,您會在 Lighting 窗口的 Preview 區域中看到 Charts 的數量明顯增加。檢查場景視圖似乎沒有什么失真,這很好。然而不幸的是,此類復雜的對象具有這么多圖表是不可接受的。請記住,更多圖表意味著更長的預計算時間并降低運行時的性能。
增加最大距離
讓我們嘗試增加 Max Distance 值:
你現在有相反的問題。圖表的數量有所減少,但代價是給光照貼圖帶來了不可接受的失真。您可以在 UV Charts場景視圖渲染模式中觀察到這種失真。失真顯示為棋盤覆蓋的條紋或拉伸。
您現在知道 Unity 的展開算法試圖通過將 UV 殼合并在一起來最小化圖表的數量。最大距離設置指定考慮合并時 UV 殼之間允許的最大距離(在世界空間中)。如果殼之間的距離超過此值,則它們不會被合并。
在您的實驗中:
- 當您減小最大距離時,符合合并條件的 UV 殼會減少。這意味著在流程結束時會保留更多單獨的圖表。
- 當您增加最大距離時,在世界空間中相距很遠的 UV 殼隨后能夠被合并。這導致圖表更少,但這種激進的合并也導致光照貼圖 UV 扭曲,因此光照貼圖輸出出現更多失真。
請注意,對于大型對象,有時可能需要增加最大距離以適應網格內面的大小。相反,隨著較小的對象減小最大距離可能會產生更好的結果。
優化最大距離
對于這個示例對象 HouseBig02,Max Distance 值為 0.8 可以很好地平衡圖表計數和失真:
但是,仍然可以進行一些進一步的改進。
11.優化預計算時間:調整最大角度
現在讓我們回顧一下 Max Angle 參數。與 Max Distance 一樣,此值會影響 Unity 展開算法的 UV 合并步驟。除了在合并 UV 殼之前測試距離外,展開器還測試相鄰網格面之間的角度。只有角度低于此值的邊才會被考慮合并。
較小的最大角度意味著較少的邊緣將通過測試。結果,將合并更少的 UV 殼,并且圖表的數量將增加。相反,更大的 Max Angle 意味著合并算法將更能容忍面之間的角度。可能會合并更多的 UV 殼,其結果可能是更少的 UV 殼,因此圖表也更少。與 Max Distance 一樣,如果由于公差過大而組合了不合適的邊緣,最終光照貼圖 UV 中可能會出現失真。
減小最大角度
讓我們嘗試減小最大角度:
當您回顧 Lighting 窗口的 Preview 區域時,我們會注意到創建的圖表數量高得無法接受。這是因為在考慮合并之前,您只允許面之間的偏差為 0 度或更小。這幾乎可以肯定意味著沒有 UV 外殼將通過測試,因此許多圖表將在合并過程之后依然被保留。
增加最大角度
接下來,讓我們嘗試增加最大角度:
您應該注意到圖表的數量隨著值的增加而減少。這是因為考慮合并的網格面之間允許的角度更寬容。更多的 UV 殼通過測試并將被合并。因此,光照貼圖 UV 殼的數量減少了,相應的圖表數量也減少了。這種方法對于減少具有圓形表面的對象上的圖表特別有用。
優化最大角度
對于此示例對象 HouseBig02,Max Angle為 93 可提供良好的結果:
請注意,在進行簡短的預計算后,Lighting 窗口的 Preview 區域中的圖表數量是如何減少的。
12.優化預計算時間:返回工作場景
在這個階段,您優化的展開設置可以帶回工作場景:
當應用于包含數百個對象的場景時,這些設置為您帶來的適度節約可以增加更顯著的優化效果。
13.Unwrap設置和Prefabs
展開設置可以存儲在 Prefab 中,方法是將它們應用到 Prefab 層次結構中的任何 Static MeshRenderer 組件。或者,也可以將展開設置應用于場景中的單個游戲對象。應用于場景中預制件實例的展開設置將覆蓋存儲在預制件中的設置。這種工作方式為您提供了一些設置場景照明的有用方法。
逐預制件設置
為預制件配置默認展開和照明設置通常很有用。如果要多次實例化預制件,則可以省力地預先配置該對象的展開,而不必在整個場景中重復指定。
逐預制變體設置
作為 Unity 2018.3 版本中引入的嵌套預制件功能的一部分,現在可以創建預制件變體。 Prefab Variant 從作為其變體的 Prefab 繼承屬性(稱為基礎 Prefab)。您可以為基于基礎預制體創建的每個預制變體覆蓋這些屬性。這是一種非常有用的方式來配置適用于大多數場景的默認設置,然后在特殊情況下覆蓋這些設置。
例如,如果在可播放區域內可以近距離看到 Prefab Variant,那么在該 Variant 上使用更高保真度設置是有意義的。如果 Prefab Variant 距離很遠,那么使用照明預算來維持相同的資源密集型設置是沒有意義的。在這種情況下,您可以采用的更好方法可能是降低光照貼圖的質量并在展開時使用更積極的拼接參數。
14.在整個場景中應用展開設置
現在是時候開始將您學到的關于 Unity 自動展開算法的知識應用到 LightingTutorialStart 場景中剩余的靜態幾何體了。通過系統地工作,設置場景以顯著改善預計算時間應該不需要很長時間:
此時,您應該應用您所學到的關于展開參數的知識,并隨意嘗試不同的值。請記住將 UV Charts Scene 視圖 Draw Mode 與 Lighting 窗口的 Preview 區域的 Charting 模式結合使用。這將使您能夠在光照貼圖失真和所需圖表數量之間找到適當的平衡。
訓練指導
LightingTutorialOptimal 場景可以在您不確定的情況下用作參考。請注意,在某些情況下,甚至可能根本不需要更改默認展開值。默認值實際上可能提供最佳結果。
要完成此練習:
以這種方式有條不紊地工作,設置場景中所有靜態幾何體的展開值應該不會超過幾分鐘。這種手動準備的結果將是在照明場景時更快的迭代和更好的運行時性能。
15.下一步
在本教程中,您探索了展開在減少項目中圖表數量方面的作用,這可能對照明優化產生重大影響。
接下來,您將通過微調 Unity 項目中的光照貼圖參數來完成此學習體驗。
下一篇 微調光照貼圖參數
總結
以上是生活随笔為你收集整理的使用预计算实时全局光照优化照明-优化实时光照贴图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 秒懂---LDA算法
- 下一篇: db2 sqlcode