【渲染】Unity中实现近似的SSS/3S效果
文章图片
前言
开始之前,先稍微了解一下什么是3S,在此引用一段维基的解释:
Subsurface scattering (or SSS), is a mechanism of light transport in which light that penetrates the surface of a translucent object, is scattered by interacting with the material, and exits the surface at a different point.虽然解释听起来很晦涩,不过举一些例子就很好理解:玉器、皮肤、牛奶等半透明物体都是很常见的3S材质。在离线渲染中3S材质早就是烂大街的东西了,不过在实时渲染中应用的就很少有见到。离线渲染可以用光追去物理模拟光线,实时不能这么做,不过也可以通过一些Trick模拟近似的效果。
次表面散射(或称3S),是一种光线穿透半透明物体表面并在材质内相互作用而散射,最终从不同位置离开表面的光传输机制。
文章图片
维基:光线透过手指的图例 实现 主要是将几个在Github上找到的几个相关项目成果整合起来,参考并做了一些改进。
感谢以下的项目:
- https://github.com/CustomPhase/CP_SSSSS
- https://github.com/sebastianhein/sss-unity
开始 首先搭建一个场景,从Sketchfab上下载了一条免费的中国龙模型,给他附上一个Standard材质并调整一下光滑度。此时的效果比较像国内那些奇奇怪怪的廉价摇摇乐……
文章图片
模拟散射 这一步是CP-SSSSS项目的成果,SSSSS全称Screen Space Sub-surface Scattering,是一种基于屏幕空间的后处理实现,是实时SSS效果中比较常见的做法。
- 先在Camera上挂上CP_SSSSS_Main后处理脚本,调整效果参数。
- 然后在需要进行模拟散射效果的物体上挂上CP_SSSSS_Object脚本,调整散射颜色。散射颜色可以偏黄,这样会有翠绿的感觉。
文章图片
此时效果可以说有点意思了。明暗的对比减弱,通过对内部纹理的模糊化,产生了类似玉器内部散射而产生的“浑浊感”。
下面是他给出的基本思路,有兴趣的朋友可以自己去研究项目中的具体代码。
透光性 接下来,就需要在物体本身的Shader上动手。Shader基于PBR管线进行编写。
- Blur the source image separably, based on the distance from the camera, and attenuate surrounding sample's influence based on the depth difference between this sample and the center sample (Soft Depth Bias parameter controls the maximum depth difference allowed)
基于到相机的距离,将原始画面模糊处理,并根据此样本与中心采样点之间的深度差异衰减周围采样点的影响。(Soft Depth Bias参数用来控制最大深度差异)- Render the scene with replaced shader, using the mask set in CP_SSSSS_Object script multiplied by the subsurface color
用替换的Shader渲染场景,再使用CP_SSSSS_Object脚本中设置的遮罩贴图和散射颜色相乘。- Composite the blurred stuff on top of the original, multiplying it by mask from step 2, and substracting the original based on the Affect Direct parameter
将模糊处理过的图像在原始画面之上进行混合,与步骤2中的遮罩相乘,然后根据Affect Direct参数减去原始画面。
自然界的玉石是半透明的,不过这里RenderType不使用Transparent,作为透明物体渲染会产生很多其他问题,还是使用Opaque,通过其他手段模拟透光性。
越是靠近物体的边缘,厚度必然越薄,边缘的透光性肯定会变强——所以我加了边缘光
嗯,没错,又是边缘光,这效果虽然土但是很多时候真的很实用啊!
文章图片
之后是逆光时的透光性,我这里只实现了平行光的透射(也就是一般情况下的太阳主光源)。做法其实比较粗暴,简单来说就是将视线方向和反向的光线方向做点积再乘以光强,将其作为自发光(Emission)。
文章图片
当然上面的效果肯定是不太对的,因为不同的地方厚度肯定不同,越厚的地方透光性越差,所以Shader还支持一张厚度贴图,不过我这里没有做(嫌麻烦)。
动起来的效果 【【渲染】Unity中实现近似的SSS/3S效果】项目资源的话……有人想要再说吧,这套东西只是玩具的程度,想正儿八经用的话肯定还要做不少改进。
推荐阅读
- 宽容谁
- 我要做大厨
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘
- 学无止境,人生还很长