【Unity】ShaderGraph应用(模型膨胀流动)
实现效果
ShaderGraph是 unity的图形化 Shader 编程工具。本文介绍使用ShaderGraph实现模型的膨胀流动效果。该效果可以由于模拟流体在管线中的流动等相关功能。
一、实现的方法
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\pi 2π(这里没有找到 π \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
变量面板
Loop:控制膨胀是周期内单个还是多个
2.案例的局限性
要实现完美的膨胀效果,在管线上要尽量布置多的横向节点,在大数量级上会导致顶点过多,影响性能。