fwalker 发表于 2022-8-4 09:26

Unity URP渲染管线Shader机制剖析

前言

上一节通过剖析URP 光源机制,本节来分析URP的Shader机制,不同的渲染管线渲染处理的基础与策略是不一样的,所以Shader的写法是不同的,在URP渲染管线下不能使用之前的标准向前渲染管线的Shader,当然向前渲染管线也不能使用URP的shader。URP 渲染管线的Shader采用的是HLSL开发,普通标准的Shader是采用Cg来开发。URP Shader实现了游戏开发中常用的一些Shader,并提供源码,方便我们参考学习URP Shader开发。URP渲染管线的Shader源码在Packages/Universal RP/Shaders目录下,如图1.4-1所示:


图1.4-1 URP Shader
URP 渲染管线实现了内置的PBR, Unlit , 地形等游戏开发中常用的Shader。
这里有个游戏开发·交流小组 大家一起来学习交流哦
1: URP Ulit Shader

我们先来分析一下URP 的Unlit Shader的模板,创建一个材质球,选“Universal Render Pipeline/Unlit” Shader模板,在场景中创建一个Cube,把材质球关联到Cube上。如图1.4-2所示:


图1.4-2
Unlit Shader还是采用的Unity经典的ShaderLab语法,还是熟悉的配方熟悉的味道。主要结构依然是Shader{ SubShader { pass{} pass{} }, SubShader {}, FallBack }与标准的Unity Shader开发不同的是 URP Shader内嵌HLSL的代码,标准的是Cg的代码,其它的差不多。


图1.4-3
对于Unlit Shader有两个SubShader,通过”ShaderModel”的版本来进行区分 (我这边的版本是4.5与2.0)。每个SubShader有3个Pass, Unlit Pass, Depth Only Pass, Meta Pass


2: URP PBR Shader 如何处理光照

分析完URP的Unlit Shader后,接下来分析PBR Shader, PBR Shader基于物理的光照,支持金属度与粗超度美术工作流,反射与光泽度工作流,这些参数和标准PBR Shader一样,来看下URP的PBR Shader。如图1.4-4:


图1.4-4




图1.4-5
与Unlit一样Lit也是根据ShaderModel版本来选择SubShader。Lit 每一个SubShader里面有7个pass, 作用如下:




URP 渲染管线内部实现了(向前+延时)渲染管线,每次绘制的时候,来走不同的Pass,从这里看出来,和标准渲染管线不同,所有的光照都在一个pass里面计算完成了。接下来看下PBR Shader中的光照计算的代码,打开LitForwardPass.hlsl, 主要PBR逻辑如下:
Step1: 初始化双向分布函数BRDF:



Step2: 计算主光源MainLight 光照;



Step3: 计算处理GI;


Step4: 计算处理附加光源光照;


Step5: 处理自发光;


具体代码大家可以到源码中阅读,本期的URP的干货内容暂时告一段落,更多的URP实战与底层原理,我们会在VIP的视频教程中有消息讲解。关注我们,持续给大家分享一些架构师进阶,渲染管线进阶的干货内容。
页: [1]
查看完整版本: Unity URP渲染管线Shader机制剖析