棋盘格图案

13 / 15
结合 mod() 函数与 floor(),生成黑白相间的棋盘格纹理。

把画面分成 8×8 网格,再用一个公式判断每格该填黑还是白:

下面拆解原理。


floor 怎么把坐标变成格子编号

vUv.x 是 0–1 的横坐标,乘以 8 变成 0–8。floor() 向下取整,把连续坐标变成整数编号:

  • 左边一列的坐标是 0.0–1.0 → floor 后等于 0
  • 第二列的坐标是 1.0–2.0 → floor 后等于 1
  • 以此类推……

y 同理,把纵向坐标离散成 0–7 的行编号。


mod 怎么决定黑白

把列号和行号加起来,对 2 取余:

  • 偶数格(余数 = 0)→ pattern = 0.0mix(白, 黑, 0.0) → 白色
  • 奇数格(余数 = 1)→ pattern = 1.0mix(白, 黑, 1.0) → 黑色

因为相邻格子的编号之和必然奇偶交替,所以颜色也自然交替,棋盘格就出来了。


试着改一改

改动效果
8.0 改为 4.0格子变大,4×4 棋盘
8.0 改为 16.0格子变小,16×16 棋盘
mix(vec3(1.0), vec3(0.0), pattern) 换成彩色红白、蓝黄等任意配色
只用 mod(x, 2.0) 而不加 y变成垂直条纹

练习

从空白状态写出完整的 8×8 棋盘格着色器,输出黑白交替的格子。

答案解析

floor(vUv.x * 8.0) 把横坐标离散成 0–7 的列号,floor(vUv.y * 8.0) 把纵坐标离散成 0–7 的行号。把两个编号相加后对 2 取余,相邻格子的余数必然不同,形成 0/1 交替的棋盘遮罩。mix(vec3(1.0), vec3(0.0), pattern) 把 0 映射到白色、1 映射到黑色。

初始代码没有任何变量,画面什么都不输出。关键是先用 floor 建立网格坐标,再用 mod 生成奇偶判断,最后 mix 决定颜色。

试着把 mix(vec3(1.0), vec3(0.0), pattern) 改成 mix(vec3(0.2, 0.4, 0.8), vec3(0.9, 0.3, 0.1), pattern),用蓝色和橙色替代黑白。

GLSL 代码编辑器

正确代码预览

当前代码预览