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

前言

该系列文章对ase官方案例进行流程分析,旨在记录自己的理解,如有错误之处恳请指出。尽量保持持续更新。使用插件版本为1.64,下载地址https://download.csdn.net/download/a598211757/13985994,该篇分析第一个案例,2sided。

正文

这里对cube的效果进行分析,首先看从不同角度看向目标的效果图:

                                                                   

  

发现效果有以下几处:

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

  2.每个表面都有透明区域,不是铺满的状态

  3.cube外部渲染出的颜色为红色,cube内部则为蓝色

  4.cube外部与内部的凸凹纹理不同,即使用的法线贴图不同

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

  1.一般来说我们渲染的时候是使用背部剔除,因为我们不关心摄像机看不到的地方,同时也能减小渲染压力,这里能看到内部,是因为关闭了剔除

 2.透明效果的出现是因为shader的混合模式blendmode选择了Masked模式,该模式下,可以根据最终节点的Opacity mask的输入,与shader本身的mask clip value 值进行对比,前者大于等于后者时,透明度为1,即完全显示,否则透明度为0,以此来实现部分区域透明的效果,这里使用一张遮罩贴图的透明度来控制了区域的透明度,如图

 打开节点预览,打开贴图节点的rgba所有通道的预览可以看到如图的效果,对贴图的透明度a通道进行输出,可以看到得到了对应的黑白区域,其中白色处透明度为1,黑色处透明度为0,输出到Opacity mask后再与mask clip value值进行比较,从而得出效果图中的形状,此时如果我们修改mask clip value值,我这里称为透明度阈值,可以看到不同的效果,上图阈值为-0.0001,下图阈值为1.0001

                                                              

 

 

 由于这里贴图输出的结果只有0,1,所以拿这两个特殊的值来测试,如果换成其他贴图,是连续性的值,那么也会是同样的结果,即小于阈值处透明,大于等于处显示。同时,换了不同的贴图时,需要注意不是必须要使用贴图的透明通道来输出变换结果,应该根据自己需要的结果,与贴图通道进行分析,得出预想的输出,假如例子中使用的是贴图r通道进行输出,那么会得到一张全白色的输出,即所有位置都为1,因为该贴图所有地方的颜色值都是(1,0,0)(不考虑alpha)。

3.shader中front faces comment 与 back faces comment模块分别定义了一个红色 * 贴图,蓝色 * 贴图,这一块只是简单的给贴图附上颜色,然后作为模型的贴图进行显示,只是在输出时,进行了一个lerp差值转换,lerp的意思是从A到B,根据alpha值进行差值输出,其中alpha值范围为0 - 1,画个一维坐标系可得到以下公式,其中R指输出的结果:\frac{R-A}{B-A} = \frac{alpha-0}{1-0},计算得到:R = alpha * B + \left ( 1 - alhpa \right ) * A,可以看出alpha值越趋近于1,那么结果与B的相似性越大,当alpha = 1时,R =B ,同理,alpha =  0时,R = A。那么怎样的lerp取值能实现显示的效果呢,我们看下lerp求值模块,Face Sign comment:

 对该comment进行分析,首先对世界空间下对象的法线与世界空间下的视角方向(观察点到眼睛的向量)向量进行Dot(点积)运算,求得夹角θ余弦值得到如上结果,根据余弦函数,夹角θ在0 ~ PI/2时,值为 1 ~ 0,在 PI/2 ~ PI时,值为 0 ~ -1。 即当我们的视角方向与当前顶点法线夹角为锐角时,点积的结果为正值,反之为负值。然后对dot结果进行了sign处理,得出sign结果,sign的运算方式为:输入向量,对应每个分量,正数输出1,0输出0,负数输出-1。例如(-0.4,0,0.5),输出(-1,0,1)。然后进行remap重映射,得到remap结果,remap计算公式为:Out = MinNew + (In - MinOld) * (MaxNew - MinNew) / (MaxOld - MinOld)。总结下这一整个过程的运算结果,即我们视角方向与对象法线方向夹角θ为锐角时,得出结果为0(举例:θ = PI/4,得出cosθ > 0,通过sign变变换成1,再通过remap ,代入公式计算出值 0),值为钝角时,得出结果为1。那么哪些地方夹角为锐角呢?当然是我们看到的那面,即看到的一面,值为0,看不到的面,值为1,那么物体内部呢,我们在cube距离我们视线较远的面上找一点,这一点的法线方向显然是与视角方向成钝角,故物体内部同样得到的值为1。然后再用此值作为lerp的alpha值,当该点值为0时,颜色取值为A,即红色,反之则为B,蓝色,然后就产生了外红内蓝的结果。

4.内部使用不同的法线贴图与3原理一模一样,不做解析。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值