天天看點

Unity - 搬磚日志 - SRP/URP 相關References

有空可以用 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 個
  • 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 優化剔除、動畫更新