The Book of Shaders 词条精讲:GLSL sign() 函数的语义、可视化与实战应用

发布时间:2026/10/16 2:29:47
The Book of Shaders 词条精讲:GLSL sign() 函数的语义、可视化与实战应用
【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载导读sign()是 GLSL 中一个极简却用途广泛的基础数学函数它不改变输入值的幅度只提取并返回数值的符号-1.0 / 0.0 / 1.0。本文以《The Book of Shaders》glossary/sign 词条 为主体结合本仓库中实际使用sign()的 moon.frag 源码和 05 章「造型函数」 的上下文系统讲解其声明形式、数学语义、交互式可视化方法以及在片段着色器中典型的应用模式帮助读者把这一「一维小函数」熟练嵌入到自己的着色器工具箱中。一、函数声明四种重载形式词条「Оголошення声明」一节给出了sign()的完整重载形式float sign(float x) vec2 sign(vec2 x) vec3 sign(vec3 x) vec4 sign(vec4 x)四个重载版本覆盖了 GLSL 中全部标量与向量数值类型逐分量component-wise运算对vec2/vec3/vec4输入返回值是一个同样维度的向量其中每个分量分别是输入对应分量的符号。这意味着sign()可以一次性对一组坐标、一组法线或一组颜色分量独立提取符号无需手动拆分量处理。参数说明唯一的参数x是要提取符号的值可以是标量float也可以是vec2/vec3/vec4向量原文x— значення, з якого слід витягти знак即「从中提取符号的值」。二、数学语义三值输出的判别规则词条「Опис描述」定义了sign()的精确语义若x 0.0返回-1.0若x 0.0返回0.0若x 0.0返回1.0。这一规则有两个值得注意的要点输出只有三个离散值sign()不像smoothstep()那样做连续插值它是一台纯粹的「符号判别机」输出永远是 -1.0、0.0、1.0 三者之一因此常被用来生成硬边界的二值/三值信号。零值有专门分支x 0.0会被单独归为0.0而不是任意归入正或负。在需要严格三态逻辑负、零、正的场景中这一点与step()只区分 0/1 两态形成互补。与其他基础函数的关系sign()与 abs() 关系密切abs(x)提取幅度而丢弃符号sign(x)恰好相反——提取符号而丢弃幅度。两者组合可以完全重建原值x sign(x) * abs(x)。事实上在仓库的 glossary/abs 词条 的「See Also」一节中sign()就被列为 abs 的关联函数。这种「幅度/符号分离」的能力正是sign()在着色器中被反复使用的原因。三、交互式可视化词条内嵌的 simpleFunction 绘图乌克兰语词条在描述之后嵌入了一段交互式绘图标记div classsimpleFunction datay sign(x);/div这是《The Book of Shaders》网站专门为数学函数词条设计的实时可视化组件读者可以直接把data属性里的函数改写成y sign(x);之外的任意表达式例如y sign(x) * abs(x);、y sign(sin(x * 6.28));GPU 会即时重编译并重新绘制函数曲线直观观察符号函数的三段跳变。从仓库源码看这套机制由 src/main.js 中的loadGlslElements()驱动它收集页面上所有.simpleFunction元素用data属性中的表达式填充preFunction/postFunction包裹的绘图 shader见 src/main.js生成一个 800×250 的实时绘图画布。preFunction中还预置了PI、rand()、noise()等工具方便读者在绘图框中实验更复杂的组合。借助这个交互工具读者可以清晰看到sign(x)的曲线形态在 x 轴负半区是一条贴在地面y -1.0的水平线在正半区跃升到 y 1.0 的水平线中间在 x 0 处穿过 y 0——一个典型的「阶跃」形状。四、在《The Book of Shaders》中的定位第 05 章造型函数工具箱sign()在全书结构中的「主场」是 第 05 章造型函数Shaping Functions。该章向读者展示了一组「一维函数工具箱」——mod()、fract()、ceil()、floor()、sign()、abs()、clamp()、min()、max()等它们共同构成了控制数值流动的基本元件//y mod(x,0.5); // 返回 x 对 0.5 取模的值 //y fract(x); // 仅仅返回数的小数部分 //y ceil(x); // 向正无穷取整 //y floor(x); // 向负无穷取整 //y sign(x); // 提取 x 的正负号 //y abs(x); // 返回 x 的绝对值 //y clamp(x,0.0,1.0); // 把 x 的值限制在 0.0 到 1.0 //y min(0.0,x); // 返回 x 和 0.0 中的较小值 //y max(0.0,x); // 返回 x 和 0.0 中的较大值第 05 章在讲三角函数练习时还给出过一个与sign()直接相关的技巧对sin(x)分别取ceil()和floor()可以把正弦曲线压成只有 1 和 -1 的「电子波」——这本质上就是在手工构造 sign 行为。理解sign()的离散输出特性有助于把握整组造型函数的「信号整形」思维把连续值切成离散段、把值域搬移到 0.0–1.0、再组合出复杂的形状。五、源码级实战sign() 在球面法线计算中的经典用法仓库中sign()的唯一真实使用案例出现在 src/moon/moon.frag月面着色器vec3 sphereNormals(in vec2 uv) { uv fract(uv)*2.0-1.0; vec3 ret; ret.xy sqrt(uv * uv) * sign(uv); ret.z sqrt(abs(1.0 - dot(ret.xy,ret.xy))); ret ret * 0.5 0.5; return mix(vec3(0.0), ret, smoothstep(1.0,0.98,dot(uv,uv)) ); }这段代码演示了sign()的一个经典用途恢复平方根运算丢失的符号。sqrt(uv * uv)等价于abs(uv)它会无条件地把 uv 变成非负值再乘上sign(uv)后结果就变回了uv本身对任何实数成立sqrt(uv*uv) * sign(uv) uv。这样ret.xy就精确等于原始 uv 坐标——一个取值在 -1.0 到 1.0 之间的带符号坐标随后被用来计算单位球面的法线 z 分量并参与光照计算见同文件 moon.frag 的太阳方向点积光照。这种「先取绝对值运算再用 sign() 恢复符号」的模式在几何着色、粒子对称、波形成形等场景中非常实用。读者可以借鉴这一模式凡是对负值敏感的运算如开方、对数、幂运算之后都可以用sign()把符号信息找回来。六、典型应用模式与注意事项应用模式一方向判定 / 二值化float direction sign(st.x - 0.5); // 屏幕左半 -1.0右半 1.0 vec3 color mix(colorA, colorB, step(0.0, direction)); // 按方向混合两种颜色应用模式二带符号的缩放// 把坐标对折到正区间后运算再用符号还原方向 vec2 p fract(st * 2.0) - 0.5; float wave sin(p.y * 20.0); float mirrored wave * sign(p.x); // 左右对称但方向相反注意事项零值的归属当输入恰好为 0.0 时返回 0.0 而非 ±1.0在需要严格区分正负而不想产生零的场景可考虑sign(x) 1.0 - step(0.0, x)之类的改写或直接使用step()。逐分量语义对向量输入sign()按分量独立求值适合一次性处理多个坐标分量但要注意结果向量各分量可能不同号。硬件友好与第 01 章提到的 GLSL 数学函数硬件加速特性一致sign()属于 GPU 原生支持的廉价运算可放心在高频片段着色器中使用。七、结语与延伸阅读sign()虽然只输出三个离散值却是着色器世界里不可或缺的「符号仲裁者」从词条中的三态数学定义到第 05 章造型函数工具箱中的定位再到moon.frag中恢复平方根符号的巧用它贯穿了《The Book of Shaders》从「理解函数」到「实战作图」的整个学习路径。建议读者使用词条内嵌的simpleFunction交互绘图y sign(x)亲手实验并依次阅读仓库中的相关资源glossary/sign 词条乌克兰语原版 与 英文版关联函数 glossary/abs 词条实战章节 第 05 章造型函数含linear.frag、step.frag、smoothstep.frag等可直接运行的可视化示例真实使用案例 src/moon/moon.frag交互绘图的底层实现 src/main.js。赞分享【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载相关推荐LX Music 桌面版免费的多音源聚合播放器LX Music 桌面版免费的多音源聚合播放器 同一首歌在不同平台下架进度不一样歌单又不想放到公网服务里。LX Music 桌面版把这些平台的在线音源聚合成BullMQ 任务去重Deduplication完整指南Simple、Throttle、Debounce 与 Job Scheduler 场景实战BullMQ 任务去重Deduplication完整指南Simple、Throttle、Debounce 与 Job Scheduler 场景实战 BulThe Book of Shaders 词条精解GLSL sign() 符号提取函数完全指南The Book of Shaders 词条精解GLSL sign 符号提取函数完全指南 sign 是 GLSL 内建数学函数中一个看似简单、实则应用极广的上一篇B站4K会员视频下载神器3步搞定大会员专属内容下一篇KMS智能激活终极指南三步永久激活Windows和Office的完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考