# [翻譯]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 都要自行另外處理.

最後, HDRP 目前還在預覽階段, 這表示它還不適用於產品上.
## Lighting improvement
HDRP 帶來全新的光照架構: 它使用了混和 Deferred / Forward – Tile / Cluster 的渲染器. 這些單字意味著它比 Unity 內建的渲染可以使用更具規模的場景燈光. 這個新的光照架構是著重在效能上的.

另外, HDRP 還有各種附加的光照屬性以及新的光照編輯器. 它可以做到光照的淡出, 只影響 diffuse 或 specular 光照, 或使用色溫去設定光的顏色. Spotlight 現在可以控制內角度以及不同的形狀(錐形、方形或金字塔形). 也支援 Colored cookies.
:::info
這裡的 `Colored cookies` 不知道指的是甚麼..?
:::

HDRP 允許使用實時的區域光源(目前不支援陰影和烘焙), 像是矩形光.

最後, 光照遵循物力反向平方衰減且使用物理光單元(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

在基於圖像的光照部分, 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

但對於材質渲染最大的新增是它的光照模組.
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
金色金屬球從平滑(左)至粗糙(右):

_Isotropic **single** scattering GGX (和Unity內建的相近)_

_Isotropic **multi** scattering GGX of HDRP 讓粗糙的材質不會變暗而且更飽和._
預設的參數是 `Metallic/Smoothness`, 但可以在同一個 shader 內切換到 `SpecularColor/Smoothness`.
HDRP 允許我們去增強或取代這些初始模組. 這些選項可以:
- 用 anisotropic GGX 取代 isotropic GGX.
- 在 Disney Diffuse 上新增 subsurface scattering.
- 增加曲面細分
- 增加彩虹特效(iridescence effect)
- 增加透明漆 GGX

多樣的光照模組有助於我們實現複雜的容貌.

_蘑菇的視覺依賴 **透射(transmission)** 和 **次表面的散射(subsurface scattering)** 得以呈現 (由Laurent Harduin提供)._
HDRP 也允許一些透明材質的設定, 像是先背面在正面的方式來協助渲染排序, `Depth post pass`協助透明物件之類的物件在景深效果內的呈現.

_雙面透明先背面後正面的渲染的彩虹效果範例._
基於 Lit shader, HDRP 提供一個稱之為 Layered Lit 的 shader, 它允許將數種 Lit shader 混合在一起. 看完這整篇文章可以得到關於 Layered Lit 更多的訊息.

HDRP 的另一個新增是 **貼花 Decal** 的支援. 無論不透明或透明材質都會支援(都還在開發中), 並且可以正確地影響 Global Illumination (lightmap/light probe) 的採樣.

_使用貼花呈顯粉筆畫在地板上的範例._
## Debug
HDRP 最重要的新增功能是它的除錯工具. 除錯對於理解資料編輯和表現問題是非常重要的.
HDRP 附帶了一個可自定義的除錯視窗, 用以控制 **除錯觀看模式 debug view mode** 和渲染管道的設定. 這個除錯視窗可以在編輯器或者任何撥放器內使用. 是的, 現在可以在像是 PlayStation 4 之類的目標設備上使用除錯功能.

_在編輯器中展示法向量的除錯視窗範例._
在除錯視窗中可以顯示透明或不透明兩者的材質屬性, 無論是 defferred 或是 forward 渲染途徑.
它允許光照的 **除錯檢視 debug view***, 只看 diffuse lighting 或只看 Specular lighting. 它還允許你複寫整個場景的屬性, 像是 **normal**、**albedo**、**smoothness**等等. 它可以展示中介渲染目標, 像是 **運動向量 motion vector**、**深度緩衝 depth buffer**. 它可以透過 **光照貼圖 lightmap** 或是 **曲面細分 tessellation** 來凸顯目標物件, 擁有 NaN 檢查器等等.

_在一般撥放器中的除錯視窗, 展示 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** 等等.

對於場景的設定, 有一個基於 **量 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) 相同的東西.

對於 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** 之類閃耀的功能會出現.

**區域燈光 Area lights** 根據 Unity Labs 團隊的研究將會得到改善.
基於物理的攝影機也會在下一步得到更連貫的光照和後製.
我們還有數個關於角色渲染的工具 **原型 prototype** 正在進行中.

_使用女孩渲染的 [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!

_使用 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