URP | 物体阴影
实现思路
阴影
阴影分为接收阴影和投射阴影两个部分,接收阴影开启部分关键字就可以了,但是需要注意的是,计算灯光的时候需要把光的衰减计算进去。
但投射阴影需要写一个用与投射阴影的单独一个Pass,该Pass的渲染路径采用ShadowCaster
第一个Pass,开启一系列相关关键字,用于接收阴影
其中是否开启软阴影,需要在管线中设置


然后在片元着色器中使用TransformWorldToShadowCoord函数获取阴影纹理坐标,使用该坐标获取主光源,再进行一系列光源计算
第二个Pass参考URP的
**Universal Render Pipeline/Lit/ShadowCaster**
Pass创建生成阴影的Pass,主要任务在于将阴影从对象空间中转换到裁剪空间。
实现
主光源 | 阴影
接受阴影
增加接受阴影关键字

关键字俩个横线中间需要有空格,
注意: 如果开启关键字,还是没有效果,是在计算阴影的时候没有增加衰减。
前在第一个pass里片元着色器计算光照的时候输出

在计算漫反射的时候需要把光照衰减计算进去。
mylight.shadowAttenuation 如果不计算光照衰减,是没有效果的
产生阴影
在下面增加一段代码调用unity的阴影Shader

完成
效果
产生阴影,也接受阴影。

总结
第一接受阴影增加关键宏就可以,注意计算光照衰减。
第二产生阴影单独使用一个pass就可以。
第三软阴影的使用能提升阴影的效果,但是开销会增大。
副光源 | 阴影
效果
主光源和副光源

注意事项
点光源不支持实时阴影,如果想实现点光源阴影应该采用光照烘焙,
现在场景中的点光源提示黄色。

想要副光源也能够产生阴影,需要先在URP管线的Inspector面板下为Additional Lights勾选上Cast Shadows。

然后在光源的Inspector面板中,将Shadow Type切换成Soft Shadows
在把点光源设置成聚光灯,带有方向。

这样就没有报错了,
整理合并函数
前面计算漫反射和 高光反射的时候计算俩遍,我们梳理一遍,
漫反射
计算漫反射需要,(世界空间法线,世界空间灯光)灯光计算出NdotL。
在计算(灯光颜色,灯光衰减),漫反射颜色。
高光
计算半角向量,需要 (世界空间灯光,世界空间视角)
这样我们就总结出5个需要的数据。
(灯光颜色,世界空间灯光位置,灯光衰减 ,世界空间法线, 世界空间视角)
其中需要灯光颜色,灯光位置,灯光衰减,都是一个数据得到的。
那我们前可以使用一个函数获取这些数据,在使用一个函数计算光照信息。
创建一个函数获取这些数据。
注意 :light.distanceAttenuation 距离衰减和 ****shadowAttenuation 阴影衰减计算出在阴影效果。
创建第二个函数 计算
在外部我们只需要计算出灯光位置信息,和法线视角信息就可以。
主光源的效果完成,
在计算副光源
我们只需要获取副光源的世界位置。
把主光和副光的经合起来,输出。
效果

源代码
资料参考
https://www.jianshu.com/p/a8e4dd93d7d6