有空可以用 OpenGL 來寫一個類似 Unity SRP Batcher 的合批處理:
shader cbuffer 分類:
- PerDraw // 每個繪制對象的 cb
- ObjectToWorldMatrix
- PerMaterial // 每個材質對象的 cb
- Color
- PerFrame // 每幀繪制的 cb,或是叫:Global
- CameraWorldPosition
- LightInfos[N] // N : 1~16
- Position
- Color
- Type
- etc.
僞代碼如下:
// 更新 PerDraw 的 CBuffer
void* perDrawCBuffer = GL.map(CBUFFER_IDX_1);
int perDrawCount = ...;
for (int i = 0; i < perDrawCount; i++)
{
SinglePerDrawInfo* singleInfo = (SinglePerDrawInfo*)(perDrawCBuffer + i);
singleInfo->xxx = xxx;
...
}
GL.ummap(CBUFFER_IDX_1);
perDrawCBuffer = NULL;
// 更新 PerMaterial 的 CBuffer 類似 PerObject
void* perMatCBuffer = GL.map(CBUFFER_IDX_2);
int matCount = ...;
for (int i = 0; i < matCount; i++)
{
SinglePerMatInfo* singleInfo = (SinglePerMatInfo*)(perMatCBuffer + i);
singleInfo->xxx = xxx;
...
}
GL.ummap(CBUFFER_IDX_2);
perMatCBuffer = NULL;
// 更新 PerFrame 的就更簡單了,因為全局唯一一份資料,是以也叫 Global
PerFrameInfo* perFrameInfo = (PerFrameInfo*)GL.map(CBUFFER_IDX_3);
perFrameInfo->xxx = xxx;
GL.ummap(CBUFFER_IDX_3);
perFrameInfo = NULL;
References
官方
- Universal Render Pipeline overview - 7.7.1 URP 版本的文檔,在 Unity Packages Manager 的 View Documentation 可以檢視
- Feature comparison table - 和 Built-in RP 的功能比較
- 其中有将到 URP 下,的燈管限制,每個對象最多多少個:如:
- URP 下 MainDirectionalLight 最多一個
- PerObj 的 Lighting 可以有 4~8 個
- 8 (4 for GLES2). Can be point, spot, and directional Lights.
- OpenGL ES 2.0 最多 4個
- 其他高版本可以 8 個
- 可以是 point, spot, directional 的三種光源類型
- PerCamera 的 Lighting 最多可以 256 個
- 16 for GLES 3.0 or lower, 32 on other mobile platforms
- 在 OpenGL ES 3.0 16 個,或是更少
- 在其他手機平台可以最多 32 個
- 其中有将到 URP 下,的燈管限制,每個對象最多多少個:如:
- Feature comparison table - 和 Built-in RP 的功能比較
- Unity-Technologies/Graphics - Unity - Technologies/Graphics 圖形方面的 GitHub 庫,其中就包含了 HDRP, URP, SRP, ShaderGraph, VFX 等
- javelinlin/Graphics - 怕以後年代久遠,變動太大,2021/10/15 今天我将這個倉庫 Fork 了一份
- Unity-Technologies/UniversalRenderingExamples - 官方 GitHub URP Demo
- Using the Universal Render Pipeline - 2019.4 版本的 URP 手冊
- Scriptable Render Pipeline fundamentals - 2019.4 版本的 URP 手冊
- Scriptable Render Pipeline (SRP) Batcher - 裡面有講到:How the SRP Batcher works
- Unity-Technologies/SRPBatcherBenchmark - SRP Batcher Profiler,可以檢視 On/Off 後的面闆資料上的差別
- Up and Running with URP - unity 官方提供:掌握 URP 的課程練習,2021/10/11 發現目前隻有 2019.3 和 2019.4 版本的 URP 課程,但是發現講的内容也太太太基礎了!
- Achieve beautiful, scalable, and performant graphics with the Universal Render Pipeline - 簡單介紹 Boat Attack Demo
-
Level up your game graphics with these Universal Render Pipeline tutorials - 詳細介紹 Boat Attack Demo,其中 Making a Water Shader in Unity with URP
有 水體 Shader 的 Shader Graph 詳細講解
- SRP Batcher: Speed up your rendering! - 推薦可以看看,有比較的詳細
- [譯]SRP Batcher:提升您的渲染性能
- [譯]SRP Batcher:提升您的渲染性能
- 上面的翻譯與 官方的部落格文章有點不同(可能官方後續有更新、補充内容)
非官方
- Cyan 的 blog
- Writing Shader Code in Universal RP (v2) - 關于 URP 的内容,這一篇寫的相當的詳細
- [Unity]URP學習記錄(1) - 引用 Cyan blog 的内容
- cat like coding 的譯文
- Unity通用渲染管線(URP)系列(一)——自定義渲染管線(Taking Control of Rendering)
- Unity通用渲染管線(URP)系列(二)——Draw Calls(Shaders and Batches)
- Unity通用渲染管線(URP)系列(三)——方向光(Direct Illumination)
- Unity通用渲染管線(URP)系列(四)——方向陰影(Cascaded Shadow Maps)
- Unity通用渲染管線(URP)系列(五)——烘焙光(Baked Light)
- Unity通用渲染管線(URP)系列(六)——陰影遮罩(Shadow Masks)
- Unity通用渲染管線(URP)系列(七)——LOD和反射(Adding Details)
- Unity通用渲染管線(URP)系列(八)——複雜的貼圖(Masks, Details, and Normals)
- Unity通用渲染管線(URP)系列(九)——點光源和聚光燈(Lights with Limited Influence)
- Unity通用渲染管線(URP)系列(十)——點光和聚光燈陰影(Perspective Shadows)
- Unity通用渲染管線(URP)系列(十一)——後處理(Bloom)
- Unity通用渲染管線(URP)系列(十二)—— HDR(Scattering and Tone Mapping)
- Unity通用渲染管線(URP)系列(十三)——顔色分級(Playing with Colors)
- Unity通用渲染管線(URP)系列(十四)——多相機(Camera Blending & Rendering Layers)
- Unity通用渲染管線(URP)系列(十五)——粒子(Color and Depth Textures)
- Unity通用渲染管線(URP)系列(十六)——渲染縮放(Scaling Up and Down)
- SRP 自定義 - 大部分是來自 cat like coding
- Unity自定義SRP(一):建構渲染架構
- Unity自定義SRP(二):Draw Call
- Unity自定義SRP(三):平行光
- Unity自定義SRP(四):平行光陰影
- Unity自定義SRP(五):烘培光
- Unity自定義SRP(六):陰影遮罩
- Unity自定義SRP(七):LOD和反射
- Unity自定義SRP(八):複雜紋理
- Unity自定義SRP(九):點光和聚光
- Unity自定義SRP(十):點光和聚光陰影
- Unity自定義SRP(十一):後處理
- Unity自定義SRP(十二):HDR
- Unity自定義SRP(十三):顔色分級
- Unity自定義SRP(十四):抗鋸齒和縮放渲染
- Unity自定義SRP(十五):SSAO
- Unity自定義SRP(十六):内嵌VFX Graph
- Alex TA 同學的内容
- Alex TA
- 更新 URP 注意
- 内置管線Shader更新到URP詳細手冊
- Unity Built-in轉URP速查表 - Alex TA
- ConstantBuffer
- Unity ConstantBuffer的一些解析和注意
- cbuffer和tbuffer
- [ZZ] cbuffer和tbuffer
- 後處理
- Unity Shader - 搬磚日志 - URP 擴充後效 - 實作 BoxMosaicPP (矩形馬賽克後效)
- 如何擴充Unity URP的後處理Volume元件
- UNITY URP
- Unity - 通用渲染管線(URP)1.渲染、後處理
- Edge Detection Outlines
- 陰影
- Unity Shader - URP ShadowCast & ShadowRecieve - 投影 和 接受陰影
- 關于SHADOWS_SCREEN - URP 下的陰影
- 如何在unity的URP下實作陰影
- Unity URP Shader 支援内置陰影
- 環境光
- Unity Shader - 在 URP 擷取 Ambient 顔色
- 霧
- Unity URP Shader 支援内置霧效
- Instancing
- Unity Shader - URP Instancing
- Unity SRP2019教程二:DrawCall那點事
- 類多 Pass
- Unity - URP RenderFeature - 實作類似多 Pass 的 XRay: Rim、Dithering
- Others
- Unity - 可程式設計渲染管線(Scriptable Render Pipeline)
- Unity URP/SRP 渲染管線淺入深出【匠】
- MSDN
- Shader Constants (HLSL) - Constants Buffer 包含:cbuffer, tbuffer 兩種 都是 多個 shader 之間可以共享使用的 buffer,是以我們在傳給某個 shader 繪制狀态資料都可以放這,一次性設定,而不用像以往的 逐個 uniform 來設定而降低性能
- How to: Create a Constant Buffer - 以建立 cbuffer 為例
- Buffers - DX 中就三大類的 buffer:Constants Buffer, Vertex Buffer, Index Buffer
- 問題
- 從 Builtin 管線更新到 URP
- 案例
- 《黑暗之潮》中次時代技術的應用經驗及技術 - 其中有講到使用了 URP,還有 ESC + DOTS 優化剔除、動畫更新