1.原理:
每个像素都由一个向量表示,这个向量指向图像中的一个吸引点。吸引点可以是用户指定的控制点,也可以是图像中的某些特征点
根据周围像素的向量插值出一个向量。这可以通过双线性插值或更高阶的插值方法来实现
重点:
通过将像素位置沿着向量方向移动来实现,根据需要调整向量场的强度和方向,以获得所需的扭曲效果
2.代码
#define PI 3.1415926
void mainImage( out vec4 fragColor, in vec2 fragCoord ) {
// 定义贴图坐标
vec2 uv = fragCoord / iResolution.xy;
uv -= 0.5;
vec2 center = vec2(0.0,0.0);
// 假设向量场是水平的,可以修改这个向量以改变扭曲的方向
vec2 normal = vec2(uv.y, -uv.x);
float strength = 1.0 - smoothstep(0.0, 1.0, length(uv - center));
vec2 offset = normal * strength;
vec3 c = texture(iChannel0, uv + offset).rgb;
fragColor = vec4(vec3(c), 1.0);
}
效果: