欢迎光临散文网 会员登陆 & 注册

URP | 物体阴影

2022-01-18 19:41 作者:那个人真狗  | 我要投稿

实现思路

阴影

  • 阴影分为接收阴影和投射阴影两个部分,接收阴影开启部分关键字就可以了,但是需要注意的是,计算灯光的时候需要把光的衰减计算进去。

    但投射阴影需要写一个用与投射阴影的单独一个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

URP | 物体阴影的评论 (共 条)

分享到微博请遵守国家法律