[Render] Unity SRP 概述:可编写脚本的渲染管道
英文原文:https://thegamedev.guru/rendering/unity-srp-overview-scriptable-render-pipeline/
? 我決定做一些研究并編寫即將推出的實驗性 Unity 功能:Scriptable Rendering Pipelines。 為什么? 因為它關乎你,它關乎我。 但不要驚慌。 或者至少,現在還沒有。 也許甚至明年都不會,但它最終會改變你的工作方式。 你越準備好,你就會越好。
1.什么是SRP?
? Scriptable Render Pipeline (SRP) 是一種新的 Unity 系統和思維方式,它允許任何圖形程序員開發自定義的渲染循環。 這意味著,您將能夠調整、減少、擴展游戲創建幀的方式。 這將增加您優化游戲、創建自定義視覺效果、使您的系統更易于維護、修復直到現在無法修復的錯誤的潛力,但它的主要優勢在于它可以讓您更詳細地了解圖形的工作原理。 這個想法基本上與(傳統)黑盒內置渲染器相反,Unity 壟斷了所應用的渲染算法。
? 該技術隨 Unity 2018.1 Beta 一起提供。 不過要小心,它仍處于試驗階段,可能會保持這種狀態一段時間。 它的主要支柱是與 C++ 引擎緊密綁定的 C# API。 API 很可能在功能開發過程中發生變化。 它背后的主要賭注是,您將對游戲將執行的渲染過程進行更細粒度的控制。
Unity 在其代碼中提供了兩個渲染管道:
- LWRP:輕量級渲染管線
- HDRP:高清渲染管線
為了理解 SRP,有必要了解典型的每相機渲染過程的整體情況:
如果您了解這些方面,請隨時跳過下一部分。
1.1 剔除
? 幀的渲染通常從剔除開始。 讓我們從一個非正式但簡單的定義開始,這將有助于我們暫時理解它。CullingCPU 過程包括獲取可渲染對象并根據相機的可見性標準對其進行過濾,以生成要渲染的對象列表。
? 可渲染對象基本上是帶有渲染器組件(如 MeshRenderer)的游戲對象,過濾只是意味著它是否會包含在列表中。 但是請注意,真正的剔除過程也會將燈光添加到等式中,但我們將跳過這些。
? 剔除很重要,因為它大大減少了 GPU 必須處理的數據量和指令量。 如果我們在洞穴中,渲染一架正在運行的飛機可能沒有意義,因為我們看不到它(但它可能會,例如它在洞穴內投射陰影)。 剔除本身需要一些處理器時間,這是引擎在平衡 CPU/GPU 負載時必須注意的事實。
? 傳入的幾何體/燈光 + 相機設置 + 剔除算法 = 要繪制的渲染器列表
1.2 渲染
? 在我們確定應該顯示哪些數據之后,我們就去做吧。 一個常見的過程可以總結為以下步驟:
根據 VSync 設置,它甚至可能等待更長的時間來執行前后緩沖區交換。
這是一個過度簡化的典型渲染過程。
在 GPU 填充緩沖區(顏色、深度和可能的其他)之后,開發人員可能會選擇應用進一步的圖像增強功能。 它們包括將著色器應用于輸入紋理(創建的緩沖區)以用校正后的圖像覆蓋它們。 下面列出了一些:
| Bloom | 它突出了明亮的發光區域,在源周圍營造出一種光環效果 | 中等的 |
| 景深 (DoF) | 根據設置的參數模糊屏幕的某些部分 | 昂貴的 |
| SS 抗鋸齒 | 柔化由有限分辨率產生的像素顏色之間的突然過渡 | 輕到貴 |
| 色彩校正 | 根據定義的規則更改顏色的行為 | 輕 |
| SS 環境光遮蔽 | 添加接觸陰影(它使對象之間的區域變暗) | 中等的 |
請注意,性能成本實際上取決于平臺,但作為一般規則,后期效果對于移動設備來說是令人望而卻步的。
? 它們昂貴的一個原因是每個生成的片段通常需要從幀緩沖區(在集成 GPU 的 RAM 中)進行多次讀取,進行一些計算,然后覆蓋緩沖區。 如果將此過程添加到多個后期效果中,由于生成的過度繪制,您最終會使用過多的內存帶寬。
現在我們有了初步的了解,回到我們的 SRP 主題。 還在我這兒? 我們為什么要學習 SRP? 它將如何影響您?
2. 為什么選擇 SRP?
? 主要問題是 Unity 的內置渲染器是單一的、巨大的黑盒渲染管道,它考慮了每個用例。 讓它如此通用需要付出很大的代價:
- 很難優化。
- 在不破壞當前項目的情況下很難改變。
- 它應該保持與以前版本的兼容性。
- 很難進行自定義渲染過程和微調項目。
- 自定義渲染代碼容易產生難以追蹤的副作用。
- 大工作室害怕受到限制。
? 這就是我打賭 Unity 決定采用 SRP 的原因。 這是一個重大舉措,因為您可以在資產商店中找到的大量軟件包需要進行調整才能與 SRP(場景光強度、材質、著色器等)一起使用。
? SRP 的優點基本上與其缺點相反,還有其他一些額外的好處,例如可以使用即將推出的工具,例如用于圖形著色器編程的 Shadergraph(最終使使用表面著色器變得罕見)。 在我看來,最大的優勢之一是通過了解渲染的工作原理,您將獲得大量的學習。
基本 SRP
? 我基于 Unity 示例編寫了一個簡單的 SRP,以展示創建自定義渲染算法是多么容易(但沒用?)。 它首先為一個可腳本對象編寫代碼,該對象將作為 Unity 在啟動時實例化我們的 SRP 的工廠:
[CreateAssetMenu(menuName = "SRP/Create RubenPipeline")] public class RubenPipelineAsset : RenderPipelineAsset {[SerializeField] private Color _clearColor;protected override IRenderPipeline InternalCreatePipeline(){return new RubenPipelineImplementation(_clearColor);} }
? 我添加了一個虛擬的可選變量,它指示要使用的清晰顏色。 創建腳本對象實例后,您最終必須在圖形設置中分配它,以便 Unity 可以將其用于上述任務。
創建 SRP 工廠代碼后,現在我們進入真正的實現:
? 這個過程部分對應于我們之前描述的通用渲染算法。 第一個任務是觸發一些事件,以便 Unity 和第三方插件可以在渲染期間注入自定義代碼:BeginFrameRendering、BeginCameraRendering。 然后,為了讓 Unity 輔助函數工作,我們通過 renderContext.SetupCameraProperties 設置一些用于繪圖的相機屬性(矩陣、FoV、透視/正交、剪切平面等)。 然后我們清除當前顏色和深度緩沖區內容,將初始顏色設置為可編寫腳本對象中提供的顏色。 我們對當前相機進行剔除處理,獲取要繪制的渲染器列表。 因此,我們繼續使用默認設置繪制剔除結果,并在準備好所有指令后,將它們提交給 API + 驅動程序。
? 在我們開始測試我們的新渲染循環之前還有一件事。 我們需要一個帶有自定義著色器的自定義材質來渲染我們的幾何體。 為此,我準備了一個可以使用它的簡單無光照著色器。 除了通過 LightMode 通道命名我們的著色器通道之外,沒有什么特別的。
Shader "Unlit/NewUnlitShader" {Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags { "RenderType"="Opaque" }Pass{Tags { "LightMode" = "BasicPass" }CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{return tex2D(_MainTex, i.uv);}ENDCG}} }現在準備好嘗試了嗎? 是的!
我為此感到自豪嗎? 不,但一步一步。 對于好奇的人:它在 API 方面看起來如何? 是在聽我的吩咐嗎? 讓我們打電話給我們的#bff RenderDoc。
? 所以它完成了我們的要求,忽略了 Unity 編輯器細節的繪制調用。 不多也不少。 你明白為什么 SRP 很棒了嗎? 全權控制,全責,最大的責備潛力! 我之前并沒有真正指出,但我們使用可腳本化的對象來進行 SRP 的事實確實很強大。 您可以自定義您提供的參數并在運行時更改它們。 我還沒有嘗試過,但我敢打賭,我們將能夠實時更改管道,讓我們可以隨意調整它以適應不同的設備。
預定義的渲染管線
? Unity 帶有兩個預定義的可編寫腳本的渲染管道,您可以使用它們而無需進一步復雜化。 事實上,建議您使用其中任何一個作為模板來個性化您自己的管道,因為創建和維護其中一個肯定很難,相信我。 讓我們簡要描述一下它們:
LWRP(輕量級渲染管線):
- 針對中低端設備的特定渲染算法
- 內置渲染器的剝離版本
- 以縮放分辨率渲染游戲
- UI 以原始分辨率呈現
- 沒有實時GI
? 你可以在網上找到官方內置渲染器與 LWRP 的比較以及 LWRP 源代碼,如果你有一些(實際上,很多)空閑時間,我建議你看看。 還要檢查比較,因為每次他們改變主意時我都不會修改此博客條目。
? HDRP(高清渲染管線)針對高端設備(臺式機、PS4/XBO)并提供開箱即用的更好質量,包括延遲著色、TAA、HDR、PPAA、SSR、SSS 等。 喝杯茶,享受一段輕松而又令人興奮的源代碼閱讀時光。
性能
? 很抱歉讓您失望了,但是現在用一個經常變化的高度不穩定的 API 進行基準測試是不可行的。 我從人們對 HDRP 和 LWRP 與內置渲染器的基準測試中發現的結果不一致,幾乎沒有可比性。 我將在以后的文章中介紹這一點,但由于我在上面幾節中提到的原因,預計它會變得更好。
總結
? 我們已經看到了渲染是什么樣子,為什么 Unity 決定實現如此大的功能來支持棄用當前系統,Unity 是如何做到的,以及從今天開始渲染的開箱即用的可能性。 你可能已經意識到這篇文章是多么的簡單,但是寫得更徹底會讓大多數讀者望而卻步。
總結
以上是生活随笔為你收集整理的[Render] Unity SRP 概述:可编写脚本的渲染管道的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 毫米波雷达探测技术,雷达人体存在感应器,
- 下一篇: 第一篇 Object-C快速入门