SSSSS屏幕空间次表面散射

本文介绍了在Unity中实现屏幕空间次表面散射(SSSSS)的技术,虽然不是基于物理的渲染,但通过近似BSSRDF来实现。流程包括获取遮罩、漫反射颜色和深度,进行模糊处理,并结合高光得到最终效果。由于后处理中无法使用模板测试,作者提出了使用遮罩的替代方案,但遮罩的脚本部分未详细展开,建议有兴趣的读者参考AssetStore的免费资源或提升脚本能力后再尝试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


refer:
雷火知乎
毛星云总结
参考1
参考2
参考3

(有一个想法,厚度图,通过厚度图来控制SSSSS的范围和强度)

  • 严格来讲并不是基于物理的渲染,但是其出发点是对BSSRDF的近似,因此我归到PBR这个专栏了,其实本来就不好分类

  • 如果希望理解原理,有更深入的理解的话,欢迎来看我的BSSRDF

  • 主要解释都在代码注释里

SSSSS

流程:

  1. 分别获取Object的 遮罩漫反射颜色_A深度 各自存入RenderTex中
  2. 遮罩内的漫反射进行blur
    两个要点:1、根据Object到Camera的距离确定一个总体的blur范围
         2、根据当前片元的深度值,进行微调
  3. 再获取一张 漫反射颜色_B
  4. A和B 相加
  5. 再加上遮罩内的单独的高光
  6. 得到最后结果

流程示意

关于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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值