资讯动态

The Book of Shaders 术语精解:matrixCompMult() 逐分量矩阵乘法

发布时间:2026/10/16 1:52:45 来源:尧图企业网站定制
【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载matrixCompMult()是 GLSL 内置的矩阵函数对两个同尺寸矩阵执行逐分量component-wise乘法结果矩阵的每个元素result[i][j]等于x[i][j]与y[i][j]的乘积。它与运算符*所代表的线性代数矩阵乘法截然不同在 The Book of Shaders本书的第 08 章矩阵及图像混合实战中均有典型应用。读完本文你将掌握matrixCompMult()的声明、语义、与mat2/mat3/mat4的配合方式以及它与普通矩阵乘法的本质区别并能在着色器代码中正确选用。函数声明与参数matrixCompMult()在 GLSL 中有三种重载形式分别对应 2×2、3×3、4×4 的方阵mat2 matrixCompMult(mat2 x, mat2 y) mat3 matrixCompMult(mat3 x, mat3 y) mat4 matrixCompMult(mat4 x, mat4 y)两个参数的含义如下x第一个矩阵乘数matrix multiplicandy第二个矩阵乘数。调用时两个矩阵的维度必须一致同为mat2、mat3或mat4返回的矩阵维度与输入一致。核心语义逐分量乘法matrixCompMult()对两个矩阵的对应元素逐一相乘结果矩阵中的每个分量按如下规则计算result[i][j] x[i][j] * y[i][j];也就是说它不涉及行与列的交叉求和不产生线性代数意义上的矩阵乘积。以 2×2 矩阵为例mat2 a mat2(1.0, 2.0, // 第 1 列 3.0, 4.0); // 第 2 列 mat2 b mat2(0.5, 0.25, 0.1, 0.2); mat2 r matrixCompMult(a, b); // r[0][0] a[0][0]*b[0][0] 0.5 // r[0][1] a[0][1]*b[0][1] 0.5 // r[1][0] a[1][0]*b[1][0] 0.3 // r[1][1] a[1][1]*b[1][1] 0.8这与本书矩阵术语页中描述的矩阵按列初始化、按列访问的方式一致mat2/mat3/mat4本质上是浮点数的二维数组可通过aMat2[1][1] 1.0;或aMat2[0] vec2(1.0);逐分量读写因此逐分量乘法天然可行。与*运算符的关键区别这是最容易混淆的一点。在 GLSL 中矩阵的*运算符执行的是真正的线性代数矩阵乘法行与列的点积求和而matrixCompMult()是元素对元素的乘法。以 2×2 为例x * y中result[i][j]的计算方式为result[i][j] x[i][0]*y[0][j] x[i][1]*y[1][j];而matrixCompMult(x, y)中result[i][j] x[i][j] * y[i][j];两者仅在 1×1标量退化情形下结果相同。因此要做坐标变换的组合旋转、缩放、平移、投影必须使用*运算符要做逐通道/逐元素调制如亮度缩放、色彩混合、噪声掩码应使用matrixCompMult()。本书第 08 章中构建的各类变换矩阵正是通过*与向量相乘的例如旋转矩阵mat2 rotate2d(float _angle){ return mat2(cos(_angle),-sin(_angle), sin(_angle),cos(_angle)); }然后在main中st rotate2d( sin(u_time)*PI ) * st;见 cross-rotate.frag。这里的*是空间变换语义而matrixCompMult()则是另一种逐通道调制工具两者用途互补。实战应用一图像逐分量混合matrixCompMult()的逐分量语义最典型的应用场景是图像处理。本书第 16 章图像操作的 operations.frag 演示了多种逐像素颜色运算其中Multiply模式就是把两幅纹理的 RGB 分量逐一相乘vec3 colorA texture2D(u_tex0, st).rgb; vec3 colorB texture2D(u_tex1, st).rgb; color colorA * colorB; // Mult逐分量乘法如果希望把 RGB 作为向量嵌入矩阵做更复杂的逐分量调制matrixCompMult()就派上用场了——例如对一张 3×3 的颜色矩阵做通道级增益、或用噪声矩阵乘以颜色矩阵做逐通道扰动都可以写成matrixCompMult(colorMatrix, maskMatrix)的形式比手写三行vec3分量乘法更紧凑且语义清晰。实战应用二YUV 色彩空间变换中的对照在第 08 章的 YUV 示例 yuv.frag 中颜色被当作向量与 3×3 色彩矩阵相乘实现 RGB ↔ YUV 的线性变换mat3 yuv2rgb mat3(1.0, 0.0, 1.13983, 1.0, -0.39465, -0.58060, 1.0, 2.03211, 0.0); color yuv2rgb * vec3(0.5, st.x, st.y);这里必须使用*线性代数矩阵乘法因为 YUV 转换是各通道的加权混合。若误用matrixCompMult()则完全得不到正确的色彩转换结果——这正说明了两种乘法语义差异的实际后果。在需要逐通道独立缩放而非通道间混合的场景才应选择matrixCompMult()。使用注意事项两个矩阵维度必须一致mat2只能与mat2组合混用维度会编译失败。不产生线性代数乘积matrixCompMult()的结果不能用于组合空间变换平移、旋转、缩放那些必须用*。逐分量访问习惯result[i][j]中i为列索引、j为行索引这与 GLSL 矩阵按列主序column-major存储的习惯一致参考 mat2、mat3、mat4 的术语页。适用场景逐通道颜色调制、掩码乘法、亮度/增益调整、把多个同尺寸矩阵按元素融合等若配合第 08 章中构建的 scale4D / translate4D / rotate*3D 这类变换矩阵注意分清哪些用*、哪些用matrixCompMult()。参考链接本词条原文glossary/matrixCompMult/README.md相关矩阵类型mat2 · mat3 · mat4矩阵应用章节第 08 章矩阵变换矩阵完整示例matrices.frag逐分量乘法实战operations.frag · mult.frag色彩空间矩阵对照*用法yuv.frag赞分享【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载相关推荐Anime4K GLSL 着色器 Linux 安装与 mpv 实时放大实战指南v4.xAnime4K GLSL 着色器 Linux 安装与 mpv 实时放大实战指南v4.x Anime4K 是一套开源的实时高质量动漫视频放大算法集合通过 mThe Book of Shaders 术语精解GLSL ivec4 四维整型向量The Book of Shaders 术语精解GLSL ivec4 四维整型向量 ivec4 是 GLSLOpenGL Shading LanguageNotepad-- 免费跨平台文本编辑器实战指南批量替换、乱码与日志跟随一次学会Notepad 免费跨平台文本编辑器实战指南批量替换、乱码与日志跟随一次学会 Notepad 是一款免费开源的文本编辑器Windows、Linux、macO上一篇whisper-web安全路线图未来安全功能的开发计划下一篇Stockfish开局库与中局策略如何配置以获得最佳竞技表现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑