反射是渲染里相当有意思的一件工作。由于最近在写SSPR,顺便写一下博客。
反射的做法
一般来说,除去RTX,引擎内做反射一般有以下方式:
1.基于相机RT做反射
2.Reflection Probe (基于 (Box Projection) Cubemap)
3.SSR or SSPR
第一种相当于另外创建了一个用于拍摄反射画面的相机,性能翻倍代价很大。第二种相当于将CubeMap的操作逆向了一下,效果有限。这里提一下Unity HDRP中还有一种Planar Reflection Probe,与Reflection Probe捕获环境为立方体贴图不同,Planar Reflection Probe 通过其镜面平面重新创建相机视图的反射,然后生成一张 RenderTexture中并绘制在Planar Reflection Probe 边界。第三种Screen Space Reflection是基于RayMarching,对于手机来说,性能消耗依然很大。接下来重点讲一下Screen Space Planar Reflections。
Screen Space Planar Reflections
首先本篇思想主要来自游戏《Ghost Recon Wildlands》中分享的一篇技术文章。
传统的SSR在计算反射时,会根据反射方向raymarching,最终得到结果。虽然SSPR依然要reslove depth/color,而它聪明的地方在于巧妙的利用平面位置的特殊性,省去了raymarching的操作。思路如下:
1.利用depth重新构建点P的世界坐标
2.利用1得到的世界坐标P,得到反射的位置坐标P'
3.利用反射位置坐标P',求得在屏幕中的UV位置
4.最后,利用Stencil buffer标记需要反射的区域,绘制点P的color到对应UV位置,根据Hash结果随机写入纹理。
我们一步步还原来讲解其中每一步需要的细节。
1.重建世界位置坐标
首先,我们需要开启对应相机的Opaque Texture和Depth Texture(管线中打开对应设置也可以)。
引用&参考
1.https://unity.com/how-to/reflections-real-time-lighting-effects#reflections
2.https://remi-genin.github.io/posts/screen-space-planar-reflections-in-ghost-recon-wildlands/
3.https://github.com/Steven-Cannavan/URP_ScreenSpacePlanarReflections
4.https://github.com/ColinLeung-NiloCat/UnityURP-MobileScreenSpacePlanarReflection