GLSL mod() 取模函数深度解析:The Book of Shaders 中实现周期性平铺、索引与动画的基石
【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载导读mod()是 GLSL 中最基础也最高频的数学函数之一它返回一个数对另一个数取模的余数。在 The Book of Shaders 项目中mod()不仅是第 05 章塑形函数Shaping Functions演示的核心工具更被广泛应用于空间平铺、单元格编号、位解码、噪声周期化与万花筒成像等数十个示例着色器中。读完本文你将彻底掌握mod()的数学定义、重载形式、边界行为并学会用它在片段着色器中构建重复图案、交错布局与周期性动画。本文以仓库 glossary/mod/README.md 的词条为骨架展开并结合仓库内大量.frag源码佐证其真实用法。一、函数声明与重载形式mod()属于 GLSL 内建数学函数glossary 词条给出了完整的声明形式float mod(float x, float y) vec2 mod(vec2 x, vec2 y) vec3 mod(vec3 x, vec3 y) vec4 mod(vec4 x, vec4 y) vec2 mod(vec2 x, float y) vec3 mod(vec3 x, float y) vec4 mod(vec4 x, float y)可见 GLSL 为重载了 7 种签名向量与向量逐分量取模或向量与标量混合标量会被隐式提升为向量并与每个分量运算。这在处理vec2坐标、vec3颜色、vec4位置数据时非常方便无需像在 C 语言中那样逐分量手写%循环。参数语义x被求模的值被除数即要对它取模的数y模数除数即用来取模的数。词条原文的描述为Compute value of one parameter modulo another对应中文即计算一个参数对另一个参数取模的值。二、数学定义为什么它是余数而非取余词条明确给出mod()的计算公式mod(x, y) x - y * floor(x / y)关键在于floor()向下取整而非trunc()向零取整。这带来两个重要的数学性质结果符号跟随除数y。当y为正数时结果永远落在[0, y)区间当y为负数时结果落在(y, 0]区间。这与 C 语言中%运算符向零取整、符号跟随被除数行为完全不同也与 GLSL 中基于trunc的%不同。结果恒等于除尽后剩下的那一截。例如mod(7.3, 2.0)计算为7.3 - 2.0 * floor(7.3 / 2.0) 7.3 - 2.0 * 3 1.3。这一数学定义让mod()成为把一维直线折叠成周期性区间的天然工具也是后续所有空间平铺技巧的原理基础。与相邻函数的关系mod()与仓库词条 floor、fract、ceil 紧密相关三者互相在 See Also 中引用函数定义结果区间x 0 时用途floor(x)不大于 x 的最大整数整数取格子编号fract(x)x - floor(x)即小数部分[0, 1)取格子内位置ceil(x)不小于 x 的最小整数整数向上取整mod(x, y)x - y * floor(x / y)[0, y)周期折叠、取余特别地当y 1.0时mod(x, 1.0)与fract(x)完全等价——因此词条同时链接了 fract。二者常被互换使用但mod(x, y)允许任意周期y通用性更强。三、第 05 章中的经典演示周期化塑形mod()在 The Book of Shaders 正文中的首次核心登场是第 05 章塑形函数。在 05/README.md 中作者提供了可交互的一维函数图y mod(x, 0.5); // return x modulo of 0.5在同一交互面板中mod与fract、ceil、floor、sign、abs、clamp、min、max一起被列为额外有用的函数作者将其比喻为栅栏帮助读者掌握一维空间中的往复运动。当y 0.5时函数曲线呈现锯齿状周期波形——这正是后续章节中无数平铺图案的最小单元。第 05 章还收录了 05/easing.fragRobert Penner 缓动函数的 GLSL 移植、05/impulse.frag、05/cubicpulse.frag 等塑形函数库它们与mod()一样属于把输入约束到特定形态的基础积木。四、仓库源码实战mod() 的六种典型用法在 The Book of Shaders 的示例着色器中mod()的身影遍布第 0915 章。以下用法均来自仓库真实源码可逐一打开对照学习。1. 行交错偏移砖墙平铺09/bricks.frag 用一行mod实现了砖墙的错缝平铺vec2 brickTile(vec2 _st, float _zoom){ _st * _zoom; // Here is where the offset is happening _st.x step(1., mod(_st.y,2.0)) * 0.5; return fract(_st); }mod(_st.y, 2.0)把纵向坐标折叠成周期为 2 的区间step(1., ...)判断当前行是奇数行还是偶数行奇数行把横向坐标平移0.5格从而形成砖块交错效果。这正是mod 周期折叠 step 条件分支的经典组合。2. 单元格编号索引Truchet 图案旋转09/truchet.frag 用mod为 2×2 网格的每个单元格分配唯一索引再按索引旋转图案float index 0.0; index step(1., mod(_st.x,2.0)); index step(1., mod(_st.y,2.0))*2.0;mod(_st.x, 2.0)与mod(_st.y, 2.0)分别折叠出 0/1 两个相位组合成 0、1、2、3 四个索引随后rotate2D()依据索引把单元格旋转 0°、90°、180°、-90°生成无限延伸的 Truchet 纹样。3. 位解码易经卦象与 Ikeda 数字第 09 章的 09/iching-01.frag 用mod实现二进制位提取把整数解码成六爻float remain floor(mod(N,64.)); for(int i 0; i 6; i){ b[i] step(1.0,mod(remain,2.)); remain ceil(remain/2.); }mod(remain, 2.0)每次取出当前最低位配合ceil(remain/2.0)右移一位循环 6 次即还原出卦象的 6 根爻线。同样的位解码套路出现在第 10 章 10/ikeda-digits.frag 中——它用mod(remain, 2.0)把 09 数字的 5×3 点阵位图逐位还原再用floor(mod(n,10.))从随机数中选出数字。4. 整数网格平铺与随机散点10/2d-random-dots.frag 与砖块同款的交错技巧被用于随机圆点阵st * 10.0; // Offset every other row st.x - step(1., mod(st.y,2.0)) * 0.5; vec2 ipos floor(st); // integer position vec2 fpos fract(st); // float position这里mod(st.y, 2.0)折叠出行相位floor取格子编号、fract取格内坐标——整数位置 小数位置的拆分正是格子空间的核心范式而mod负责其中的周期交错。5. 噪声与排列中的周期取模第 11 章的 Simplex 噪声 11/3d-snoise.frag 用自实现mod289()把坐标折叠回有限周期格子vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }这本质上就是x - y * floor(x/y)在y 289时的特例。第 12 章 Voronoi 示例 12/cell.frag 的permute()同样依赖mod((34.0 * x 1.0) * x, 289.0)完成伪随机排列并配合mod(floor(P), 289.0)周期化格子坐标。可见mod是程序化噪声类算法中保持计算有界、图案可周期重复的关键。6. 角度周期折叠圆周动画与万花筒mod同样适用于极坐标角度。第 11 章 11/circleWave-noise.frag 用角度取模制造周期波纹float m abs(mod(au_time*2.,3.14*2.)-3.14)/3.6;mod(a, 2π)把任意旋转后的角度折叠回[0, 2π)再减去 π 取绝对值得到以角度为周期、随时间流动的波瓣。第 15 章 15/texture-kaleidoscope.frag 用角度取模实现万花筒镜像float sides 10.; float ma mod(a, TWO_PI/sides); ma abs(ma - PI/sides); st r * vec2(cos(ma), sin(ma));mod(a, 2π/10)把圆周切成 10 个扇区再折叠到单个扇区内纹理即被对称地重复成 10 瓣花瓣——一个参数sides即可控制对称数量。五、使用注意与常见误区除数y不能为 0。GLSL 中mod(x, 0.0)的结果未定义实践中应保证y严格非零。与 C 语言%的区别。C 的%向零取整、结果符号随被除数GLSL 的mod向下取整、结果符号随除数。写跨语言移植代码时务必留意。与fract的等价关系。fract(x) mod(x, 1.0)当周期为 1 时可互换但mod能表达任意周期语义更明确。动画中的时间取模。常见写法mod(u_time, T)可把时间折叠进[0, T)实现循环动画mod(u_time, 2π)则用于角度相位。与floor/ceil配合mod负责折叠周期floor负责取格子编号二者几乎总是成对出现在空间平铺代码中参考 09/bricks.frag 与 10/2d-random-dots.frag。六、动手练习建议参考第 05 章 05/README.md 的练习思路可围绕mod设计以下实验在 05/README.md 的交互图中将y mod(x, 0.5)的模数改为0.25、1.0、2.0观察锯齿周期如何随y变化打开 09/bricks.frag把mod(_st.y, 2.0)中的2.0改为其他值观察砖缝错位节奏的变化打开 15/texture-kaleidoscope.frag调整sides从 3 到 12体会一个参数驱动对称性的威力将mod(u_time, 2π)接入 11/circleWave-noise.frag 的角度参数让波瓣沿圆周周期旋转。七、总结mod()在 The Book of Shaders 中扮演着周期折叠器的角色从第 05 章的一维锯齿波形到第 09 章的砖块错缝与 Truchet 索引再到第 11/12 章噪声算法中的mod289直至第 15 章的万花筒对称——它把无限空间折叠进有限周期把连续时间切成循环节拍。掌握x - y * floor(x/y)这一定义及其结果符号随除数的特性你就掌握了 GLSL 程序化生成中最重要的复用与重复技巧。相关词条floor、fract、ceil理论章节Chapter 05: Shaping Functions实战参考09/bricks.frag、09/truchet.frag、10/2d-random-dots.frag、10/ikeda-digits.frag、11/3d-snoise.frag、12/cell.frag、15/texture-kaleidoscope.frag赞分享【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载相关推荐GLSL fract() 函数深度解析The Book of Shaders 中的小数提取与图案平铺实战GLSL fract 函数深度解析The Book of Shaders 中的小数提取与图案平铺实战 本篇指南以《The Book of Shaders》开源The Book of Shaders 术语详解GLSL mod() 取模函数——从数学定义到平铺与对称实战The Book of Shaders 术语详解GLSL mod 取模函数——从数学定义到平铺与对称实战 导读 mod 是 GLSL 中最常用也最容易被低估的The Book of Shaders 中的 pow()GLSL 幂函数与一维造型函数的基石The Book of Shaders 中的 pow GLSL 幂函数与一维造型函数的基石 导读 pow x, y 是 GLSL 中用于计算以 x 为底、y上一篇终极指南使用JUCE框架构建智能音频安防监控系统下一篇从0到1开发网页控制器AXWebViewController框架设计思想解读创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

ExplorerPatcher 配置指南:三套套餐把 Windows 11 任务栏与开始菜单改回 Win10 经典样式

ExplorerPatcher 配置指南:三套套餐把 Windows 11 任务栏与开始菜单改回 Win10 经典样式

ExplorerPatcher 配置指南:三套套餐把 Windows 11 任务栏与开始菜单改回 Win10 经典样式 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher…

2026/10/16 5:52:44 阅读更多 →
qwerty-learner 自定义词库导入:从一份 JSON 文件到完整个人词库,10 分钟走通

qwerty-learner 自定义词库导入:从一份 JSON 文件到完整个人词库,10 分钟走通

qwerty-learner 自定义词库导入:从一份 JSON 文件到完整个人词库,10 分钟走通 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboar…

2026/10/16 5:52:44 阅读更多 →
AIRI Minecraft 集成:基于 Mineflayer 的 LLM 驱动 Bot 本地部署与配置全解

AIRI Minecraft 集成:基于 Mineflayer 的 LLM 驱动 Bot 本地部署与配置全解

人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手 【免费下载链接】airi 💖🧸 自托管、归你拥有的 Grok 风格 AI 伴侣与 waifu / 赛博生命灵魂容器,目标是接近 Neuro-sama 的高度;支持实时语音聊天、Minecraft 和 F…

2026/10/16 5:52:44 阅读更多 →

最新新闻

Lunar 6.7.11 修复说明:Sync Mode 在 MacBook Air 与 iMac 上改用 nits 同步

Lunar 6.7.11 修复说明:Sync Mode 在 MacBook Air 与 iMac 上改用 nits 同步

桌面应用 【免费下载链接】Lunar Intelligent adaptive brightness for your external monitors 项目地址: https://gitcode.com/gh_mirrors/lu/Lunar 点击查看 免费下载 Lunar 6.7.11 是一个针对 Sync Mode(同步模式) 的定向修复版本。此次…

2026/10/16 6:27:53 阅读更多 →
MooTool Next-Compose 增量演进:MCP stdio 工具链、F03 格式化引擎与更新下载流的工程化落地

MooTool Next-Compose 增量演进:MCP stdio 工具链、F03 格式化引擎与更新下载流的工程化落地

桌面应用开发工具 【免费下载链接】MooTool Handy tool set for developers 项目地址: https://gitcode.com/gh_mirrors/mo/MooTool 点击查看 免费下载 导读 本篇以仓库中的增量开发记录 next-compose/docs/diff/561-mcp-reformat-update-env-net-vault-css-slice…

2026/10/16 6:27:53 阅读更多 →
AtCoder Beginner Contest 478

AtCoder Beginner Contest 478

AtCoder Beginner Contest 478 A - Grapes 题意:有N个人,编号为1到N,现在要把M颗葡萄分给他们。每次按照1, 2, …, N的顺序,每人分一颗,分到第N个人以后再从第1个人开始,直到所有葡萄分完。最后输出每个人分…

2026/10/16 6:27:53 阅读更多 →
google-api-nodejs-client 的 ondemandscanning 模块演进全解读:从 CHANGELOG 版本脉络到容器镜像漏洞扫描实战

google-api-nodejs-client 的 ondemandscanning 模块演进全解读:从 CHANGELOG 版本脉络到容器镜像漏洞扫描实战

后端 【免费下载链接】google-api-nodejs-client Googles officially supported Node.js client library for accessing Google APIs. Support for authorization and authentication with OAuth 2.0, API Keys and JWT (Service Tokens) is included. 项目地址: h…

2026/10/16 6:27:53 阅读更多 →
用Python和SQLite自建个人财务数据中台:从记账到自由分析

用Python和SQLite自建个人财务数据中台:从记账到自由分析

1. 从"financial-services"到个人财务数据中台:我为什么自建了一套记账分析系统先说个背景。我一直在关注"financial-services"这个方向,但说实话,金融服务的概念太大了——从银行App到支付工具,从个人记账软…

2026/10/16 6:27:53 阅读更多 →
Zabbix 监控 TACACS 服务实战:App TACACS Service 模板(net.tcp.service 简单检查)全解析

Zabbix 监控 TACACS 服务实战:App TACACS Service 模板(net.tcp.service 简单检查)全解析

【免费下载链接】community-templates Zabbix Community Templates repository 项目地址: https://gitcode.com/gh_mirrors/co/community-templates 点击查看 免费下载 本文围绕 Zabbix Community Templates 仓库中的 App TACACS Service 模板展开,讲解…

2026/10/16 6:26:53 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →