前言:每日记录自己学习unity的心得和体会,小弟才疏学浅,如有错误的地方,欢迎大佬们指正,感谢~
一、实现的方法
1.使用节点介绍
关键节点
UV:获取模型的uv坐标
Normal Vector:获取模型的法线坐标
Position:获取模型的顶点坐标
计算用节点
Add:加
Subtract:减
MultiPly:乘
Divide:除
Truncate: 取整(直接取小数点前整数部分)
Cosine:cos(输入值弧度,输出值-1到1)
其他节点
Clamp:输入值截取到最大值和最小值
Split:分解
2.实现原理
可以Cos在弧度0到2 π \piπ上的分布是一个平滑凹型曲线。利用这个特征,可以将uv x轴(或者y轴)0到1的变化拉抻成0到2π \piπ,通过cos函数的变化,得到该uv位置是cos曲线数值。
如上图,模型顶点圈对应是数值垂直分布在x轴的某个数值上,通过计算uv X轴上的值,可以计算该圈的变形数值。
如上图,是模型的顶点法线图,每个顶点的法线都是指向模型膨胀的方向,uv的Cos数值乘上法线就可以得到顶点的膨胀向量。
3.实现步骤
拉伸uv的x坐标
截取膨胀范围
转换Cos数值
得到膨胀向量
顶点位移
贴图采样和膨胀高光
(1)拉伸uv的x坐标
UVxLong(float):UVxLong的长度的倍数,考虑到uv x轴上的分布有可能不是0到1的,如果uv的x轴的长度是2,UVxLong就是2。用于适应不同长度的uv。
Times(float):变化的周期数。
目的:将UV的x轴除去UVxLong标准化uv,x轴乘上2 π 2\pi2π(这里没有找到π \piπ的节点,用6.28代替)
(2)截取膨胀范围
Speed(float):Time变化速度
目的:当变化周期大于1时,只让模型上只存在一个膨胀节点。上图使用Clamp截取,截取的范围是0到6.28。
图中Times的作用是给拉伸后的uv累加值,考虑到uv的值会大于周期的最大值,导致无法截取有效范围,故将最大值减当前周期长度,实现循环清零。
(3)转换Cos数值
目的:得到一个完整的凸起(凹陷)数值,为法线提供模长做为依据。
(4)得到膨胀向量
变量:
R:控制膨胀的半径
目的:将法线乘上膨胀的半径,再乘上cos转换后的数值,这里cos转换后的数值是负值,得到的向量和法线是相反的。
(5)顶点位移
目的:由于膨胀向量是反方向,把顶点坐标减去反方向的向量,负负得正,求出顶点坐标。(注意这里的顶点坐标是自身坐标系)
(6)贴图采样和膨胀高光
变量:
Textrue:主纹理
Color:叠加颜色
目的:这里将2减去cos数值,得到一个正的变化曲线,乘上采样叠加颜色的值,可以使凸起部分的高光。
二、案例
1.案例介绍
完整的shaderGraph
变量面板