【從UnityURP開始探索遊戲渲染】專欄-直達
URP相機渲染流程核心機制
-
基礎渲染管線順序
- Depth Pre-Pass:可選深度預渲染(需手動開啓)
- Opaque Rendering:不透明物體從近到遠排序渲染
- Skybox Draw:天空盒繪製(默認在透明物體之前)
- Transparent Rendering:透明物體從遠到近排序渲染
- Post-Processing:後處理效果疊加
-
多相機協作模式
- Stacking:通過Camera Stack實現多相機合成
- Layer Overrides:使用Camera.RenderType控制渲染層級
- Clear Flags:決定是否繼承上一相機的顏色/深度緩衝
關鍵控制參數
| 參數 | 作用 | 示例值 |
|---|---|---|
| RenderType | Base/Overlay相機類型 | CameraOverrideMode |
| Culling Mask | 層級過濾 | Everything/Selected Layers |
| Depth | 相機渲染優先級 | -1~100 |
| Clear Flags | 緩衝清除策略 | Skybox/SolidColor/DepthOnly |
URP相機渲染順序的核心優化原理
剔除階段優先級
- 視錐剔除(Frustum Culling)始終優先執行,基於相機視錐體和物體包圍盒自動剔除
- 遮擋剔除(Occlusion Culling)需手動配置,通過烘焙靜態場景數據實現動態遮擋判斷
- 層級剔除(Culling Mask)直接過濾指定圖層,減少後續渲染管線負載
渲染順序策略
-
3D場景:
- 不透明物體按深度從近到遠排序,利用Early-Z優化過度繪製
- 透明物體按深度從遠到近排序,避免混合順序錯誤
-
2D場景:
- 正交相機默認按Sorting Layer/Order in Layer排序
- 禁用深度寫入(ZWrite)以簡化渲染流程
多相機協作優化
- Base Camera與Overlay Camera分層渲染,通過Camera Stack合併輸出
- 渲染紋理(Render Texture)複用機制減少重複繪製
2D與3D場景的差異化處理
| 特性 | 3D場景 | 2D場景 |
|---|---|---|
| 剔除依賴 | 依賴空間包圍盒和深度緩衝 | 依賴Sorting Layer和Sprite Order |
| 相機類型 | 透視相機(Perspective) | 正交相機(Orthographic) |
| 優化重點 | 減少Draw Call和陰影計算 | 控制Sprite Atlas合批 |
| 典型問題 | 遠處物體LOD管理 | 像素對齊與抗鋸齒 |
典型配置示例
場景需求:
- 主相機渲染3D場景
- UI相機疊加2D元素
- 後處理僅影響主相機
實現步驟:
-
主相機設置:
csharp camera.renderType = CameraRenderType.Base; camera.depth = 0; camera.clearFlags = CameraClearFlags.Skybox; -
UI相機設置:
csharp camera.renderType = CameraRenderType.Overlay; camera.depth = 1; camera.cullingMask = LayerMask.GetMask("UI"); -
後處理配置:
yaml # URP Asset中關閉UI相機的Post ProcessingAnti-aliasing: MSAA (主相機) Post-process: Enabled (主相機)
性能優化建議
3D場景優化
- 動態調整陰影距離(Shadow Distance)減少級聯計算
- 對靜態物體啓用Occlusion Culling烘焙
csharp
// 示例:動態修改遮擋剔除參數
void Update() {
if (Camera.main.farClipPlane > 1000) {
OcclusionArea.size = new Vector3(500, 500, 500);
}
}
2D場景優化
- 使用Sprite Atlas合併紋理減少狀態切換
- 禁用不必要的Post Processing以節省帶寬
通用策略
- 通過Camera.RenderType分離UI與場景渲染
- 利用URP的SRP Batcher減少CPU開銷
-
減少Overdraw
- 使用Occlusion Culling剔除不可見物體
- 透明物體嚴格控制繪製順序
-
合理使用Camera Stack
- 基礎相機數量≤3
- 靜態UI使用Single Pass渲染
-
高級技巧
- 動態分辨率縮放(Dynamic Resolution)
- 按需觸發渲染(Camera.Render())
文檔中特別説明:URP 14.1優化了多相機場景下的GPU實例化批處理效率,建議通過Frame Debugger驗證實際渲染順序。
【從UnityURP開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)