GLSL 内置函数

sin()

返回弧度角的正弦值,是一条每 2 * PI 重复一次、始终在 -1.0 到 1.0 之间的平滑波形。

函数签名

float sin(float angle)
vec2 sin(vec2 angle)
vec3 sin(vec3 angle)
vec4 sin(vec4 angle)

参数

angle
弧度制的角度(2 * PI 约等于 6.2831,表示转一整圈)。

返回值

-1.0 到 1.0 之间的值。

在线示例

修改右侧代码,左侧预览会实时更新。

工作原理

sin 把一个不断增大的数变成一条永远上下起伏的波:

  • sin(0.0) 是 0.0
  • sin(1.5708)(四分之一圈)是 1.0
  • sin(3.1416)(半圈)又回到 0.0
  • 过了 6.2831(一整圈)波形开始重复

在 a * sin(x * f + t) 里,三个数控制波形:

部分作用
a波的高度(振幅)
f同样的空间里放几个波(频率)
t让波左右平移;加上 u_time 波就会动起来

常见用法

  • 动画:0.5 + 0.5 * sin(u_time) 在 0 到 1 之间平滑地呼吸。
  • 波纹和条纹:sin(uv.x * 40.0) 得到等间距的条纹。
  • 抖动和扭曲:uv.x += 0.02 * sin(uv.y * 30.0 + u_time) 让画面产生水波般的晃动。

常见错误

  • 用了角度制。GLSL 使用弧度,sin(90.0) 并不等于 1.0,要用 radians(90.0) 转换。
  • 直接把结果当颜色。sin 返回 -1 到 1,负的颜色会被截成黑色,应换算成 0.5 + 0.5 * sin(x)。
  • 传入很大的 u_time。运行几个小时后,mediump 精度不够,动画会卡顿。只关心相位时,用 mod(u_time, 6.2831) 包一下。

相关函数

用到 sin() 的教程