【Unity】ShaderGraph应用(模型膨胀流动)

【Unity】ShaderGraph应用(模型膨胀流动)

实现效果

ShaderGraph是 unity的图形化 Shader 编程工具。本文介绍使用ShaderGraph实现模型的膨胀流动效果。该效果可以由于模拟流体在管线中的流动等相关功能。

一、实现的方法

1.使用节点介绍

关键节点

UV:获取模型的uv坐标

Normal Vector:获取模型的法线坐标

Position:获取模型的顶点坐标

计算用节点

Add:加

Subtract:减

MultiPly:乘

Divide:除

Truncate: 取整(直接取小数点前整数部分)

Cosine:cos(输入值弧度,输出值-1到1)

其他节点

Clamp:输入值截取到最大值和最小值

Split:分解

2.实现原理

【Unity】ShaderGraph应用(模型膨胀流动)_第1张图片

如上图,可以Cos在弧度0到2 π \pi π上的分布是一个平滑凹型曲线。利用这个特征,可以将uv x轴(或者y轴)0到1的变化拉抻成0到2 π \pi π,通过cos函数的变化,得到该uv位置是cos曲线数值

【Unity】ShaderGraph应用(模型膨胀流动)_第2张图片

如上图,模型顶点圈对应是数值垂直分布在x轴的某个数值上,通过计算uv X轴上的值,可以计算该圈的变形数值。

【Unity】ShaderGraph应用(模型膨胀流动)_第3张图片

如上图,是模型的顶点法线图,每个顶点的法线都是指向模型膨胀的方向,uv的Cos数值乘上法线就可以得到顶点的膨胀向量

3.实现步骤

  • 拉伸uv的x坐标
  • 截取膨胀范围
  • 转换Cos数值
  • 得到膨胀向量
  • 顶点位移
  • 贴图采样和膨胀高光

(1)拉伸uv的x坐标

【Unity】ShaderGraph应用(模型膨胀流动)_第4张图片

变量

  • 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)截取膨胀范围

【Unity】ShaderGraph应用(模型膨胀流动)_第5张图片

变量

  • Speed(float):Time变化速度

目的:当变化周期大于1时,只让模型上只存在一个膨胀节点。上图使用Clamp截取,截取的范围是0到6.28。

图中Times的作用是给拉伸后的uv累加值,考虑到uv的值会大于周期的最大值,导致无法截取有效范围,故将最大值减当前周期长度,实现循环清零。

(3)转换Cos数值

【Unity】ShaderGraph应用(模型膨胀流动)_第6张图片

目的:得到一个完整的凸起(凹陷)数值,为法线提供模长做为依据。

【Unity】ShaderGraph应用(模型膨胀流动)_第7张图片

(4)得到膨胀向量

【Unity】ShaderGraph应用(模型膨胀流动)_第8张图片

变量:

R:控制膨胀的半径

目的:将法线乘上膨胀的半径,再乘上cos转换后的数值,这里cos转换后的数值是负值,得到的向量和法线是相反的。

(5)顶点位移

【Unity】ShaderGraph应用(模型膨胀流动)_第9张图片

目的:由于膨胀向量是反方向,把顶点坐标减去反方向的向量,负负得正,求出顶点坐标。(注意这里的顶点坐标是自身坐标系)

(6)贴图采样和膨胀高光

【Unity】ShaderGraph应用(模型膨胀流动)_第10张图片

变量:

  • Textrue:主纹理

  • Color:叠加颜色

目的:这里将2减去cos数值,得到一个正的变化曲线,乘上采样叠加颜色的值,可以使凸起部分的高光。

【Unity】ShaderGraph应用(模型膨胀流动)_第11张图片

二、案例

1.案例介绍

完整的shaderGraph

【Unity】ShaderGraph应用(模型膨胀流动)_第12张图片

变量面板

【Unity】ShaderGraph应用(模型膨胀流动)_第13张图片

Loop:控制膨胀是周期内单个还是多个

2.案例的局限性

要实现完美的膨胀效果,在管线上要尽量布置多的横向节点,在大数量级上会导致顶点过多,影响性能。

你可能感兴趣的:(Unity,unity,游戏引擎)