Mr._chen。 发表于 2020-11-29 11:16

Unity_SeparableSubsurface

(PS这里读者得具备一定的CommandBuffer的使用经验)用过Unity的都知道,引擎本身不具备次表面 眼睛 毛发 布料等复杂视觉效果的材质提供。最近因为某些需求就在Unity里面实现了一个基于屏幕空间的次表面。特此来分享一下。如果不清楚次表面的可以看下面链接。

首先呢本SSS的算法来自Iryouku的GitHub开源项目"Separable SSS"。接下来我就来分享一下我在Unity的实现。第一呢根据作者源代码他的计算是每次高斯模糊的时候加权一个颜色叠加官方的HDPipeline这个操作是放到ComputeShader计算的,但是就我测试这个计算消耗并不是很大几乎可以忽略不计,所以我这里就直接使用了一个静态C#来实现。
接着就是把作者的SSS的Shader部分在Unity内的重现。我这里做了封装cginc(比较直观且不会杂乱多。。)。以下是cginc的部分(注意这里的参数_MainTex,这个是后面C#部分传递进来的一个参数)。
然后是SSS的Shader计算部分(分了两个Pass,第一个Pass算XBlur第二个算YBlur),其次就是这里开启了Stencil。
至此Shader部分的计算基本完成。剩下C#部分。因为作者这个算法是屏幕空间的次表面那也就代表他其实是一个后期全屏幕特效。这里我使用的是CommandBuffer来进行摄像机的后期处理而不是直接的OnImageRender,好处是这也能拿到Stencil(顺便安利一下Unity的Stencil在延迟渲染下貌似并没有什么作用,所以如果要做延迟次表面就得去修改引擎的延迟渲染文件。下面放个一个大佬的实现。支持延迟渲染和延迟Stencil。)
最后的最后来一串效果展示,奇数张是不带SSS的,偶数张是带SSS的(不要在意那个眼睛。简单扔上去的不是很好看,以后有空做个EyeShader)。
页: [1]
查看完整版本: Unity_SeparableSubsurface