VolumeticLight性能与表现的取舍之道,总有一款适合你的项目(文末源码附上)。
1.方案一:RayMarching特点:效果一流且稳定,但多次采样ShadowMap比较消耗性能。
2.方案二:光强Threshold+径向模糊特点:效果不够稳定,性能消耗适中(有点类似于Bloom的思想)。
3.方案三:Noise造假术特点:需要额外的模型,但特别省性能,表现效果也还不错(如果是面片,则搭配Billboard效果更佳)。
4.方案四:挤出造假术特点:性能高,效果还行。但对模型顶点数不能太少,否则模型挤出时会被整体偏移(拿一个Cube试试就知道是啥意思了)。
二、具体分析
以下是不同方法的实现思路,请结合下载的源码搭配使用。
1.方案一:RayMarching大体步骤:
后面我们将按照VolumetricLight_RenderPass中,重写的Render()函数展开分析(类似于Build-In中的OnRenderImage函数)。
接下来就是利用重建好的世界坐标系,进行ShadowMap的采样。
比如采样下图的0,1,2,3点,如果步进4次,那么就会对0,1,2,3进行ShadowMap采样,这样0,1点就累计到了光强,而2,3点则没有。
于是就会出现这种情况:
但明显能看到分层的情况,这是因为当步进次数不够大的时候,等距采样会出现刚好漏过洞口的情况,造成某一段地方的光强累计不够,从而出现分层。由此我们可以试试随机采样的效果。
但这样却多了很多噪点,为了优化表现,我们可以用模糊算法来优化。
1.4混合体积光与原场景直接相加就好:sceneColor+lightColor也可以柔性混合:sceneColor+sceneColor*lightColor
2.方案二:光强Threshold+径向模糊2.1提取高亮部分屏幕空间中的灯光距离作为遮罩+Threshold过滤亮度值=生成亮度图
2.3混合体积光与原场景直接相加就好:sceneColor+lightColor也可以柔性混合:sceneColor+sceneColor*lightColor
3.方案三:Noise造假术3.1造假体积Noise图拉长:
3.2边缘消隐上图明显边缘太硬了,我们可以用Fresnel+UV摆放形成遮罩,来控制一下边缘消隐。
3.3VertexOffset做开合控制效果是有了,但不太可控,所以利用遮罩做开合控制。
4.方案四:挤出造假术4.1顶点阶段的模型挤出模型沿着背光方向,顶点挤出一定程度:
4.2片元阶段控制衰减值让挤出的部分呈现丁达尔效应:
三、工程提供
方案一:RayMarching文件名:0002VolumeticLight/0002RayMarchingVolumeticLight.unitypackage下载后,新建一个URP工程,拖入Assets覆盖即可(测试版本为Unity2021.3.26)
方案二:光强Threshold+径向模糊文件名:0002VolumeticLight/0002RadialBlur_VolumetricLight.unitypackage下载后,新建一个Build-In工程,拖入Assets覆盖即可(测试版本为Unity2021.3.26)
方案三:Noise造假术文件名:0002VolumeticLight/0002NoiseTrick_VolumetricLight.unitypackage下载后,新建一个Build-In工程,拖入Assets覆盖即可(测试版本为Unity2021.3.26)
方案四:挤出造假术文件名:0002VolumeticLight/0002VertexExtrude_VolumetricLight.unitypackage下载后,新建一个Build-In工程,拖入Assets覆盖即可(测试版本为Unity2021.3.26)