The Book of Shaders 词条精讲:GLSL `max()` 函数的声明、语义与 shader 实战应用
【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载本文是《The Book of Shaders》开源仓库 glossary 术语表 中max词条乌克兰语版 glossary/max/README-ua.md的深度展开。它系统讲解 GLSL 内置函数max()的全部重载声明、逐分量比较语义与标量/向量混合用法并结合仓库内 05/README.md、07/rect-df.frag、13/ridge.frag、16/blend.frag 等真实 shader 源码展示如何用它实现值域裁剪、距离场矩形、脊状噪声和图像混合。读完本文你将掌握max()的精确行为、常见误用陷阱以及一套可复用的 shader 编码模式。一、函数定位GLSL 内置的逐分量取大函数max()是 GLSL 标准库中的基础数学函数与min()、abs()、clamp()、mix()同属一组在 glossary 术语表 中作为独立词条收录glossary/max/README.md。它的作用一句话即可概括比较两个值并返回其中较大者——若y大于x则返回y否则返回x。在《The Book of Shaders》的教学体系中max()属于第 05 章「形状函数Shaping Functions」所介绍的一组造型工具用于在 0.0 到 1.0 的一维空间内裁剪、抬升或约束数值流动是学习 shader 编程早期就必须掌握的五个核心函数之一。二、完整声明七种重载形式max()在 GLSL 中提供了 7 种重载既支持浮点标量也支持各维向量并且允许向量与标量混合使用float max(float x, float y) vec2 max(vec2 x, vec2 y) vec3 max(vec3 x, vec3 y) vec4 max(vec4 x, vec4 y) vec2 max(vec2 x, float y) vec3 max(vec3 x, float y) vec4 max(vec4 x, float y)参数说明参数类型含义xfloat / vec2 / vec3 / vec4参与比较的第一个值yfloat / vec2 / vec3 / vec4参与比较的第二个值标量时对向量逐分量生效重载细节与规则标量版max(float, float)直接比较两个数返回较大者。向量版max(vecN, vecN)逐分量component-wise比较——即result.x max(x.x, y.x)、result.y max(x.y, y.y)依此类推。这一点与min()、abs()等 GLSL 基础函数完全一致。混合版max(vecN, float)标量y会被隐式广播broadcast到每个分量等价于max(vecN(x), vecN(y, y, y, ...))。这是实际 shader 中最高频的用法例如把向量所有分量统一钳制到一个标量阈值。精度说明GLSL ES 中函数本身不改变操作数精度涉及highp/mediump/lowp的精度修饰作用于变量声明而不是函数调用本身。本仓库所有.frag示例均以#ifdef GL_ES / precision mediump float;作为片元着色器精度前缀如 07/rect.frag 所示。性能说明max()属于 GLSL 内置函数在大多数 GPU 上有对应的硬件指令如fmax/vmax只要使用得当就是零成本的标量运算第 05 章原文也强调这类内建函数在硬件层面被加速正确且克制地使用会让代码更快。三、核心语义与交互式可视化max(x, y)的返回值规则若y x则返回y否则返回x。注意边界情况当x y时返回x两者相等返回任意一个在数值上等价。原词条内置了一个交互式绘图演示div classsimpleFunction datay max(x,0.5);/div这个simpleFunction块由仓库前端脚本 src/main.js 解析页面加载时脚本会遍历所有带data属性的.simpleFunction元素把公式字符串交给GlslEditor实例渲染成可实时编辑的函数曲线图横轴 x 归一化到 0~1纵轴输出 y。读者在浏览器中把公式改成y max(x,0.2)、y max(x,0.8)或y max(x, 1.0 - x)即可直观看到输出曲线的形态变化y max(x, 0.5)时曲线在x 0.5区间被截平在 0.5x 0.5区间则跟随y x直线整体呈阶梯状折线把阈值换到 0.2 或 0.8截平的高度随之升降——这正是用max()给一维值域设置下限的直观演示。四、源码实证max()在仓库中的真实应用场景1. 形状函数练习把 x 的下限钳到 0.0在 05/README.md 的额外实用函数练习中作者给出了一组待逐行取消注释的实验公式其中明确包含//y max(0.0,x); // return the greater of x and 0.0这是max()最典型的用法之一只保留正半轴。max(0.0, x)与min(0.0, x)配合可以分别提取信号的正部与负部再结合abs()、sign()、fract()、floor()、ceil()、clamp()等函数就能构建出一整套控制 0.0~1.0 值域流动的shader 空手道招式。2. 距离场矩形max(abs(st) - 0.3, 0.0)在 07/rect-df.frag绘制形状——距离场一节的示例中矩形距离场的三种写法并排注释展示d length( abs(st)-.3 ); // d length( min(abs(st)-.3,0.) ); // d length( max(abs(st)-.3,0.) );其中max(abs(st) - 0.3, 0.0)将中心空间已重映射到 -1.0~1.0见第 16 行st st*2.-1.中超出矩形边界的部分截断到 0从而构造出带符号距离场的外部分量。这是max()在几何 SDF 中不可替代的用途min()处理内侧、max()处理外侧二者共同构成矩形/盒体的距离度量。3. 脊状分形噪声Ridged Multifractal在 13/ridge.frag第 13 章分形布朗运动与脊状噪声示例中Simplex 噪声权重计算使用了向量版max()vec3 m max(0.5 - vec3( dot(x0,x0), dot(x1,x1), dot(x2,x2) ), 0.0);这里max(vec3, 0.0)的标量广播形式把三个角点距离贡献同时钳制到非负区间随后m m*m; m m*m;四次幂平滑权重。若去掉max(..., 0.0)负值会导致噪声出现异常暗斑——这是理解脊状噪声为何需要 max 钳制的最佳案例。同章 13/turbulence.frag 使用完全相同的模式。4. 图像混合运算Blend 宏族在第 16 章混合模式示例 16/blend.frag 中max()被直接用于定义多种经典 Photoshop 混合模式#define BlendAddf(base, blend) min(base blend, 1.0) #define BlendSubstractf(base, blend) max(base blend - 1.0, 0.0) #define BlendLightenf(base, blend) max(blend, base) #define BlendDarkenf(base, blend) min(blend, base)BlendLightenf变亮/浅色直接用max(base, blend)——逐通道取亮BlendSubstractf线性减淡的逆运算用max(..., 0.0)保证结果不出现负值溢出第 50 行的BlendPhoenix则把min(base, blend) - max(base, blend) vec3(1.0)组合同时用到了取小与取大。可见max()是图像合成、HDR 钳制、高光保留等色彩运算的基石。5. Worley/Cellular 噪声排序保留 F2 候选在 12/2d-cnoise-2x2.frag 中为了同时求出最近特征点距离 F1 与次近距离 F2代码用max/min组合做排序与候选保留d.xy (d.x d.y) ? d.xy : d.yx; // Swap if smaller d.xz (d.x d.z) ? d.xz : d.zx; d.xw (d.x d.w) ? d.xw : d.wx; d.y min(d.y, d.z); d.y min(d.y, d.w);在 12/3d-cnoise.frag 中则大量出现d12 max(d11, d12)这类写法用于把次小值候选逐级过滤出来。这也说明max()在数值算法层面常与min()结对充当无分支的排序/筛选原语。五、实战配方max()的三种经典编码模式结合以上源码可以提炼出三个高复用度的 shader 模式模式一下限钳制floor clampfloat v max(value, 0.0); // 截断负值 vec3 v max(color, vec3(0.0)); // 逐通道截断应用避免颜色负值、噪声权重、混合差值出现非法下溢。对应 05/README.md 与 13/ridge.frag。模式二取亮混合lightenvec3 result max(colorA, colorB); // 逐通道保留较亮者应用图像变亮混合、高光叠加、贴图细节合并。对应 16/blend.frag。模式三SDF 外部分量float d length(max(abs(st) - size, 0.0));应用矩形、圆角盒、胶囊等几何体距离场。对应 07/rect-df.frag。六、与相关函数的关系及延伸阅读max()通常与以下术语表词条搭配理解min——返回较小者是max()的镜像二者常成对出现如 SDF、混合、噪声排序。abs——取绝对值max(0.0, x)与abs(x)组合可实现正半轴提取。clamp——clamp(x, lo, hi)等价于min(max(x, lo), hi)本质上由max()与min()复合而成用于把值同时约束到上下界。第 05 章形状函数——max()、min()、abs()、clamp()、fract()、floor()、ceil()、sign()的完整练习章节其中 05/README.md 提供了可逐行取消注释的交互式实验台。实际编码时如果你发现自己需要限制在某个下限以上就用max()需要限制在某个上限以下就用min()需要上下都限制直接写clamp()即可不必手工拼接。七、小结max(x, y)是 GLSL 中最简单却最高频的内置函数之一七种重载覆盖标量与向量、支持标量广播、逐分量语义清晰、硬件级零成本。它在《The Book of Shaders》仓库中的真实用途横跨形状裁剪05、距离场几何07/rect-df.frag、程序化噪声13/ridge.frag与图像混合16/blend.frag。建议读者回到 glossary/max/README-ua.md 的交互式绘图区依次尝试y max(x, 0.2)、y max(x, 0.8)、y max(x, sin(x))把函数曲线形态刻进直觉后续写 shader 时便能随手调用。赞分享【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载相关推荐GhostTrackIP 归属地查询与手机号追踪——快速定位网络线索的完整上手指南GhostTrackIP 归属地查询与手机号追踪——快速定位网络线索的完整上手指南 拿到一条访问日志里的陌生 IP想立刻确认它落在哪个城市、哪家运营商GhDeep Lake 存储与凭证配置指南从本地到 AWS/Azure/GCS 的多云数据访问实战Deep Lake 存储与凭证配置指南从本地到 AWS/Azure/GCS 的多云数据访问实战 导读 本文以 Deep Lake 4.0 的「存储与凭证StThe Book of Shaders 术语精讲GLSL bool 布尔类型声明、转换与实战用法The Book of Shaders 术语精讲GLSL bool 布尔类型声明、转换与实战用法 导读 本文围绕 The Book of Shaders ht上一篇终极泰坦之旅装备管理指南告别背包焦虑打造无限仓库下一篇GBFR Logs5大功能让你的碧蓝幻想Relink伤害分析更精准创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

用Python实现连连看自动求解:从路径搜索到图像识别的完整项目实践

用Python实现连连看自动求解:从路径搜索到图像识别的完整项目实践

/* 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 2:09:48 阅读更多 →
一次搞定 PDF 中文方块、缺字和乱码:PDF 字体嵌入完整教程

一次搞定 PDF 中文方块、缺字和乱码:PDF 字体嵌入完整教程

一次搞定 PDF 中文方块、缺字和乱码:PDF 字体嵌入完整教程 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址: https:…

2026/10/16 2:08:48 阅读更多 →
仓颉 ArkUI ListItem 组件完全指南:从基础创建到侧滑交互实战

仓颉 ArkUI ListItem 组件完全指南:从基础创建到侧滑交互实战

文档知识库教程OpenHarmony 【免费下载链接】CangjieCorpus 本仓库为仓颉编程语言语料库,聚焦 仓颉编程语言 核心知识体系,整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源,经结构化处理与专业标注,构建为支持 R…

2026/10/16 2:08:48 阅读更多 →

最新新闻

Agent落地三要素:记忆、目标与执行力的工程闭环

Agent落地三要素:记忆、目标与执行力的工程闭环

连着做了几个Agent项目之后,我越来越确定一件事:决定Agent上限的是模型本身,但决定它下限的,是记忆、目标与执行力这三块骨架。之前在做一个内部知识库问答项目时,最开始的版本就是把大模型接上对话接口,结…

2026/10/16 2:50:57 阅读更多 →
AlphaFin的Stock-Chain如何实现30.8%年化收益?多空回测与FinGPT对比深度拆解

AlphaFin的Stock-Chain如何实现30.8%年化收益?多空回测与FinGPT对比深度拆解

【免费下载链接】AlphaFin 项目地址: https://gitcode.com/gh_mirrors/alp/AlphaFin 点击查看 免费下载 AlphaFin 是一个面向金融分析的开源基准项目,其核心 Stock-Chain 框架通过检索增强(RAG) 微调大模型的方式完成股票趋势预测…

2026/10/16 2:50:57 阅读更多 →
3 步装回 Win10 经典任务栏:ExplorerPatcher 免费上手笔记

3 步装回 Win10 经典任务栏:ExplorerPatcher 免费上手笔记

3 步装回 Win10 经典任务栏:ExplorerPatcher 免费上手笔记 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher Windows 11 升级后&…

2026/10/16 2:50:57 阅读更多 →
AI笔记工具实战:创始人如何用语音速记和自动整理打造高效工作流

AI笔记工具实战:创始人如何用语音速记和自动整理打造高效工作流

我见过太多创始人的手机备忘录:一百多段语音躺在输入框里,四十几张聊天截图堆在相册,还有一堆只有自己看得懂的缩写关键词。问他们上周和客户聊了什么,回答通常是——"我记了,但找不到了。"这句话才是创始人…

2026/10/16 2:50:57 阅读更多 →
ET6238驱动详解:I2C接口LED显示与按键扫描的C源码实现

ET6238驱动详解:I2C接口LED显示与按键扫描的C源码实现

简介:ET6238驱动是一份基于I2C总线协议的LED显示控制源码,采用C语言编写,目标芯片为ET6238,适用于驱动十六行八列的LED矩阵。资源面向嵌入式开发者、单片机学习者及需要实现信息显示功能的相关从业者,可帮助快速构建数…

2026/10/16 2:50:57 阅读更多 →
建筑改造项目的表计难题:拆不了换不动,水电气数据怎么远程拿?

建筑改造项目的表计难题:拆不了换不动,水电气数据怎么远程拿?

建筑改造项目做到水电配套这一步,表计怎么处理,常常是第一个卡住的地方。新建工程的表计配套相对简单。但改造项目和存量建筑不一样,每栋楼的情况都不同。有的管网锈了二十年不敢碰,有的管井窄到人侧身才能进去,有的本…

2026/10/16 2:49:57 阅读更多 →

日新闻

个人 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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →