• 引言:Shader基础内容由于内容较多分为多个部分记录,该部分主要为动态效果以及屏幕后处理相关

动态效果

如何制作动态效果

  • 让画面动起来是因为每一帧对象的位置、角度、缩放、颜色等等信息的改变后重新渲染带来的
  • 相当于就是间隔一定时间更新一些数据,从而带来了画面变化
  • 那么想要利用Shader制作出动态效果,其实原理也是一样的
  • 我们只需要间隔一定时间改变Shader中的数据,从而改变渲染的结果,最终达到画面变化的目的
  • 这样就能够带来动态感了
  • 总结:

    利用Shader制作动态效果的关键就是 —— 利用时间变化来改变数据,从而导致渲染结果改变,带来画面变化

Shader中的内置时间变量

  • 时间是关键数据,Shader中提供了对应的内置时间变量

    变量名 分量(x, y, z, w) 数学表达式 用途说明 典型应用场景
    _Time (t/20, t, 2t, 3t) t = Time since level load(场景加载后的总时间,单位:秒) 提供不同频率的时间值,用于控制动画速度或周期性效果。 颜色渐变、缓慢波动、周期性运动(如旋转)。
    _SinTime (sin(t/8), sin(t/4), sin(t/2), sin(t)) t = Time since level load,分量对应不同频率的正弦值。 生成平滑的周期性波动效果(如呼吸灯、波浪)。 水的波纹、动态光影、呼吸效果。
    _CosTime (cos(t/8), cos(t/4), cos(t/2), cos(t)) t = Time since level load,分量对应不同频率的余弦值。 类似 _SinTime,但相位偏移90度,适合需要对称周期性变化的场景。 摆动动画、对称波形、能量场效果。
    unity_DeltaTime (dt, 1/dt, smoothDt, 1/smoothDt) dt = Time since last frame(上一帧到当前帧的时间间隔,单位:秒) 用于帧率无关的动画计算,或需要精确控制时间步长的场景。 物理模拟、平滑运动、帧率补偿。

Shader中经常会改变的数据

效果类型 时间控制应用 示例效果
颜色 通过 _Time 变量或三角函数(如 sin)动态调整材质颜色或渐变参数 颜色渐变、周期性闪烁
位置 利用时间变量驱动顶点偏移(如 vertex.xyz + sin(_Time)*offset 水面波动、旗帜飘动
纹理坐标 通过时间改变UV坐标(如 uv + _Time.y*speed)或序列帧索引计算 水流动画、云彩流动、序列帧播放
法线 基于时间生成动态法线扰动(如 normal + sin(_Time)*bumpScale 风吹草动、动态波纹
缩放 使用时间函数(如 1 + sin(_Time)*scaleFactor)控制物体缩放 脉动效果、心跳跳动
透明度 通过时间控制Alpha值(如 lerp(0, 1, sin(_Time)))或透明度动画曲线 淡入淡出、周期性透明闪烁