February 19, 2023

Unity Shader URP 学习 ShadowCaster

Unity Shader URP 学习 ShadowCaster

参考资料

问题阐述

在URP管线下,需要投影,会采用直接调用官方的ShadowCaster pass(UsePass “Universal Render Pipeline/Lit/ShadowCaster”)。这样会出现问题,会让该shader无法进行SRP Batcher。如下图:

No SRP Batcher

SRP Batcher

什么是SRP Batcher?

下面是官方的相关文档:

SRP Batcher:加快渲染速度!

SRP 全称为Scriptable Render Pipeline,其中一部分就是SRP Batcher,主要用途在渲染过程中加速CPU。加速的原因如下:

如何使用SRP Batcher?

ShadowCaster的问题

通过SRP Batcher的学习,可以猜测出官方默认ShadowCaster 并没有符合SRP Batcher的要求,为了解决这个问题,我们可以自己重写 ShadowCaster 这个pass。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
pass
{
//该pass只把主灯光空间的深度图写到了shadowmap里 addlight灯光空间目前没有写进去 导致模型无法投射addlight的阴影 但是整shader可以接受addlight的阴影

Tags
{
"LightMode"="ShadowCaster"
}
HLSLPROGRAM
#pragma vertex vertshadow
#pragma fragment fragshadow
v2f vertshadow(a2v i)
{
v2f o;

Light MainLight=GetMainLight();
float3 posWS=TransformObjectToWorld(i.vertex.xyz);
float3 nDirWS=TransformObjectToWorldNormal(i.normal.xyz);
o.pos=TransformWorldToHClip(ApplyShadowBias(posWS,nDirWS,MainLight.direction));

//Z反向
#if UNITY_REVERSED_Z
o.pos.z=min(o.pos.z,o.pos.w*UNITY_NEAR_CLIP_VALUE);
#else
o.pos.z=max(o.pos.z,o.pos.w*UNITY_NEAR_CLIP_VALUE);
#endif
return o;
}

half4 fragshadow(v2f i):SV_TARGET{
return 0;
}
ENDHLSL

}

关于本文

本文作者 Master Gong Sheng, 许可由 CC BY-NC 4.0.