Amplify Shader Editor 案例解析系列——(2)DissolveBurn

前言

该篇分析第二个案例,DissolveBurn。

正文

这里我们同样拿cube去分析效果,没必要使用原模型,原理是一样的,首先复制案例中的shader,创建新的材质,赋予给一个cube,修改Dissolve Amount值,可以看到消融效果,分别展示Dissolve Amount 为0,0.5时的效果

 发现效果有以下几处(不考虑模型纹理贴图与法线贴图,与效果无影响):

1.cube内部也可以渲染出来

2.cube表面有透明区域,并不是完全铺满的,修改Dissolve Amount值也可以减少/增多透明区域

3.cube表面透明区域不是规则的

4.透明区域与非透明区域边缘部分,有高亮,且颜色呈渐变色

然后对效果进行一一解析:

1.没有使用剔除效果,该效果与案例1中效果1完全一样,不再赘述

2.根据Opacity mask输入与材质的mask clip value值进行比较,前者大的地方,不透明,否则透明,与案例1中效果2一样,不再赘述。修改Dissolve Amount值,可以改变透明区域,是因为Dissolve Amount值影响了Opacity mask的输入,影响过程与效果3一同讲解

3.在案例1中,是使用一张规则的遮罩贴图,然后取alpha通道输入到Opacity mask,进而与mask clip value值比较,控制透明区域的显示,这里同理,使用了一张贴图作为透明贴图,但是我们发现这个贴图,与其他贴图不同,不是规则的,只有黑白两色,感觉是“乱画”的,没错,可以理解为“乱画”的,这种贴图成为噪音贴图,在特效中有广泛作用,许多效果加上噪音贴图处理(或者成为过滤,而过滤的根据即贴图的颜色值某个通道),会变得更加真实,比如火焰特效,可以用噪音贴图处理,进行部分位置透明,从而使火焰并不是完整的一块,更加的真实。

 预览该贴图以及该贴图的R通道,纯白色为1,纯黑色为0,中间色为差值,然后与Dissolve Amount值进行处理,输入到Opacity mask,然后与mask clip value值进行比较,处理透明度效果,我们看一下这个处理过程。分别展现Dissolve Amount为0 和0.5的结果:

首先看Add节点的输出,dissolve amount为0时,可以看到基本上是属于全白色(即值为1),偶尔有部分区域属于黑白之间,而由于材质的mask clip value默认为0.5,拿Add输出的各个点值与mask clip value值相比较,即可得出dissolve amount 为0 时,没有透明区域(修改mask clip value,可以看到不一样的效果);当dissolve amount为0.5时,Add的输出大多位于黑白之间,有些地方甚至为黑色(即为0),此时再与mask clip value值比较,就可得到区域透明的效果,即值小于mask clip value的区域。然后看整个流程,首先输入0~1的值dissolve amount,然后进行One Minus操作,公式为:Out = 1 - In。然后Remap(值依次为0,1,-0.6,0.6)操作,公式为:Out = MinNew + (In - MinOld) * (MaxNew - MinNew) / (MaxOld - MinOld)。将结果与Disolve Guide 节点贴图的R通道相加输出。分析极值,输入0时,依次计算 One minus = 1,Remap = 0.6 , Add = R + 0.6,所以大多地方为白色(即值为1)。输入1时,依次计算 One Minus = 0,Remap = -0.6,Add = R - 0.6,所以大多地方为黑色(即值为0)。当然这个处理过程不是固定的,我们甚至可以直接将Dissolve Amount 与 Disolve Guide的R通道相加,一样可以改变透明区域的占比。

4.效果4这部分使用的是将一个渐变色贴图处理后输出到Emission外发光,看一下处理流程:

首先将Dissolve Opacity Mask模块的Add输出输入到Remap(值依次为0,1,-4,4)节点, 然后进行Clamp(值依次为0,1)操作,Clamp公式为:if(In<=Min) Out = Min; else if(In>=Max) Out = Max;else Out = In。即将输入的值归于0~1之间,那么这里先remap,把值从0~1重映射到-4~4之后,再clamp将值归于0~1之间的意义是什么呢?举个例子,假如原值为0,0.1,0.2,0.3 .... 0.9,1,remap 后,结果为

clamp之后,结果为(0,0,0,0,0,0,0.8,1,1,1,1)可以发现,原本平均分散在0~1的11个数, 处理之后,只有一个在0~1内,剩余的都分布在两端,即0或1。所以我们可以发现,Clamp之后的结果黑白更加分明,而中间色很少。然后进行One Minus操作,可以看做是“黑白颠倒”,将此值输出到Append节点的X输入,与Y的输入常量0组合成vector2输出到Burn Ramp贴图的UV,即在Burn Ramp处对应的位置,取色为贴图在输入UV的值。举例以贴图左下角为例,没有传入UV时使用默认的UV,取色坐标为(0,0),但是看One Minus节点(由于Append节点的Y输入值为0,色调红色不方便观察,所以这里可以观察One Minus节点,效果是一样的)左下角的位置为白色,值为1,Append之后转换为vector2:(1,0),即在Burn Ramp处,左小角颜色取值为原图UV 坐标为(1,0)的值,所以不是原图的黑色。而渐变效果是因为原图沿U方向为渐变色,在U值递增或递减时,取渐变的色块,以此来实现渐变效果。然后用Burn Ramp与One Minus结果相乘(黑色乘以任意颜色都是黑色,白色乘以任意颜色都是原色),输入到Emission,黑色部分与模型原颜色相加,显示为原颜色,而其他区域由于Opcaity Mask的输入,显示为透明区域(这里有一个疑问,为什么Dissolve Opacity Mask节点add的输出,经过一系列变换remap,clamp,onn minus之后,还能与原图的透明度完美契合呢?即发光的地方不透明,其他地方保证透明,下面单独解析),所以产生了最终的效果。

推理上面那个疑问,设Dissolve Opacity Mask节点Add的输出值为x,已知x值范围为 0~ 1 ,接下来remap(参数分别为0,1,-4,4),设结果为y,可得y = -4 + \left ( x - 0 \right ) * \left ( 4 + 4 \right ) / \left ( 1 - 0 \right ) = 8x - 4,然后clamp,得 当 8x - 4 >= 1时,y = 1 ,即当x >= 5/8时,y = 1,同理 x <= 1/2时,y = 0,介于中间时则y值在0~1之间,不做考虑,无关紧要。然后再进行One Minus,可得 当 x >= 5 / 8 时,y = 0 ,当 x <= 1 / 2时,y = 1。所以可得在One Minus里,纯白色区域,输入的x值 满足 x <= 1 / 2,即 x <= 0.5。看到这个0.5,有没有感觉很熟悉,这个值是mask clip value的默认值,也就是说,当输入的x值小于等于mask clip value时,在One Minus处,显示为白色,而同时,该区域为透明区域,所以就实现了上面说的,Dissolve Opacity Mask节点add的输出,经过一系列变换后,依旧可以与原图的透明度完美契合。这里可能会有疑问,不是说  Opacity Mask >= mask clip value的地方,透明度为1吗,应该是要显示的吗?怎么又变成透明了呢?没错,在Opacity Mask = mask clip value 时,透明度为1,但是我们这里使用的是噪音贴图,不是规范的,所以说这些极值存在的地方很少,可以忽略不计。总结可以知道,remap的参数输入不是随便输的,而是要与其他参数相配合,假如这里我们在外面修改了mask clip value值,那么效果就会变差,可以试一下。由于没有写推导过程的工具,所以这里只好文字描述,可能不太直观,但是这个本身也没有那么麻烦,写一下就可以推导出。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值