unity-shader-体积光VolumetricLighting

unity-shader-体积光VolumetricLighting


前篇


RayMarching


Raidal Blur Postprocessing 径向模糊后处理

这种方式的实现和 Bloom 效果很相像, Bloon 是把 高亮 部分进行 高斯模糊 一下叠加

而 体积光 则是把 高亮 部分进行 镜像模糊

原理 :

  1. 提交高亮部分 RT1
  2. RT1 做几次 径向模糊 - RT2
  3. RT2 再与原图叠加起来

原图

经过提取高亮=>径向模糊=>增大模糊半径再次径向模糊=>与原图叠加的效果分别如下图:


挤出顶点

参考: https://blog.csdn.net/puppet_master/article/details/79859678

原理 :

顶点阶段, 计算出哪些是背光, 哪些是受光, 让受光的部分的顶点沿着光的方向挤出. (为啥是受光? 因为受光部分离光比较近, 比较早衰减). 背光部分的顶点则不处理. 这样在光栅化后就能差值形成一个沿光方向延伸的模型.


BillBoard 公告板

ShadowGun 中的 体积光 的实现方式 - GodRays.

这里也有个分析 : ShadowGun 的学习笔记 - GodRays, 比较古老的仓库 : https://github.com/rainbow23/shadowgun_sample

原理 :

参考代码

1
2
3
4
float3 viewPos = mul(UNITY_MATRIX_MV,v.vertex);
float dist = length(viewPos);
float nfadeout = saturate(dist / _FadeOutDistNear);
float ffadeout = 1 - saturate(max(dist - _FadeOutDistFar,0) * 0.2);
  1. 将顶点变换到 视空间, viewPos 的 length 就是 该顶点到 视点 的距离

  2. 定义在 近视点, 远视点, 根据这两个视点的距离作比较进行插值计算