渐变网格

5 / 15
练习基于 UV 构建重复图案。

用一行代码把连续渐变变成格子状的阶梯渐变:

下面拆解原理。


floor 怎么把渐变"量化"

vUv * 6.0 把 0–1 的 UV 坐标扩展成 0–6,画面分成 6×6 的格子。

floor() 向下取整,把每个格子内所有连续的坐标值压缩成同一个整数:

  • 坐标 0.1, 0.3, 0.5, 0.9 → 都变成 0
  • 坐标 1.2, 1.7 → 都变成 1
  • 以此类推

/ 6.0 把整数再缩回 0–1 范围(0→0.0, 1→0.167, 2→0.333…)。

结果:同一格子里所有像素的 cell 值完全相同,颜色统一,格与格之间有明显的跳跃。


vec3(cell, 0.0) 怎么上色

vec3(cell, 0.0)cell.x 作为红色通道,cell.y 作为绿色通道,蓝色固定为 0:

  • 左下格 (0, 0) → 黑色
  • 右下格 (5/6, 0) → 红色
  • 左上格 (0, 5/6) → 绿色
  • 右上格 (5/6, 5/6) → 黄色(红+绿)

试着改一改

改动效果
6.0 改为 3.0格子变大,只有 3×3
6.0 改为 12.0格子变小,变成 12×12
vec3(cell, 0.0) 改为 vec3(0.0, cell.x, cell.y)颜色通道换到绿色和蓝色
floor(...) 去掉,只保留 vUv * 6.0 / 6.0格子消失,变回平滑渐变

练习

vec2 cell = vUv; 改成正确的表达式,让渐变呈现阶梯状的 6×6 网格效果。

答案解析

floor(vUv * 6.0) 把连续坐标离散成 0–5 的整数。/ 6.0 把它缩回 0–1 范围,让颜色幅度保持和原来一致。

初始代码 cell = vUv 直接把 UV 坐标当颜色,是平滑渐变,没有格子边界。加上 floor(...) / 6.0 之后,同一格子内所有像素共享同一个坐标值,阶梯感就出现了。

试着把 /6.0 改为 /3.0,看看颜色分布会发生什么变化。

GLSL 代码编辑器

正确代码预览

当前代码预览