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.0sin(1.5708)(四分之一圈)是1.0sin(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)包一下。