鼠标交互

7 / 14
学习使用鼠标坐标创建交互效果,理解uniform变量的传递和使用。

一个彩色光晕跟随鼠标位置移动,同时随时间脉动。核心代码是:

下面拆解每个部分。


u_mouse 是什么

u_mouse 是从外部传入的鼠标坐标,单位是像素(比如 vec2(150.0, 200.0))。

u_resolution 是画布的像素尺寸。把鼠标坐标除以分辨率,就换算到 0.0~1.0 的归一化范围,和 uv 坐标的单位一致,才能用 distance 比较。


计算距离并生成光晕

distance(uv, mouse) 返回当前像素到鼠标位置的距离。

smoothstep(0.0, radius, dist) 在 0 到 radius 之间生成 0.0~1.0 的过渡:

  • 距离为 0(就在鼠标上)→ 0.0
  • 距离大于 radius → 1.0

1.0 - ... 反转,让鼠标附近为 1.0(亮),远处为 0.0(暗)。这就是光晕效果。


光晕的颜色来自哪里

光晕中心最亮时,红色通道是 glow = 1.0,绿色是 0.5,蓝色是 0.8,组合成粉紫色。离中心越远,三个通道都等比例减小,最终归零。


试着改一改

改动效果
radius = 0.3光晕更大
radius = 0.08光晕变成小圆点
vec3(glow, glow, 0.0)黄色光晕
vec3(mouse.x, mouse.y, glow)光晕颜色跟随鼠标位置变化

练习

练习区的效果已经基本完整,但鼠标颜色和脉动已经写好。把 u_mouse / u_resolution 正确赋值给 mouse,让光晕跟随鼠标移动,并添加 sin(u_time) 脉动。

答案解析

  • u_mouse / u_resolution 把鼠标坐标归一化到 0.0–1.0
  • distance(uv, mouse) 测量每个像素到鼠标的距离
  • 1.0 - smoothstep(0.0, 0.2, distToMouse) 在半径 0.2 内生成光晕
  • vec3(mouse, 0.5) 让颜色跟随鼠标的 x、y 位置变化
  • sin(u_time * 2.0) * 0.5 + 0.5 产生 0.0–1.0 的脉动值
  • 三者相乘让光晕同时具备位置跟随、颜色变化和脉动效果

试着把 circle * pulse 改成 circle + pulse * 0.1,光晕会在脉动时微微扩大而不是整体变暗。

GLSL 代码编辑器

正确代码预览

当前代码预览