refer:
雷火知乎
毛星云总结
参考1
参考2
参考3
(有一个想法,厚度图,通过厚度图来控制SSSSS的范围和强度)
-
严格来讲并不是基于物理的渲染,但是其出发点是对BSSRDF的近似,因此我归到PBR这个专栏了,其实本来就不好分类
-
如果希望理解原理,有更深入的理解的话,欢迎来看我的BSSRDF
-
主要解释都在代码注释里
SSSSS
流程:
- 分别获取Object的 遮罩、 漫反射颜色_A、深度 各自存入RenderTex中
- 对遮罩内的漫反射进行blur
两个要点:1、根据Object到Camera的距离确定一个总体的blur范围
2、根据当前片元的深度值,进行微调 - 再获取一张 漫反射颜色_B
- A和B 相加
- 再加上遮罩内的单独的高光
- 得到最后结果
关于blur的详细介绍可以看本人的另一篇文章
注意:后处理中无法使用模板测试
- 多次尝试后,尚未发现能在后处理中使用模板缓冲的办法,SSSSS的案例考虑采用蒙版
后续发现解决办法再来更新
后处理中是不能使用模板测试的,如果使用则会失效,这是因为后处理是在虚拟的渲染纹理中进行的,而这个渲染纹理并没有继承屏幕空间中的各个缓冲(不确定,但应该是这样)
官方API文档中有说 RenderTexture.GetTemporary(rtW, rtH,24);
第三个参数改成24会保留深度模板缓冲,经测试无效
一篇文章介绍说再添加一个语句
RenderTexture buffer = RenderTexture.GetTemporary(rtW, rtH,24);
Graphics.SetRenderTarget(buffer.colorBuffer, src.depthBuffer);
这样会保留缓冲, 但经测试依然无效
代码实现
- 本人学艺不精,现在还没有搞懂遮罩的脚本部分,因此无法完整再现上述流程
但本文的目的是为了理解,因此下面的代码部分,使用了本人自己写的较为基础的版本:没有遮罩,没有深度图和摄像机距离,仅介绍SSSSS中核心的部分
如果有需要完整代码的,Unity的AssetStore中有前辈写好的免费资源
Camera Script
using UnityEngine;
public class SSS_Camera : PostEffectsBase
{
public Shader SSS_Shader;
private Material SSS_Mat = null;
public Material material{
get{
SSS_Mat = CheckShader_CreateMat(SSS_Shader, SSS_Mat);
return SSS_Mat;
}
}
//模糊所需参数
[Range(0,4)]
public int iterations = 3;
[Range(0.2f, 10.0f)