找回密码
 立即注册
查看: 617|回复: 0

[笔记] Unity_StochasticSSR[1]

[复制链接]
发表于 2020-12-18 10:10 | 显示全部楼层 |阅读模式
之所以弄这个坑呢是因为Unity自带的PostProcess里面的SSR效果奇烂,然后商城里面呢效果好的SSR又不存在。后来发现一款CandelaSSRR纯镜面效果确实很好,但是粗糙表面居然直接就是正太模糊。。最后论坛上又有一个免费的Stochastic SSR。结果作者神奇的用ImageRender做导致和透明物体的排序会鬼畜。如图。
  然后呢他这个SSR的RayMarching求交也比较直接。导致反射会很拉长显得很恶心。如图。
  最后加上原作者的实现是直接ImageRender和其他特效的混合液很鬼畜。所以决定参考这些大神的实现自己弄一个心满意足的SSR。首先呢吧一些原作者里面的主要计算内容提取了出来,分别是RayCasting,Resolve,Temporal,Combien四个部分。最后我选择了使用CommandBuffer来处理这些内容。因为这样自带Forward物体遮挡。
    对于SSR原理大家不知道的可以去看如上几篇文章。这里呢分享一下主要的流程。这里注意点就是RayCasting_Linear的PixelShader,使用了两张RT输出。第一张分布存储HItUV和HitDepth以及SSR的Mask,第二张则存储计算出来的采样概率分布(rayPDF项),这里的rayPDF的XYZ项存的则是被粗糙度影响的法线分布效果,可以做出那种越粗糙反射越拉丝狭长模糊的反射,rayPDF的A存的则是重要性采样得到的方差,后面会拿来做Resolve加速采样去燥。这里主要还是加入了一个厚度判断求交,如果不这样做则会产生本文第二张图那样的恶心拉长(本来是用的背面深度来做的因为这样精度准确,后来消耗过高就换成了常量厚度(Thickness),背面深度方法依然保留这的,如果你性能够强可以试试)。
  然后在CS里面就需要把这两个RT取出来。因为后面的ResolvePass(去燥和采样反射效果阶段)还会用到。
  接着就会进入RsolvePass,这个Pass会把HitUV拿来采样反射贴图,HitMask算反射遮罩(混合Cubemap用),同时用HitPDF和HitDepth算一个相邻像素共用一个采样样本(因为根据SSSR的PPT描述,一定程度上相近的两个像素得到的反射可能会是一个样子,感觉和NV的SVGF有异曲同工之秒)。最后把结果结合起来就是最终的反射效果了。然后我们把这个结果再用CB存到一张RT里(因为即便进行了相邻像素共用一个样本还是会产生很多噪点,后面还会加入Temporal来过滤噪点)。
  到此SSR的效果基本成型。接着就可以来Temporal过滤(目的进一步消除噪点)。这里的过滤方法来自Playerdade的GitHub的开源项目。
  最后得到的TemporalAfter就是最终的反射效果了。最后就可以和主场景里面的MianTex进行混合来输出到屏幕显示最终效果。(这里面要传一个SceneColor给Shader去做混合。因为前面的Marching阶段Bilt的关系所以内置的_MainTex基本变样了,所以的手动传递一个SceneColor进去)。在CombientPass利用之前TAA过滤过的RT和传进来的SceneColor和之前算好的SSRMask进行混合(同时加入Fersnel的计算,比较符合物理现象)。
到现在基本上PPT里面的效果大部分都实现了。再来放一些截图。
这张是使用了背面深度判断求交的,可以看到反射拉长的恶心效果被完美消除,精度简直跟平面反射似的
这张是也使用了背面深度判断求交。
  到此效果基本就是实现了。后面预计还会更新优化篇和生产结合篇。优化篇主要会优化光线求交效率,并且在没有背面深度的情况下得到反射比较精确的效果,同时还会做一些HiZ的内容已经使用更现代化的光线追踪方式。。生产篇则会说一些使用方法,预计还会在做一个简化版的SSR给Forward材质和透明材质使用。
  最后献上第一篇的源代码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-6-4 00:04 , Processed in 0.128772 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表