認識 Unreal Engine 4 中的光線追蹤

作者 NVIDIA Developer

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
表 1:光線追蹤與光柵功能的比較

如先前所述,幾乎所有功能都能以不同的方式混合。部分例外和細節值得注意,本文將於之後一一列舉。

光線追蹤反射

圖 1:注意反射及其在表面周圍的彎曲方式。這些反射也是半解析度。

光線追蹤反射是光線追蹤最大的視覺效益,且效能代價也最高。由於光線追蹤反射可以存在任何表面上,並可根據幾何圖形、法線貼圖和材質粗糙度值準確地反射場景,因此,在邏輯上可能需要昂貴代價。但是,有許多微調控制可以讓您達到想要的效能目標。

光線追蹤陰影

圖 2:陰影半影是很棒的光線追蹤效果,且是以光線為單位。

更精確的陰影形式可將光線追蹤陰影呈現的更好。相較於其他選項,動態光線追蹤陰影更準確,且與動態光柵陰影比較,效能更好。

光柵與光線追蹤陰影之間的主要差異,在於動畫師花費的時間。在光柵陰影方面,通常必須針對串聯步距和轉換距離進行許多微小的調整,或調整小型幾何圖形,例如接觸陰影調整。在距離場陰影(Distance Field Shadows,DFS)方面,您必須利用時間分別調整靜態網格和骨架網格半影,以嘗試和尋找相配的值,因為此方法中之各種網格類型產生的陰影結果各不相同。

光柵方法的另一個問題可能是場景或幾何圖形的大小。陰影可能會出現在走廊中,但是不能出現在 2 公里的地面上。使陰影在各種場景和幾何比例下顯得一致與正確,需要花費一些時間和精力。不同類型的層次可能需要不同的光照值。

光線追蹤陰影不僅能在視覺上更一致,且能節省寶貴的時間。如果您可以為動態光線插入一組值,並使它們顯得正確,則無論場景多大或多小,都無須盲目嘗試不同的陰影方法設定,即可獲得正確的陰影。

光線追蹤環境光遮蔽

圖 3:光線追蹤環境光遮蔽,強度為 1.0,距離值為 450。

如同光線追蹤陰影,光線追蹤環境光遮蔽(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 等螢幕空間渲染。您可以使用超過螢幕空間的較大數字,獲得更好的視覺效果。

光線追蹤半透明

圖 4:場景中的半透明鏡面立方體可以反射和折射光線。

光線追蹤半透明可能是更驚人的視覺效果之一。在過去,半透明是即時圖形中最難實現的效果。速度緩慢、無法正確進行深度排序,且通常存有會對動畫師造成拘束的限制。光線追蹤半透明可能會使您對於這些圖形的看法完全改觀。

雖然渲染代價仍然很高,但是光線追蹤可以呈現新的效果。由於能準確地逐像素發射光線和光子穿過幾何圖形,因此可以解決深度排序問題。將能減少一些限制,讓動畫師可以在更多情況下輕鬆使用半透明效果。光線追蹤半透明表面可以照亮、反射光線,以及輕易完成光柵化無法達到的效果。

光線追蹤半透明也可以進行折射,彎曲穿過半透明表面的光線。光柵化可透過材質效果偽造出某些效果,例如折射。即使在光柵化中,也可能存有準確性的問題。通常必須根據材質調整表面,以呈現正確的外觀。

NVIDIA RTX UE4 包含另一個選項:混合半透明。它融合了光線追蹤與光柵半透明,具有更高的相容性和效能。

光線追蹤天光

圖 5:如圖所示,在設定光線追蹤天光的情況下,下半部是標記為關閉,以便從下方投射柔和的遮蔽光照。

光線追蹤天光可以從天穹創造柔和的光影。將天光設為投射光線追蹤陰影,並標記為靜態或動態時,會從投射自天空的光子產生陰影。

確實模擬全域照明中一些應有的元素,即柔和陰影環境光。為任何可看到天空的場景貢獻光影。

光線追蹤全域照明

圖 6:使用蠻力方法之 RTGI 的效果不錯,但是對於畫格率的影響相對較高。

全域照明是以分散、反射的方式反彈光子,在鄰近表面之間創造出環境陰影和色彩滲透。您可以想像,使用掃描線光線追蹤器很難做到此效果,更別提即時了!但是光線追蹤全域照明(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 進行故障排除

圖 7:您可以使用 STAT GPU 主控台命令,瞭解哪些系統和功能對場景畫格率的影響最大。

最佳做法是掌握場景中有哪些東西會影響效能,並據此設定最佳化目標。許多個別項目都可以調整,所以首要步驟是瞭解情況。

使用 STAT GPU 掌握資訊。STAT GPU 提供了各種渲染類別的大致分類,包括光線追蹤的渲染代價。

每一個場景都各不相同。如果場景運作不順時,請查看 STAT GPU,以判斷必須執行的動作。即使您不知道如何修正特定類別,只要能掌握資訊就可以更輕鬆地尋找該類別的主題專家,詢問如何改進。

監控 STAT RHI

圖 8: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

感謝您的閱讀。如果您的遊戲有任何問題需要我協助解決時,歡迎在留言或論壇中提出。