# LearningSRP **Repository Path**: huskytgame/LearningSRP ## Basic Information - **Project Name**: LearningSRP - **Description**: 学习 Unity 中可编程的渲染管线 - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-10 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LearningSRP #### 介绍 学习 Unity 中可编程的渲染管线 [TOC] ## 零、写在开头 学习 ***Jasper Flick*** 的 **《Custom SRP》**[源地址](https://catlikecoding.com/unity/tutorials/custom-srp/) 后做的学习笔记。Unity版本:2019.4.4f1 ## 一、Custom Render Pipeline ### 1.设置 Color Space ***"Edit / Project Settings / Player / Other Settings / Color Space"*** 设置为 **Linear** 线性颜色空间。 ### 2.创建 Custom Render Pipeline - Step1.编写创建自定义渲染管线资产的脚本 ``CustomRenderPipelineAsset.cs`` - Step2.编写创建自定义渲染管线实例的脚本 ``CustomRenderPipeline.cs`` - Step3.创建 ***CustomRenderPipelineAsset*** 资产 - Step4.给 Unity 赋值自定义渲染管线资产:***"Edit / Project Settings / Graphics / Scriptable Render Pipeline Settings"*** ### 3.编写 ``CameraRenderer.cs`` 脚本,处理每台相机的渲染流程 ### 4.编写 ``CameraRenderer.Editor.cs`` 脚本,处理编辑器模式下的渲染 ## 二、Draw Calls ### 1.创建无光照 Unlit Shader 和 对应的 Pass 通道的代码文件(HLSL) ### 2.创建自定义的 ShaderLibrary - UnityInput:Unity 输入的相关矩阵 - Common:常用的API ### 3.导入 ***Core RP Library*** - 从 Unity 的 **PackageManager** 中下载 ***Core RP Library*** ### 4.Batching(批处理) Batching is the process of combining draw calls 合并多个渲染指令为一个 Batch,减少 CPU 与 GPU 之间的通信时间。 #### (1)SRP Batcher(没有减少 DC) SRP Batcher 不是减少 DrawCall 数量,而是在 GPU 上缓存***Material Properties***,以此减少每次 DrawCall 的通信数据量。 使用前提:所有***Material Properties***必须在特定的***constant memory buffer***中定义(声明 **cbuffer** 块) #### (2)GPU Instancing(具有相同 Mesh 的对象) 针对具有相同 Mesh 的对象,使用一个 DrawCall 完成绘制,CPU收集每个对象的 ***Transformation*** 和 ***Material Properties***,将其放入数组中,然后发送给GPU,最后GPU按顺序遍历、渲染。 #### (3)Dynamic Batching(共享Material的小网格对象可用) 将使用相同 Material 的小网格组合成大网格进行渲染,若每个对象使用各自的 Material,则无法进行 Dynamic Batching。 Sphere 不能使用 Dynamic Batching,Cube可以使用。 GPU Instancing 优于 Dynamic Batching,两者不可同时使用。 ### 5.为 Custom Render Pipeline Asset 添加 Batching 选项 ### 6.添加透明度混合 ### 7.添加 Alpha Cutoff ## 三、Directional Light ### 1.创建 Lit Shader 和 LitPass.hlsl 文件 ### 2.添加 Surface.hlsl 计算光照所需的 Surface Properties ### 3.添加 Lighting.hlsl 计算光照(简单的光照计算:Lambert's law) ### 4.添加 Light.hlsl 提供光线数据 ### 5.添加 Lighting.cs 将 Unity 内部光源数据传递到 Shader ### 6.使 Lighting.hlsl 支持最大 4 个方向光源的光照计算,限制目标平台在 3.5 及以上 ### 7.添加 BRDF.hlsl 用于计算 BRDF ### 8.添加宏,处理透明渲染时,Diffuse因透光产生的衰减 ### 9.添加 Editor 脚本:CustomShaderGUI,添加自定义 Shader 的材质面板