# [翻譯]The High Definition Render Pipeline: Focused on visual quality #### [原文](https://blogs.unity3d.com/2018/03/16/the-high-definition-render-pipeline-focused-on-visual-quality/) by Sebastien Lagarde, March 16, 2018 > [在上一篇文章](https://blogs.unity3d.com/2018/01/31/srp-overview/)中, 我們介紹了`Scriptable Render Pipelines`. 簡單來說, SRP 可以讓使用者用C#腳本, 去控制 Unity 如何繪製一個畫面. 我們將會隨著 2018.1 釋出兩內建的 **渲染管道 render pipelines** : `Lightweight Pipeline`和`HD Pipeline`. 在這篇文章中, 我們將重點放在`High Definition Render Pipeline`或稱`HD RP`. HDRP 旨在提供開發人員實現高畫質視覺效果的工具. 其設計遵循著三個原則: - Physically based rendering(基於物理的渲染) - Unified and coherent lighting(統一且連貫的光照) - Features independent of the rendering path(功能對於rendering path的獨立性/功能不限於特定rendering path) `Physically based rendering` 立基於三大支柱: **光照 Lighting**、**材質 Material**以及 **攝影機 Camera**. 光照及材質依賴物理相互作用並有明確的 **解耦 decoupling** 關係, 用以確保在各種光照條件下得到連貫的結果. 攝影機則是負責翻譯這些光照結果會如何顯示在螢幕上. 目標是讓創作者可以更容易獲得合理的結果. `Unified lighting` 意味著場景中的所有物件和參與的 **介質 media** 們都應該接受到相同的光照. 在不透明的、透明的或體積材質[^VolumetricMaterials]之間都不應該有所區別. [^VolumetricMaterials]: Volumetric Materials, [体积材质(大气)](http://help.autodesk.com/view/MAYAUL/2016/CHS/?guid=GUID-E985864A-133C-47E6-B989-890EDB920D9F) 在现实世界中,当您拍摄某个对象的照片时,该对象通常位于大气(空气)中,并由其他对象(背景)包围。体积材质描述占用空间体积(如雾、烟、灰尘或其他精细粒子)的现象的物理外观。可以光线跟踪体积材质,并生成效果,如透过镜面反射和折射显示灯光雾。連貫的光照意味著材質必須與任何光源(reflection probe, area lights…)正確地相互作用, 即使是被貼花系統(Decal)修改過的. 這會讓結果更加連貫. 在實時渲染中有各式各樣的渲染途徑: Deferred/Forward, SinglePass/Multipass, Tile/Cluster… 在開發遊戲時, 通常選擇一條途徑就會限制只能使用部分的視覺效果. 對於 HDRP 來說, 我們嘗試在任何途徑都能使用相同的視覺效果. 這讓選擇繪製途徑的只需考慮效能而非遊戲需要用到那些功能. 在開發 HDRP 的過程中, 我們盡可能地遵循這些原則. ## Who is it for? HDRP 目標是高端PC以及家機, 並優先考慮令人驚嘆的高解析度視覺效果. 我們想要將3A級的視覺效果交給較小型的團隊使用. 它假設會使用至少DX11等級的功能以及大量使用著色器計算. 這裡的代價就是 HDRP 無法在較弱的平台上運行. 其目標支援的API是 D3D11, D3D12, GNM (PlayStation 4), [Metal](https://zh.wikipedia.org/wiki/Metal_(API)) 和 [Vulkan](https://zh.wikipedia.org/wiki/Vulkan_(API)). 計畫會支援 VR, 在目前的預覽中還無法使用. 此外, HDRP 帶來全新的功能和行為, 這需要學習和重新設計. 我們提供一個方便的轉換工具, 用來將使用 Unity 內建 shader 的 material 改用 HDRP. 但它只是快速重設 material 和 texture, 其他如光照、後製、場景設定、圖像設定以其自製的 shader 都要自行另外處理. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP15.png "Example of Viking Village project upgrade.") 最後, HDRP 目前還在預覽階段, 這表示它還不適用於產品上. ## Lighting improvement HDRP 帶來全新的光照架構: 它使用了混和 Deferred / Forward – Tile / Cluster 的渲染器. 這些單字意味著它比 Unity 內建的渲染可以使用更具規模的場景燈光. 這個新的光照架構是著重在效能上的. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP11.png "Debug mode to visualize tiled light list.") 另外, HDRP 還有各種附加的光照屬性以及新的光照編輯器. 它可以做到光照的淡出, 只影響 diffuse 或 specular 光照, 或使用色溫去設定光的顏色. Spotlight 現在可以控制內角度以及不同的形狀(錐形、方形或金字塔形). 也支援 Colored cookies. :::info 這裡的 `Colored cookies` 不知道指的是甚麼..? ::: ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP2.png) HDRP 允許使用實時的區域光源(目前不支援陰影和烘焙), 像是矩形光. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP10.png) 最後, 光照遵循物力反向平方衰減且使用物理光單元(physical light Unit). 光照和它的控制完全採用線性處裡(linear), 不再支援 Unity 內建的 `Gamma mode`[^gammamode]. 太陽光在地平線上的強度以 lux[^lux] 為單位, point & spot 光源則以 Lumen[^lumen] 為單位. [^gammamode]: 詳見 [Unity 官方文件](https://docs.unity3d.com/Manual/LinearRendering-LinearOrGammaWorkflow.html)對於 linear & gamma 的說明. [^lux]: *勒克斯(Lux,通常簡寫為lx)是一個標識照度的國際單位制單位,1流明每平方米面積,就是1勒克斯。* https://zh.wikipedia.org/wiki/%E5%8B%92%E5%85%8B%E6%96%AF [^lumen]: *流明(英語:Lumen), 號為lm,是光通量Φ的國際單位制導出單位。* https://zh.wikipedia.org/wiki/%E6%B5%81%E6%98%8E ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP7.jpg) 在基於圖像的光照部分, reflection probes 在 HDRP 內得到極大的提升. 它現在可以使用 **包圍體 Oriented bounding box** 或是球形, **替代形狀 proxy shape**, 近似於該場景幾何體的區域)和影響形狀(像素會被影響到的區域)可分開定義, 有各種影響衰減的選項(對每個面、基於法線的方向...). ## Material Rendering HDRP 擁有它自己的 **Standard Shader** 稱為 **Lit Shader**. 它擁有大量很棒的功能以及可以提供比 Unity 內建渲染更加豐富的材質. 如雙面顯示的選項可設定、自動連結自 Global Illumination 以及各種 mapping 選項可使用(e.g. 平面 or 三軸[^planar_triplanar]). 像是 **視差遮蔽映射 parallax**[^POM]或是 **曲面細分 Tessellation**[^Tessellation]之類的進階特效也能一鍵開啟! [^planar_triplanar]: 這裡分別是指 planar & tri-planar. 用來處理 UV 拉伸問題的技術. 可參考[Unity地形三轴纹理映射(Triplanar)](https://www.wonderm.cc/2016/11/05/Unity-Terrain-TriplanarSplatmap/) [^POM]: *parallax occlusion mapping is an enhancement of the parallax mapping technique.* https://en.wikipedia.org/wiki/Parallax_occlusion_mapping 可參考[[译] GLSL 中的视差遮蔽映射(Parallax Occlusion Mapping in GLSL)](https://segmentfault.com/a/1190000003920502) [^Tessellation]: *曲面細分(tessellation)是一種將多邊形細分為碎片的方法。* https://www.nvidia.com.tw/object/tessellation_tw.html ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP4.png) 但對於材質渲染最大的新增是它的光照模組. HDRP 使用以下的 BRDF[^BRDF]: 給 specular layer 用的 `Isotropic multi scattering GGX` 以及給 diffuse Layer 用的 `Disney Diffuse`. 這裡與內建的差別在於 multi-scattering 的部分. [^BRDF]: *雙向反射分布函數(bidirectional reflectance distribution function、BRDF)是一個定義光線在不透明表反射的四次元函數* https://zh.wikipedia.org/wiki/%E9%9B%99%E5%90%91%E5%8F%8D%E5%B0%84%E5%88%86%E4%BD%88%E5%87%BD%E6%95%B8 金色金屬球從平滑(左)至粗糙(右): ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP22.png) _Isotropic **single** scattering GGX (和Unity內建的相近)_ ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP3.png) _Isotropic **multi** scattering GGX of HDRP 讓粗糙的材質不會變暗而且更飽和._ 預設的參數是 `Metallic/Smoothness`, 但可以在同一個 shader 內切換到 `SpecularColor/Smoothness`. HDRP 允許我們去增強或取代這些初始模組. 這些選項可以: - 用 anisotropic GGX 取代 isotropic GGX. - 在 Disney Diffuse 上新增 subsurface scattering. - 增加曲面細分 - 增加彩虹特效(iridescence effect) - 增加透明漆 GGX ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP9.png) 多樣的光照模組有助於我們實現複雜的容貌. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP17.jpg) _蘑菇的視覺依賴 **透射(transmission)** 和 **次表面的散射(subsurface scattering)** 得以呈現 (由Laurent Harduin提供)._ HDRP 也允許一些透明材質的設定, 像是先背面在正面的方式來協助渲染排序, `Depth post pass`協助透明物件之類的物件在景深效果內的呈現. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP19.png) _雙面透明先背面後正面的渲染的彩虹效果範例._ 基於 Lit shader, HDRP 提供一個稱之為 Layered Lit 的 shader, 它允許將數種 Lit shader 混合在一起. 看完這整篇文章可以得到關於 Layered Lit 更多的訊息. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP21.png) HDRP 的另一個新增是 **貼花 Decal** 的支援. 無論不透明或透明材質都會支援(都還在開發中), 並且可以正確地影響 Global Illumination (lightmap/light probe) 的採樣. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP12.png) _使用貼花呈顯粉筆畫在地板上的範例._ ## Debug HDRP 最重要的新增功能是它的除錯工具. 除錯對於理解資料編輯和表現問題是非常重要的. HDRP 附帶了一個可自定義的除錯視窗, 用以控制 **除錯觀看模式 debug view mode** 和渲染管道的設定. 這個除錯視窗可以在編輯器或者任何撥放器內使用. 是的, 現在可以在像是 PlayStation 4 之類的目標設備上使用除錯功能. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP6.png) _在編輯器中展示法向量的除錯視窗範例._ 在除錯視窗中可以顯示透明或不透明兩者的材質屬性, 無論是 defferred 或是 forward 渲染途徑. 它允許光照的 **除錯檢視 debug view***, 只看 diffuse lighting 或只看 Specular lighting. 它還允許你複寫整個場景的屬性, 像是 **normal**、**albedo**、**smoothness**等等. 它可以展示中介渲染目標, 像是 **運動向量 motion vector**、**深度緩衝 depth buffer**. 它可以透過 **光照貼圖 lightmap** 或是 **曲面細分 tessellation** 來凸顯目標物件, 擁有 NaN 檢查器等等. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP16.png) _在一般撥放器中的除錯視窗, 展示 diffuse lighting 模式和複寫 albedo 的範例._ 其中一個有趣的模式是顏色選擇器模式, 用於在套用後製特效前, 讀取目前螢幕上的值或是 HDR 值. 除錯視窗可以很輕易地被拓展, 用以支援你的遊戲需要的除錯功能, 像是 AI 或動畫的除錯工具. ## New behavior HDRP 帶來與 Unity 內建渲染管道不同的行為. Defferred 和 forward 渲染途徑都支援相同的功能. **次表面散射 Subsurface scattering**、**Screen space ambient occlusion[^SSAO]**、**貼花 Decals** 在兩個途徑內都是相同的運作. 這裡無須為了特定的功能選擇渲染途徑. [^SSAO]: _屏幕空間環境光遮蔽(Screen Space Ambient Occlusion,SSAO)一種用於在電腦圖形中實時實現近似環境光遮蔽效果的彩現技術。_ https://zh.wikipedia.org/wiki/%E5%B1%8F%E5%B9%95%E7%A9%BA%E9%97%B4%E7%8E%AF%E5%A2%83%E5%85%89%E9%81%AE%E8%94%BD HDRP 使用 **相對攝影機的渲染 Camera Relative Rendering[^CameraRelativeRendering]** 這表示即使距離世界原點的物件也能擁有良好的渲染精確度. 這精確度對所有使用 HDRP 的 shader 造成影響. [^CameraRelativeRendering]: 一個在 HDRP 才出現的新名詞, 用以確保遠距離(具有大數值世界座標)的物件的渲染和數值的穩定性. 詳情可見[官方說明](https://github.com/Unity-Technologies/ScriptableRenderPipeline/wiki/Camera-Relative-Rendering). 你的攝影機可以控制要使用哪種光照架構(也就是可以在場景中混用 deffered 和 forward)以及為渲染開啟那些功能. 可以禁用 **霧 fog**、**陰影 shadow** 或 **後製 post-processing** 等等. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP20.png) 對於場景的設定, 有一個基於 **量 volume** 的全新設定, 很像是後製可以設定的那樣. 現在可以設置每個場景的設定(**Sky**, **Sunlight cascade shadow[^cascade_shadow]**, **螢幕空間的接觸陰影 Screen space shadow contact[^contact_shadow]** 等等...), 可以在量之間取得平滑插值的參數. [^cascade_shadow]: 沒有很正式的中文翻譯, 對岸有些稱之 `阴影级联`. 可以簡單理解為陰影的 LOD. 詳情可以參考文末的延伸閱讀. [^contact_shadow]: 應該是和 [unreal engine 接觸陰影](https://api.unrealengine.com/CHN/Engine/Rendering/LightingAndShadows/ContactShadows/index.html) 相同的東西. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP14.png) 對於 Sky & Fog 還有一個新的選項, 向是基於高度的霧或是由天空染色的霧. 以及霧可以影響不透明和透明的材質. 最後, HDRP 使用一個決定好的 **渲染目標配置系統 render target allocation system** 來避免在調整螢幕大小時, 需要重新的配置. 像是在使用動態解析度時, 避免重新配置渲染目標. ## Limitations 我們仍然在 HDRP 上努力著, 也就是有部分功能還在進行中、仍有bug或是不完整的. 它將在 2018.1 以預覽的形式發布, 也還沒準備好給現行產品使用. 目前有一個很重要的限制是 HRRP 還不兼容 Unity 的 Lit Particles 的粒子特效系統, 只有相容 Unlit Particles 的部分. 內建的 **地形 terrain** 系統也有幾個不相容的地方. 所有 SRP 都不再支援先前渲染到 Overlay 層上的任何內容, 像是面對光源的鏡頭光暈. [Grabpass](https://docs.unity3d.com/Manual/SL-GrabPass.html) 不再存在. ## Future development 我們的團隊目前專注在穩定性以及平台的支援. 但那還有 **體積照明 volumetric lighting** 之類閃耀的功能會出現. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP1.png) **區域燈光 Area lights** 根據 Unity Labs 團隊的研究將會得到改善. 基於物理的攝影機也會在下一步得到更連貫的光照和後製. 我們還有數個關於角色渲染的工具 **原型 prototype** 正在進行中. ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP5.jpg) _使用女孩渲染的 [Windup project](https://www.artstation.com/artwork/83EBx)._ ## Conclusion HDRP 將會為 Unity 帶來一個全新的渲染管道, 嘗試將視覺質量盡可能提升到當代遊戲的水準. 缺點是它存在相當大的學習取縣, 因為和內建渲染管道有著明顯地不同. 所有的功能都會帶來複雜度. 統一且連貫的光照就相當難以實現, 有著可被侵入的除錯工具, 依賴攝影機相對就有很多需求要去思考... 為 HDRP 撰寫自訂 shaders 是可行的, 但它需要更多的知識輔佐. 但絕對是值得的! 加入 [Unity beta program](https://unity3d.com/unity/beta-download) 盡早取得新功能. 也可以在 [GitHub](https://github.com/Unity-Technologies/ScriptableRenderPipeline) 上追蹤 HDRP 的開發進度. 我們期待在 Unity Forums 上的 [Graphics Experimental Previews](https://forum.unity.com/forums/graphics-experimental-previews.110/) 與您討論 HDRP! ![](https://blogs.unity3d.com/wp-content/uploads/2018/03/HDRP18.jpg) _使用 HDRP 和複雜材質的風格化遊戲環境範例._ ## 延伸閱讀 - [Cascaded Shadow Maps](https://docs.microsoft.com/en-us/windows/desktop/dxtecharts/cascaded-shadow-maps) - [Tutorial 49: Cascaded Shadow Mapping](http://ogldev.atspace.co.uk/www/tutorial49/tutorial49.html) - [Shadow Map 原理和改进](https://blog.csdn.net/ronintao/article/details/51649664) - [Cascaded Shadow Map(CSM)中的一些问题](https://blog.csdn.net/BugRunner/article/details/7366762) #### translated by NaCl at 2018/09/10