GLSL mat2 详解:2×2 浮点矩阵的声明、初始化与 The Book of Shaders 实战
【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载mat2是 GLSLOpenGL Shading Language内置的 2 行 2 列浮点矩阵类型是片段着色器中实现坐标旋转、缩放等空间变换的基础工具。本文以 The Book of Shaders 项目 glossary 词条 为核心系统讲解mat2的声明方式、初始化规则、元素与列的访问语法并结合仓库中 第 08 章 及其 .frag 源码给出可直接运行的旋转、缩放实战代码。读完本文你将掌握mat2的完整语法并能在自己的着色器中构造旋转矩阵与缩放矩阵。mat2是什么mat2表示一个由浮点数构成的 2×2 矩阵即 2 行 2 列、共 4 个float元素。它是 GLSL 矩阵家族中最小的成员同族类型还包括mat33×3与mat44×4。在 The Book of Shaders 的 glossary 中mat2被描述为 2x2 floating point matrix。与普通变量不同矩阵可以被当作作用于向量的一组规则将向量与矩阵相乘就能以确定的方式平移、旋转或缩放该向量。这也是 第 08 章 2D Matrices 的主题——用mat2变换坐标空间从而移动、旋转画布上的图形。声明与初始化四种写法mat2可以采用以下方式声明并初始化以下代码完整来自 glossary/mat2 词条mat2 aMat2 mat2(1.0, 0.0, // 第 1 列 0.0, 1.0); // 第 2 列 mat2 bMat2 mat2(1.0); mat2 cMat2 mat2(aVec2, bVec2); mat2 dMat2 mat2(aVec3, aFloat);关键点在于GLSL 矩阵采用列主序column-major构造构造函数中的参数按第 1 列 → 第 2 列的顺序依次填充注释中标明的1. column / 2. column正是这一约定的体现。具体可分为三种初始化方式逐分量指定mat2(1.0, 0.0, 0.0, 1.0)依次给出 4 个元素前两个属于第 1 列后两个属于第 2 列上面aMat2得到的就是单位矩阵。单个标量mat2(1.0)只给一个值该值会被同时赋给主对角线上的元素[0][0]与[1][1]其余元素为 0因此bMat2同样等价于单位矩阵。向量与标量组合mat2(aVec2, bVec2)表示把两个vec2分别作为第 1 列和第 2 列mat2(aVec3, aFloat)则混合使用向量与标量——GLSL 允许这种写法多余的向量分量会被丢弃不足的部分由后续标量补充。仓库中 mat3 词条 的示例mat3(aVec4, aVec3, bVec4, aFloat)印证了这种混合初始化模式同样适用于更大尺寸的矩阵。元素与列的访问语法初始化之后既可以按行、列访问单个元素也可以按列整体读取或写入一个vec2代码同样来自 glossary/mat2 词条mat2 aMat2; aMat2[1][1] 1.0; // 写入第 2 行第 2 列 float aFloat aMat2[1][1]; // 读取单个元素 aMat2[0] vec2(1.0); // 整列赋值把第 1 列整体设为 vec2(1.0) vec2 aVec2 aMat2[0]; // 按列读取两条规则需要牢记单个元素使用矩阵[列][行]的下标语法索引从 0 开始aMat2[1][1]定位到右下角元素。整列访问aMat2[0]返回一个vec2对应第 1 列的两个元素由于列主序布局第 0 列恰好就是内存中的前两个浮点数读取效率很高。相关类型与函数mat2经常与同族类型及矩阵专用函数配合使用mat33×3 浮点矩阵用于二维坐标的 3×3 齐次变换或颜色空间转换。mat44×4 浮点矩阵支持三维空间中的平移、旋转、缩放。matrixCompMult()对两个矩阵做逐分量相乘result[i][j] x[i][j] * y[i][j]它与 GLSL 中*运算符的矩阵乘法行列点积语义不同切勿混淆。仓库实战用 mat2 构造旋转与缩放矩阵仅了解语法还不够第 08 章 的源码演示了mat2最典型的用途——构造 2D 旋转矩阵。在 08/matrices.frag 中可以看到标准写法mat2 rotate2D(float angle){ return mat2(cos(angle),-sin(angle), sin(angle),cos(angle)); }注意构造参数的排列cos(angle), -sin(angle)构成第 1 列sin(angle), cos(angle)构成第 2 列——这正是二维旋转矩阵[[cosθ, -sinθ], [sinθ, cosθ]]的列主序填充结果。由于我们的图形通常绘制在画布中心vec2(0.5)附近而旋转矩阵是绕原点vec2(0.0)生效的因此需要遵循平移 → 旋转 → 平移回去三步流程。08/cross-rotate.frag 给出了完整实现mat2 rotate2d(float _angle){ return mat2(cos(_angle),-sin(_angle), sin(_angle),cos(_angle)); } void main(){ vec2 st gl_FragCoord.xy/u_resolution.xy; vec3 color vec3(0.0); st - vec2(0.5); // 1. 把空间平移到原点 st rotate2d( sin(u_time)*PI ) * st; // 2. 用 mat2 旋转坐标空间 st vec2(0.5); // 3. 平移回原位置 color vec3(cross(st,0.4)); gl_FragColor vec4(color,1.0); }图中展示的正是先平移到原点、旋转、再移回这一流程直接用rotate2d的结果去乘st向量st rotate2d(...) * stmat2就完成了对坐标空间的整体旋转而u_time驱动的sin(u_time)*PI让角度随时间变化产生往复摆动的动画效果。同理可构造缩放矩阵。在 08/cross-scale.frag 中mat2 scale(vec2 _scale){ return mat2(_scale.x,0.0, 0.0,_scale.y); }该矩阵把_scale.x、_scale.y分别放在主对角线[0][0]与[1][1]上对角元素控制 x、y 两个方向的缩放比例调用时同样遵循平移—缩放—平移的次序例如st scale(vec2(sin(u_time)1.0)) * st。从源码结构看仓库中大量示例将旋转矩阵封装为以原点为中心旋转一个vec2的辅助函数例如 09/checks.frag 与 09/rotatedtiles.frag 中的rotate2D它们在内部完成减 0.5 → 乘以矩阵 → 加 0.5的完整流程并在平铺tile空间中旋转每个单元格vec2 rotate2D (vec2 _st, float _angle) { _st - 0.5; _st mat2(cos(_angle),-sin(_angle), sin(_angle),cos(_angle)) * _st; _st 0.5; return _st; }更多应用场景mat2的作用远不止图形旋转仓库中的其他示例展示了它的多样化用途减少噪声轴向偏差13/clouds.frag 在分形布朗运动fBm的迭代中构造固定角度的旋转矩阵mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.50))每轮迭代用_st rot * _st * 2.0 shift旋转输入坐标以削弱噪声采样在 x/y 轴上的方向性偏差。CMYK 半调网点00/cmyk-halftone.frag 中的rotm()函数返回一个mat2旋转矩阵为青、品红、黄、黑四个颜色通道分别叠加不同的旋转角15°、75°、0°、45°实现经典印刷中的半调网角halftone screen angle效果mat2 rotm (in float r) { float cr cos(r); float sr sin(r); return mat2(cr,-sr, sr,cr); }颜色空间变换虽然 08/yuv.frag 使用的是mat3但它展示了矩阵在 GLSL 中的另一类应用——把颜色当作向量通过矩阵乘法在 RGB 与 YUV 颜色空间之间转换这也是matrixCompMult()与矩阵乘法容易混淆时最值得对比的示例。小结mat2以 4 个浮点数承载二维线性变换按列主序构造、支持标量/向量混合初始化、可按[列][行]或整列访问。在 The Book of Shaders 中它是平移、旋转、缩放三大空间操作的核心载体其旋转矩阵mat2(cos(a), -sin(a), sin(a), cos(a))在 第 08 章 及 第 09 章平铺模式 等后续章节中被反复使用。想进一步了解更大尺寸矩阵与矩阵函数可继续阅读 mat3、mat4 与 matrixCompMult() 词条。赞分享【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载相关推荐doocs/leetcode 面试题 02.08 环路检测快慢指针求链表环入口的数学证明与多语言实现doocs/leetcode 面试题 02.08 环路检测快慢指针求链表环入口的数学证明与多语言实现 本篇技术指南以 doocs/leetcode 仓库中《程The Book of Shaders 入门GLSL 布尔向量 bvec2 的声明、初始化与实战解析The Book of Shaders 入门GLSL 布尔向量 bvec2 的声明、初始化与实战解析 本指南基于 The Book of Shaders 仓库The Book of Shaders 中的 GLSL tan() 函数详解声明、行为与着色器实战The Book of Shaders 中的 GLSL tan 函数详解声明、行为与着色器实战 tan 是 GLSL 内置的三角函数之一用于返回指定角度弧上一篇UE Viewer 使用指南如何把虚幻引擎游戏里的模型和贴图完整导出下一篇Prisma 1.8 升级指南Management API 迁移、管理数据库 Schema 重命名与新增 migrations 配置创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

LAMMPS fix mol/swap 命令详解:分子内原子类型 Monte Carlo 互换的实现原理与实战

LAMMPS fix mol/swap 命令详解:分子内原子类型 Monte Carlo 互换的实现原理与实战

科研科学计算高性能计算 【免费下载链接】lammps Public development project of the LAMMPS MD software package 项目地址: https://gitcode.com/gh_mirrors/la/lammps 点击查看 免费下载 fix mol/swap 是 LAMMPS MC 包中用于加速分子体系 Monte Carlo 平衡的 f…

2026/10/16 2:44:56 阅读更多 →
车辆类型检测实战:YOLO数据集全流程构建与避坑指南

车辆类型检测实战:YOLO数据集全流程构建与避坑指南

做车辆类型检测这个题目,动手之后你会发现,YOLO模型本身跑通根本不难,难的是手里的数据集能不能撑起业务场景。同样一套YOLO权重,喂给它精准标注、场景均衡的车辆类型数据集,和喂给它一堆随手扒来的杂图,最…

2026/10/16 2:44:56 阅读更多 →
瑞吉外卖SpringBoot实战项目:可运行的MyBatis-Plus全栈工程

瑞吉外卖SpringBoot实战项目:可运行的MyBatis-Plus全栈工程

简介:本资源是基于SpringBoot与Mybatis-Plus开发的完整外卖平台项目源码及配套数据库,面向Java后端初学者与中级开发者,聚焦Web应用全栈实践与高并发场景下的技术整合。项目已实现用户注册登录(优化为邮箱验证)、商家管…

2026/10/16 2:44:56 阅读更多 →

最新新闻

面试复盘总漏关键信息?2026年7款面试复盘工具实测横评与选型指南

面试复盘总漏关键信息?2026年7款面试复盘工具实测横评与选型指南

面试这件事,最怕的不是当场答不上来,而是聊完就忘。面试官回忆不起候选人提到的项目细节,求职者想不起面试官反复追问的那个点,HR 手里只剩下几行潦草笔记。于是"复盘"两个字,常常变成凭印象打分。印象一旦失…

2026/10/16 3:35:06 阅读更多 →
IIEM实践:MATLAB自适应二重积分与奇异主部抽取解决积分方程近奇异问题

IIEM实践:MATLAB自适应二重积分与奇异主部抽取解决积分方程近奇异问题

简介:面向电磁散射建模与遥感定量反演研究者,这份开源代码实现了Hsieh等人(1997)改进的积分方程模型(IEM),用于粗糙表面后向散射系数计算。原始MATLAB版本来自Ulaby与Long(2014&…

2026/10/16 3:35:05 阅读更多 →
Nacos 2.5.0 麒麟 ARM 与达梦数据库适配编译实战指南

Nacos 2.5.0 麒麟 ARM 与达梦数据库适配编译实战指南

简介:面向国产化替代场景,这是一份Nacos 2.5.0在Linux环境下适配达梦数据库与麒麟ARM系统的完整编译产物及配套脚本,主要面向需要将微服务基础设施落地到国产软硬件栈的研发、运维与架构人员,解决服务发现、配置管理组件在国产数据…

2026/10/16 3:35:05 阅读更多 →
PowerBI数据清洗实操:用PowerQuery告别脏数据,提升模型稳定性

PowerBI数据清洗实操:用PowerQuery告别脏数据,提升模型稳定性

在PowerBI项目里,PowerQuery的数据清洗操作是我最看重的一步,也是最容易被新人跳过去的一步。很多同学把原始数据拖进模型就开始建表关系、写度量值,结果报表做到一半被脏数据反复绊倒:日期明明是文本、金额带符号、同一家门店在数…

2026/10/16 3:35:05 阅读更多 →
SpringBoot集成Elasticsearch实战:从倒排索引到搜索高亮

SpringBoot集成Elasticsearch实战:从倒排索引到搜索高亮

1. 搜索引擎ES到底能解决什么问题先说个我自己的经历。早两年我参与过一个内容管理系统的改造,数据库里存了上百万条文章数据,业务方提的需求越来越离谱:标题要支持模糊搜索、正文要高亮命中词、还要按某个字段做聚合统计。刚开始用MySQL的LI…

2026/10/16 3:35:05 阅读更多 →
VSCode配置C++开发环境:MinGW-w64编译器与调试全攻略

VSCode配置C++开发环境:MinGW-w64编译器与调试全攻略

1. 项目背后的核心问题:VSCode的"C环境配置"才是真正的门槛先说一个很多新手搞错的地方:VSCode本身不是编译器。它只是一个编辑器,负责高亮代码、提示语法、帮助你编辑文件;而把Hello World变成能运行的程序&#xff0c…

2026/10/16 3:34:05 阅读更多 →

日新闻

个人 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 阅读更多 →