URP | 多光源阴影-阴影支持SRP Batcher
前面俩篇是基础,这个是目录,B站不能增加目录功能

目的
Shader支持SRP Batcher
Alpha Test 半透明模式支持阴影渲染问题。
效果

半透明
Alpha Test和Alpha Blending是两种处理透明的方法。
扩展 问 :他们有什么区别吗?
Alpha Test
Alpha Test是不需要关闭ZWrite的。
渲染队列 可以是2000
Alpha Test产生的效果也很极端,要么完全透明,即看不到,要么完全不透明。
效果

Alpha Blending
需要关闭ZWrite,渲染顺序不能乱。
渲染队列 3000 半透明物体
使用一个我们原来制作的一个Shader做的Alpha Blending效果 测试
下图是关闭 ZWrite 俩个半透明物体叠加的效果

扩展 如果不关闭出现什么问题?
如果不关闭ZWrite,那么在进行深度检测的时候,它背后的物体本来是可以透过它被我们看到的,但由于深度检测时大于它的深度就被剔除了,从而我们就看不到它后面的物体了。因此,我们需要保证物体的渲染顺序是从后往前,并且关闭该半透明对象的ZWrite。
测试结果

前面的半透明渲染会把后面遮挡住。
因此,我们需要保证物体的渲染顺序是从后往前,并且关闭该半透明对象的ZWrite

特效需要有平滑的过度,大部分使用这个模式。
资料参考
无法增加连接


使用SRP Batcher
在有就是产生的阴影没有合并优化,我们使用多光源就会渲染多次。

在有就是产生的阴影没有合并优化,我们使用多光源就会渲染多次。

我们使用SRP Batcher来合并渲染。
什么是SRP Batcher
SRP Batcher 是一个渲染循环,可加速相同着色器变体的多种材质在场景中的CPU渲染速度。
原理
Shader中的变体一致
降低Set Pass Call的消耗
SRP Batcher 通过批处理(batching)—— 系列绑定(Bind)和绘制(Draw)GPU 命令,来减少DrawCalls之间的GPU 设置(工作量)

设置管线支持SRP Batcher
首先在Pipeline Asset(渲染管线中)里勾选SRP Batcher。

在下方勾选SRP Batcher

Shader 是否支持SRP Batcher
在Shader界面我们可以看到是否支持这个效果,才会起作用。
not compatible 是不支持

实现阴影
自定义阴影原理
新建一个Pass 设置光照模式标签 改成 "ShadowCaster”

定义顶点和片元着色器
顶点着色器阶段
我们要得到一个以投射专用的裁剪空间坐标,为了得到这坐标,
我们需要模型的世界坐标,模型的世界法线,灯光方向,然后使用函数
ApplyShadowBias(float3 positionWS, float3 normalWS, float3 lightDirection),
来得到的特殊的世界坐标,然后转换到裁剪空间得到阴影投射专用的裁剪空间坐标。
然后确保阴影偏移后的位置不会超出裁剪空间。
扩展
其中这个新函数的是定义在Shadows.hlsl 下的,它的定义如下。

函数


计算过程
前把 官方阴影去掉。

开启前我们把公用变量属性放到Pass外, 函数库放到外面是因为我们在第二个Pass也需要使用。

连结构体我们也放到Pass外

顶点着色器阶段
我们前让这个Pass 简单的有阴影。
效果 显示有阴影了,

在Debug里我们看到阴影已经使用SRP Batch了,
但是阴影是有问题的,拉近。

或者使用平面看的明显

我们要得到一个以投射专用的裁剪空间坐标
这个函数需要三个参数,那我们准备好这三个参数。

使用函数计算出裁剪空间的坐标。

然后在计算一下是否需要Z值反向,(比如unity编辑器下是DX11,是有Z反向的 )
来取顶点 z值和 顶点w值 在乘 近裁剪面两者之间取最小值;若未Z反向则取最大值。这样得到的Z值在传递给GPU流水线下一个阶段。
效果

完成
优化结果
现在只需要8次

代码

实现Alpha Test剔除
属性
定义一个变量控制Alpha变化过程。
使用_CUT_ON ,来开启关闭效果
定义变量

定义变量
定义一个开关是否开启AlphaTest 效果

第一个Pass
顶点着色器阶段
这个是控制我们的Alpha通道的,对贴图Alpha通道处理。

Clip 剔除
原来输出的Alpha通道数值是1. 现在改成我们贴图的Alpha值。


No模式滑动条可以控制贴图的显示,

但是现在阴影没有产生透过去效果。
阴影支持Alpha模式
这样的模式很多实用在半透明物体上,比如树叶等。
顶点着色器阶段
因为我们是第二个Pass里计算阴影,
那需要把我们贴图的UV信息传入,这里我们是因为上面把结构体定义的变量放到Pass为这一个Pass也可以调用到。
片元着色器阶段
使用开关判断是否输出AlphaTex
至此整体shader就完成了,阴影也支持 透明渲染, 它也兼容了SRP Batcher 。
效果

总结
对Alpha俩种方式的认识和使用。俩种叠加方式的使用,
SRP Batcher 的学习使用,把公共属性,放到Pass外,这样第二个Pass使用的时候方便调用不用定义俩次。
函数库

结构体

宏

贴图数据

CBUFFER_START

使用第二个Pass制作阴影的时候始终不对,就是因为把宏定义放到第一个Pass里了。

阴影Pass实现过程。
