1. glsl 奇技淫巧

1.1. 缩放

适用于水波纹,信号扩散等动效

1.1.1. 代码举例

uniform float u_time;
uniform sampler2D u_image;

void main() {
  vec2 st = gl_FragCoord.xy / u_resolution.xy;
  vec4 color = texture2D(u_image, (st - 0.5) * (1. - fract(u_time)) * 10.0 + 0.5);
    gl_FragColor = color;
}

1.1.2. 简单说明:

  • 无论是旋转还是缩放,都有一个中心点,在动画之前首先要将 st 平移到中心点(st - 0.5),动画之后再平移回来(+ 0.5)。

  • 对于 texture2D(u_image, st),st 是一个二维向量,st 乘以一个大于 1 的值,纹理贴图是在缩小;反之放大。

  • 对于连续往返的动画,可以使用:abs(sin(u_time));对于不连续的单向动画,可以使用:fract(u_time)。

1.2. 旋转

适用于雷达扫描,特殊标注等动效

1.2.1. 代码举例

uniform float u_time;
uniform sampler2D u_image;

vec2 rotateMat = mat2(
  cos(u_time), -sin(u_time),
  sin(u_time), cos(u_time)
);

void main() {
  vec2 st = gl_FragCoord.xy / u_resolution.xy;
  vec2 newSt = rotateMat * (st - 0.5) + 0.5;
  vec4 color = texture2D(u_image, newSt);
    gl_FragColor = color;
}

1.2.2. 简单说明:

  • 无论是旋转还是缩放,都有一个中心点,在动画之前首先要将 st 平移到中心点(st - 0.5),动画之后再平移回来(+ 0.5)。

  • 旋转动画的核心就是这个旋转矩阵

Copyright © tomgou 2022 all right reserved,powered by Gitbook该文章修订时间: 2023-07-07 11:29:49

results matching ""

    No results matching ""