Unreal Engine 4 中的光線追蹤,是強大與靈活的光照系統。它強大的原因是具有高準確性和品質。在過去一直無法即時產生如同此類的陰影和反射效果。
它靈活的原因是可以視需要將光柵與光線追蹤渲染功能混合,製作出想要的場景,以達到想要的效能和品質。
什麼是光柵?基本上在過去的 20-30 年,將以影像為基礎的渲染呈現在螢幕上的方法,都是屬於光柵渲染。您熟悉的所有技巧和方法,例如串聯陰影貼圖、後處理影像調整、螢幕空間反射、環境光遮蔽,甚至是基本的 3D 光照和渲染技術,都是屬於光柵化渲染。
因此,轉換成光線追蹤不是困難的事。我們現在的狀態,是處於保留舊方法允許渲染技術的過渡階段。
在專案中啟用光線追蹤不會排除熟悉的渲染方法,僅有少數例外。例如,您可以使用烘焙光照貼圖及加入光線追蹤反射,或加入光線追蹤動態陰影,並使用立方體貼圖和 SSR 進行反射。系統甚至進一步允許使用 PostProcessVolumes 和命令控制渲染場景的方式,以迅速啟用和停用需要的功能。
本文將逐項探討光線追蹤和光柵功能。我們將會介紹它們的用途,並協助您進一步瞭解系統。
最新的程式碼請參閱 NVIDIA RTX UE4,包含最佳化光線追蹤,同時提供在最新 Unreal Engine 4.25 上執行的 DLSS 渲染技術。我們的最佳化可以將光線追蹤效能提升達 30%,而 DLSS 可以讓畫格率加倍。具有大幅提高效能的能力,且我們也還在不斷努力地精進。若需要更多資訊,請參閱 DLSS 產品頁面。
系統需求
若想要在專案中啟用光線追蹤,必須在您的系統和驅動程式中安裝最新軟體。
- 必要資源
- DX12
- Windows 10 最新版本
- NVIDIA 驅動程式
- 任何 RTX 顯示卡或 GTX 1060 以後的產品
- 在專案偏好設定中啟用光線追蹤
- 將會同時啟用 GPU 外觀快取,才能讓光線追蹤運作
- 將預設 RHI 改為 DX12
- 選擇專案設定、平台、Windows、目標 RHI,以及針對預設 RHI 改為 DX12
比較光線追蹤與光柵化
值得一提的是,您可以使用 PostProcessVolume 控制光線追蹤功能,或透過主控台命令更精細地控制。將可針對每一個區域、情況或層次進行不同的設定。光線追蹤功能可以迅速啟用或停用。
Ray tracing feature | Raster equivalent |
Ray tracing reflections | SSR or cube maps |
Ray tracing shadows | Shadow maps or DFS |
Ray tracing ambient occlusion | SSAO or DFAO |
Ray tracing translucency | Raster translucency |
Ray tracing skylight | Raster skylight |
Ray tracing global illumination | SSGI or LPV |
如先前所述,幾乎所有功能都能以不同的方式混合。部分例外和細節值得注意,本文將於之後一一列舉。
光線追蹤反射
光線追蹤反射是光線追蹤最大的視覺效益,且效能代價也最高。由於光線追蹤反射可以存在任何表面上,並可根據幾何圖形、法線貼圖和材質粗糙度值準確地反射場景,因此,在邏輯上可能需要昂貴代價。但是,有許多微調控制可以讓您達到想要的效能目標。
光線追蹤陰影
更精確的陰影形式可將光線追蹤陰影呈現的更好。相較於其他選項,動態光線追蹤陰影更準確,且與動態光柵陰影比較,效能更好。
光柵與光線追蹤陰影之間的主要差異,在於動畫師花費的時間。在光柵陰影方面,通常必須針對串聯步距和轉換距離進行許多微小的調整,或調整小型幾何圖形,例如接觸陰影調整。在距離場陰影(Distance Field Shadows,DFS)方面,您必須利用時間分別調整靜態網格和骨架網格半影,以嘗試和尋找相配的值,因為此方法中之各種網格類型產生的陰影結果各不相同。
光柵方法的另一個問題可能是場景或幾何圖形的大小。陰影可能會出現在走廊中,但是不能出現在 2 公里的地面上。使陰影在各種場景和幾何比例下顯得一致與正確,需要花費一些時間和精力。不同類型的層次可能需要不同的光照值。
光線追蹤陰影不僅能在視覺上更一致,且能節省寶貴的時間。如果您可以為動態光線插入一組值,並使它們顯得正確,則無論場景多大或多小,都無須盲目嘗試不同的陰影方法設定,即可獲得正確的陰影。
光線追蹤環境光遮蔽
如同光線追蹤陰影,光線追蹤環境光遮蔽(ray tracing ambient occlusion,RTAO)也具有極高的準確性。簡言之,在物理上,RTAO 比螢幕空間環境光遮蔽(screen space ambient occlusion,SSAO)更準確,但是代價也較高。可能會增加 1-2ms 以上,視設定而定。您可以將光線追蹤的特色混合與搭配。您的場景可以同時具有光線追蹤陰影和 SSAO,且完全有效。
RTAO 可以採用與 SSAO 或 DFAO (distance field ambient occlusion)不同的數值。因為 RTAO 除具有 DFAO 缺乏的準確性外,RTAO 也不受限於 SSAO 等螢幕空間渲染。您可以使用超過螢幕空間的較大數字,獲得更好的視覺效果。
光線追蹤半透明
光線追蹤半透明可能是更驚人的視覺效果之一。在過去,半透明是即時圖形中最難實現的效果。速度緩慢、無法正確進行深度排序,且通常存有會對動畫師造成拘束的限制。光線追蹤半透明可能會使您對於這些圖形的看法完全改觀。
雖然渲染代價仍然很高,但是光線追蹤可以呈現新的效果。由於能準確地逐像素發射光線和光子穿過幾何圖形,因此可以解決深度排序問題。將能減少一些限制,讓動畫師可以在更多情況下輕鬆使用半透明效果。光線追蹤半透明表面可以照亮、反射光線,以及輕易完成光柵化無法達到的效果。
光線追蹤半透明也可以進行折射,彎曲穿過半透明表面的光線。光柵化可透過材質效果偽造出某些效果,例如折射。即使在光柵化中,也可能存有準確性的問題。通常必須根據材質調整表面,以呈現正確的外觀。
NVIDIA RTX UE4 包含另一個選項:混合半透明。它融合了光線追蹤與光柵半透明,具有更高的相容性和效能。
光線追蹤天光
光線追蹤天光可以從天穹創造柔和的光影。將天光設為投射光線追蹤陰影,並標記為靜態或動態時,會從投射自天空的光子產生陰影。
確實模擬全域照明中一些應有的元素,即柔和陰影環境光。為任何可看到天空的場景貢獻光影。
光線追蹤全域照明
全域照明是以分散、反射的方式反彈光子,在鄰近表面之間創造出環境陰影和色彩滲透。您可以想像,使用掃描線光線追蹤器很難做到此效果,更別提即時了!但是光線追蹤全域照明(ray tracing global illumination,RTGI)正在朝向使之成真的方向開發。
在 Unreal Engine 4.25 中,存有適合現今使用的 RTGI 建置。RTGI 是採用最終聚集方法,在效能與品質之間達到良好的平衡。歡迎進行測試,看一看它對您的場景有什麼影響。您可以提高取樣率以排除視覺問題,但是會伴隨逐漸升高的效能代價。
NVIDIA 正在開發新的 GI 形式,稱為 RTXGI。若需要更多資訊,請參閱 RTX Global Illumination SDK Now Available。
使用光柵方法
還可以使用光柵方法嗎?簡短的答案是可以(在大多數情況下),但是,某些系統在光線追蹤環境中是多餘的或未 100% 建置。
光線追蹤可以支援 90% 的系統、材料和物件類型,僅有少數例外。可以渲染樣條網格,但是不會投射動態光線追蹤陰影。BSP 也一樣,不過 BSP 系統已經過時,現在很少有遊戲使用此系統。Epic 的文件中列載了相容物件和材質類型清單。
光線傳播體積(Light Propagation Volumes,LPV)是另一種極端的情況。光線傳播體積是使用立體像素模擬 GI 色彩反彈的技術。如同許多光柵化渲染方法,是屬於近似性質且通常為低解析度。在開啟光線追蹤的情況下,LPV 無效。此情形不會影響大多數的專案,因為大部分遊戲可能都不使用 LPV。未來將會出現專為光線追蹤而設計,更好的 GI 解決方案。
將場景最佳化
以下是六個不錯的最佳化或考量,可以協助使場景順暢運作:
- 使用 STAT GPU 進行故障排除
- 監控 STAT RHI
- 使用 RayTracing 主控台命令
- 依據距離剔除動態陰影投射光線
- 全域箝制光線追蹤反射粗糙度
- 使用半解析度反射
使用 STAT GPU 進行故障排除
最佳做法是掌握場景中有哪些東西會影響效能,並據此設定最佳化目標。許多個別項目都可以調整,所以首要步驟是瞭解情況。
使用 STAT GPU 掌握資訊。STAT GPU 提供了各種渲染類別的大致分類,包括光線追蹤的渲染代價。
每一個場景都各不相同。如果場景運作不順時,請查看 STAT GPU,以判斷必須執行的動作。即使您不知道如何修正特定類別,只要能掌握資訊就可以更輕鬆地尋找該類別的主題專家,詢問如何改進。
監控 STAT RHI
我個人喜歡這個,因為基本上它只會呈現整體概況。例如大約使用多少 GPU 記憶體、繪製多少個三角形,以及可能是最重要的 DrawPrimitive 呼叫(又稱為繪製呼叫)數據。
在現代渲染中,三角形計數已經變得比較不重要。強大的 GPU 可以繪製一整天的三角形,但是繪製呼叫通常會對效能造成極大的限制。如果在光柵下對場景有害,則在光線追蹤下同樣對場景有害。控制繪製呼叫非常重要。
盡可能減少渲染網格仍具有意義,以及將多材質物件最少化仍是一個好方法。有一種技巧是降低 LOD,以使用較少的材質,在遠距離執行較少的繪製呼叫。最好的方法之一是利用剔除距離體積,並盡可能降低繪製的網格數量。另一種方法是利用 HISM 執行個體化網格系統。其內建於 UE4,為您提供另一種減少執行階段之繪製呼叫的方法。
使用 r.RayTracing 主控台命令
r.RayTracing 類別中有一些實用的命令值得嘗試,看一看各種效果。我想要特別指出其中的一項:r.RayTracing.ForceAllRayTracingEffects。它的用法很簡單:
- 若設為 0,則關閉所有的光線追蹤效果。
- 若設為 1,則強制開啟所有的光線追蹤效果。
- 若設為 -1,則可以還原設定預設值。
使用此命令可以快速找出發生的問題。如果已設為 0,而場景仍運作不順時,表示光線追蹤不是罪魁禍首。
依據距離剔除動態陰影投射光線
另一種通常有效的最佳化仍適用於光線追蹤。設定陰影投射動態光線的最大距離值,將會大幅影響效能。
場景中可以有多少個陰影投射器,沒有明確的基準。主要是取決於光線的大小以及接觸多少物件。根據距離因數收緊和剔除的數量越多,場景的效能越好。
NVIDIA RTX UE4 具有其他的最佳化,可以箝制陰影投射光線的數量,並排定從去雜訊陰影退回銳利陰影的優先順序。這些全域 CVAR 可以在大量使用動態陰影投射光線的專案中,大幅提高效能。
全域箝制光線追蹤反射粗糙度
這是一種簡陋的最佳化,不一定適合所有的專案。但是,很容易嘗試,可以協助判斷光線追蹤反射是否會造成代價。
在光線追蹤反射下的 PostProcessVolume 中,最大粗糙度值是預設為 0.6。可以設定的數值越低,光線追蹤反射的整體代價越小,因為任何高於此粗糙度值的反射表面都會改用立方體貼圖。請嘗試設為 0.2 或 0.3,有助於將光線追蹤反射侷限在鏡面表面。
您也可以使用 r.RayTracing.Reflections.MaxRoughness (0-1) 主控台,命令全域控制此值。較粗糙的反射較模糊,且在視覺上,粗糙的反射與立方體貼圖可能沒有差別。此方式確實很有可能會節省效能。
使用半解析度反射
反射有許多選項和控制項,且大多數的各種光線追蹤效果都是如此。但是其中有一項可以立即見效:嘗試將 r.RayTracing.Reflections.ScreenPercentage 從預設值 100 改為 50。將會使用四分之一的解析度渲染任何光線追蹤反射的像素,並進行升頻,通常可以大幅提升反射效能。
我們在 NVIDIA RTX UE4 中提供使用設定值 70 的額外選項,可使用半解析度渲染反射提高品質,同時可以明顯提升效能。
在某些情況下,可能幾乎無法察覺到品質的差異。至少,對於想要最大畫格率的使用者來說是很好的選擇。低解析度反射結合 DLSS 等智慧升頻方法,可能是讓光線追蹤保持快速運作的合理選擇。
接下來呢?
之前所述的一些技巧僅專屬於此分支,例如將反射解析度設為 70%。若需要更多資訊,請參閱 NVIDIA RTX UE4。
感謝您的閱讀。如果您的遊戲有任何問題需要我協助解決時,歡迎在留言或論壇中提出。