本文首发于洪流学堂微信公众号。
洪流学堂,学Unity快人几步
洪流学堂公众号回复节点
,获取ShaderGraph节点详解PDF文件(带目录)。
本文基于ShaderGraph 1.1.9 版本。
Math Nodes 数学节点
Math节点中包含了各种数学运算。
Advanced
Absolute 绝对值
返回输入值的绝对值。
Exponential 指数
输入值为In,输出值是Base的In次幂。Base可以通过下拉框选择2或者e。
如Base选择Base2,输入In为3,那么输出Out = 2 ^ 3 = 8
Length 模长
返回一个向量的模长,即向量的长度。例如三维向量的模长计算公式为:
Log 对数
输入值为In,输出值以Base为底,In的对数。Base可以通过下拉框选择2、10或者e。
Modulo 模数
输入为A和B,输出Out = A % B
例如A是10,B是3,那么10 % 3 = 1
Negate 相反数
输入为In,输出为Out = -1 x In
Normalize 单位化
单位化输入的向量,即向量的方向不变,但是模长为1。
如下图所示,| v | 代表向量v的模长,u即为单位化后的向量。
Posterize 色调分离
色调分离是指一幅图像原本是由紧紧相邻的渐变色阶构成,被数种突然的颜色转变所代替。这一种突然的转变,亦称作“跳阶”。
更多详细内容参见:https://en.wikipedia.org/wiki/Posterization
Steps值越低,色阶越少,分离现象越严重。Steps越高,和原图的差别越小。
Out = floor(In / (1 / Steps)) * (1 / Steps)
Reciprocal 倒数
输入为In,输出Out = 1 / In
Reciprocal Square Root 平方根倒数
输入为In,输出Out = 1 / In^0.5
Basic 基本运算符
Add 加法
输出Out = 输入A + 输入B
Divide 除法
输出Out = 输入A / 输入B
Multiply 乘法
输出Out = 输入A * 输入B
Power 幂
输出Out = 输入A ^ 输入B
Square Root 平方根
输出Out = 输入In ^ 0.5
Subtract 减法
输出Out = 输入A - 输入B
Derivative 导数
DDX
返回屏幕空间中输入In在X轴上的偏导数。这个节点只能用于像素着色器阶段。
DDXY
返回屏幕空间中输入In在X轴和Y轴上的偏导数的和。这个节点只能用于像素着色器阶段。
Out = abs(ddx(In)) + abs(ddy(In))
DDY
返回屏幕空间中输入In在Y轴上的偏导数。这个节点只能用于像素着色器阶段。
Interpolation 插值
Lerp 线性插值
根据输入A、B和T进行线性插值。T的值会被Clamp到[0, 1]。
公式是:Out = (1-T)*A + T*B
Inverse Lerp 反向线性插值
根据输入A、B和T求出线性插值的系数。这个操作是Lerp的反向操作。
公式是: Out = (T - A)/(B - A)
Smoothstep 平滑阶梯
如果输入In在Edge1和Edge2之间,则返回Hermite插值(https://baike.baidu.com/item/%E5%9F%83%E5%B0%94%E7%B1%B3%E7%89%B9%E6%8F%92%E5%80%BC/8113661)。如果In小于Edge1,则返回0,如果In大于Edge2,则返回1。
这个节点类似于Lerp节点,但有两个显着差异。第一,此节点返回值介于0和1之间,而Lerp返回值介于输入的A和B之间。第二,该节点使用平滑的Hermite插值而不是线性插值。Hermite插值在开始加速并在最后减速。这对创建自然的动画,淡入淡出和其他转换非常有用。
Matrix 矩阵
Matrix Construct 构造矩阵
根据输入的向量构造矩阵。下拉框可以选择Row或Column。
选择Row时,每个向量代表矩阵的每一行。
选择Column时,每个向量代表矩阵的每一列。M0代表第一列,M1代表第二列……
Matrix Determinant 矩阵行列式
返回该矩阵的行列式。
Matrix Split 分割矩阵
将矩阵按行或列分割成向量。
Matrix Transpose 矩阵转置
返回矩阵的转置。
Range 范围
Clamp
如果输入In介于A、B之间返回In;若输入In小于Min,返回Min;若大于Max,返回Max
Fraction 取小数部分
返回输入In的小数部分。比如输入3.14则返回0.14。
Maximum 最大值
返回两个值的最大值,如果是多维向量则取每个维度的最大值
Minimum 最小值
返回两个值的最小值,如果是多维向量则取每个维度的最小值
One Minus 1减去
输出Out = 1 - 输入In
Random Range 范围随机
根据输入Seed返回一个伪随机数值,介于输入Min和Max之间。
虽然输入种子中的相同值总是会导致相同的输出值,但输出值本身为随机值。Input Seed是一个Vector 2值,方便根据UV输入生成一个随机数,但对于大多数情况,Vector 1输入就足够了。
Remap 重映射
根据输入In在InMinMax中的插值,计算输出。
比如输入In为0,InMinMax时(-10,10),那么In在InMinMax的位置就是0.5,如果OutMinMax为(0,10),那么输出Out就是5
公式为:Out = OutMinMax.x + (In - InMinMax.x) * (OutMinMax.y - OutMinMax.x) / (InMinMax.y - InMinMax.x)
Saturate
将输入In Clamp到[0, 1]
Round 四舍五入
Ceiling 向上取整
比如输入5.4,则返回6
比如输入6,则返回6
Floor 向下取整
比如输入5.4,则返回5
比如输入6,则返回6
Round 四舍五入
比如输入5.5,则返回6
比如输入5.4,则返回5
Sign 正负符号
小于0返回-1
等于0返回0
大于0返回1
Step 阶梯
如果输入In大于等于输入Edge,返回1,否则返回0
Truncate 截取(舍弃小数)
比如输入5.5,则返回5.0
比如输入5.4,则返回5.0
Trigonometry 三角函数
Arccosine 反余弦arccos
输入应该在[-1, 1]
Arcsine 反正弦arcsin
输入应该是-Pi/2 到 Pi/2
Arctangent 反正切arctan
输入应该是-Pi/2 到 Pi/2
Arctangent2 即Atan2
数学含义见:https://baike.baidu.com/item/atan2/10931300
Cosine 余弦cos
Degrees To Radians 角度转弧度
比如输入360,输出PI
比如输入60,输出PI/6
Hyperbolic Cosine 双曲余弦cosh
Hyperbolic Sine 双曲正弦sinh
Hyperbolic Tangent 双曲正切tanh
Radians To Degrees 弧度转角度
比如输入PI/6,输出60
Sine 正弦sin
Tangent 正切tan
Vector 向量
Cross Product 叉乘
返回输入A和B的值的叉乘。两个向量的叉乘的结果是一个垂直于两个输入向量的第三个向量。结果的大小等于两个输入向量的模,乘以输入向量之间角度的正弦值,如上图。可以使用“左手法则”确定结果向量的方向。
叉乘法与左手法则
左手展平,四指并拢,拇指与四指呈90度夹角。让第一个矢量的箭头刺向左掌心,并使四指指根到指尖方向与第二个矢量指向相同,拇指指根到指尖的方向就是第三个矢量的方向。
Distance 距离
返回两个向量的欧式距离
详见:https://en.wikipedia.org/wiki/Signed_distance_function
Dot Product 点乘
Fresnel Effect 菲涅尔效应
菲涅耳效应是基于视角的不同对表面反射率的影响,接近掠射角度时会反射更多光线。菲涅耳效应节点通过计算表面法线和视角方向之间的角度。该角度越宽,返回值越大。这种效果通常用于实现边缘照明,这在许多特效中很常见。
Out = pow((1.0 - saturate(dot(normalize(Normal), normalize(ViewDir)))), Power)
Projection 投影
将输入A投射到向量B上,返回投射后的向量。具体数学含义见Rejection中的图片。
Out = B * dot(A, B) / dot(B, B)
Rejection
如上图所示,a1是a投影到b上的向量。a2是a在b上的rejection向量。
小结
本文讲解了ShaderGraph众多Node中的Math Nodes。你可以收藏本文作为一个工具库。
其他Node的详解,关注洪流学堂公众号第一时间获取。
洪流学堂公众号回复节点
,获取ShaderGraph节点详解PDF文件(带目录)。
你有没有饱受shader折磨的同学?你可以把今天的内容分享给他,或许你能帮到他。
《郑洪智的Unity2018课》,倾尽我8年的开发经验,结合最新的Unity2018,带你从入门到精通。