☰
Material Maker 正弦波(Sine Wave)图案节点:参数含义与着色器实现原理
2026/10/12 11:34:05 网站建设 项目流程
  • 桌面应用
  • 图形学
  • 3D渲染
  • 图像处理

【免费下载链接】material-maker

A procedural textures authoring and 3D model painting tool based on the Godot game engine

项目地址:https://gitcode.com/gh_mirrors/ma/material-maker
点击查看免费下载

本文面向 Material Maker 用户与 Godot 开发者,围绕 Pattern 节点族中的Sine Wave节点展开,完整讲解其输入输出约定、amplitude/frequency/phase三个参数的作用范围与默认值,并结合节点模板文件中的 GLSL 表达式剖析其灰度波形生成的底层原理,帮助你精确控制波形形态,并理解.mmg节点模板的编写规范。

节点概览:一个零输入的灰度波形生成器

Sine Wave 节点属于 Material Maker 的 Pattern(图案)节点族。根据 nodes_pattern.rst 中的定义,Pattern 节点是典型的生成器节点(generator nodes):它们不接受任何输入,直接生成一张或多张图像。Sine Wave 正是这一类节点的代表,其功能一句话即可概括——输出一张灰度正弦函数波形图。

在节点库中,它注册于Pattern/Sine Wave分组下,显示名为 "Sine Wave",类型为sine_wave,其注册条目位于 base.json:

{ "display_name": "Sine Wave", "icon": "pattern_sine_wave", "name": "sine_wave", "parameters": { "amplitude": 0.5, "frequency": 2.0, "phase": 0.0 }, "tree_item": "Pattern/Sine Wave", "type": "sine_wave" }

从节点库把 Sine Wave 拖入画布时,它会以amplitude = 0.5、frequency = 2.0、phase = 0.0作为初始参数值。

上图为节点在编辑器中的实际形态:标题栏显示节点名 "Sine Wave",主体面板中只有三个参数滑块(Amplitude、Frequency、Phase),没有输入端口,符合其"零输入生成器"的定位。

输入与输出约定

根据关联文档 node_pattern_sine_wave.rst 及节点模板定义:

  • 输入(Inputs):Sine Wave 节点不接受任何输入。它不依赖其他节点的数据,属于纯粹的图案源节点,可作为节点图中图案生成的起点。
  • 输出(Outputs):节点生成单个灰度输出纹理(grayscale output texture)。在 nodes_common.rst 中说明,灰度图像输出在节点图中以灰色端口表示,并且灰度、彩色与 RGBA 类型的输入/输出可以互相连接并自动完成转换——因此该节点的灰度输出可以直接接入其他节点的灰度、彩色甚至 RGBA 输入端口。

其输出效果如下图所示(node_sine_wave_samples.png):

可以看到输出是一幅横贯图像的水平波形条纹图:波线所在位置呈现高亮(接近白色),偏离波线越远灰度越暗,形成类似示波器波形的灰度带。

三个参数详解:振幅、频率与相位

Sine Wave 节点的全部可调参数只有三个,均由节点模板 sine_wave.mmg 中的shader_model.parameters数组声明。下表汇总了官方声明(包含 longdesc 原始说明)中的取值范围与默认值:

参数含义(来自官方 longdesc)最小值最大值默认值步进
amplitude(振幅)正弦波函数的振幅010.50.01
frequency(频率)正弦波函数的频率,即生成图像中显示的振荡次数01611
phase(相位)正弦波函数的相位偏移0100.01

结合源码定义逐项说明其实际效果:

amplitude(振幅)

在公式中,amplitude直接乘以正弦项(见下文公式),控制波峰与波谷偏离图像中心线的距离。振幅越大,波峰越高、波谷越低,图像中波形的摆动幅度越大;振幅为 0 时正弦项消失,输出退化为一条位于图像中线的恒定亮线。声明范围为0 ~ 1,步进0.01,默认0.5。

frequency(频率)

官方 longdesc 明确说明其语义是"生成图像中显示的振荡次数"(the number of oscillations shown in the generated image)。取值范围0 ~ 16、步进1、默认1。每增加 1,波形在图像宽度范围内多完成一个完整周期。这也是 Pattern 系列中通用的"重复次数"式频率语义。

phase(相位)

相位偏移,取值范围0 ~ 1、步进0.01、默认0。需要注意其取值单位:在着色器公式中相位会被乘以2π,因此phase 每增加 1 相当于在 x 方向平移一个完整周期(2π 弧度)。利用该参数可以让波形在水平方向上整体平移,或与其他节点/时间变量配合制作动画。

底层实现:模板文件中的 GLSL 输出表达式

Sine Wave 节点的图形化参数背后,实际是节点模板shader_model.outputs中一段完整的 GLSL 表达式。模板文件 sine_wave.mmg 中输出端口定义为:

{ "f": "1.0-abs(2.0*($uv.y-0.5)-$amplitude*sin(($frequency*$uv.x+$phase)*6.28318530718))", "longdesc": "Shows a grayscale image of a sine wave", "shortdesc": "Output", "type": "f" }

这段表达式是理解该节点行为的关键,逐项拆解如下:

  1. 坐标映射:2.0*($uv.y-0.5)将 UV 坐标的 y 分量从[0, 1]线性映射到[-1, 1],使图像中心线(y = 0.5)对应数值 0。
  2. 波形构造:$amplitude*sin((...)*6.28318530718)是标准的正弦振荡。其中常量6.28318530718即2π(一个完整周期),这与 Godot/GLSL 中TAU = 2.0*PI的惯用定义一致(可参见 buffer_compute.tres 中的const float TAU = 2.0*PI;)。频率乘在$uv.x上控制周期数,相位做整体平移。
  3. 灰度映射:对"映射后的 y 值"与"正弦值"之差取绝对值,再用 1 减去。其结果是:恰好落在波形线上的像素输出为 1(白色),偏离波形线越远输出越接近 0(黑色),从而把数学曲线渲染成肉眼可见的灰度波形带。

模板文件中还完整声明了三个参数的元数据(label、shortdesc、longdesc、min/max/step/default),并给出节点级别的描述:

  • 节点 longdesc:"Draws a grayscale sine wave pattern"
  • 节点 shortdesc:"Sine wave pattern"

从.mmg模板到实际渲染:参数如何被注入着色器

shader_model.outputs[].f中的$amplitude、$frequency、$phase是参数占位符。Material Maker 的引擎在渲染时会将其替换为实际数值(数值或 GLSL 表达式结果),再交给计算着色器执行,最终输出为灰度纹理。这一机制体现在引擎核心 gen_base.gd 中:

  • get_parameter()优先读取节点实例保存的参数值,否则回退到模板声明的default;
  • calculate_float_parameter()支持把参数值当作 GLSL 表达式求值(这正是 nodes_common.rst 中提到的"float 参数支持以$前缀引用其他参数/命名参数的表达式"功能),并支持$rnd()/$rndi()随机函数与$time动画变量。

渲染流程由render_output_to_texture()(gen_base.gd)驱动:生成着色器源码 → 交给MMComputeShader→ 渲染到指定尺寸的MMTexture。因此 Sine Wave 节点本质上是一条"零输入 → 单灰度输出"的计算着色器链路。

由于该节点属于零输入的生成器,接入方式非常自由:它的灰度输出可以直接驱动各类纹理节点的输入端口,例如与色带(Colorize)节点结合把波形映射为彩色条纹、与位移/法线相关节点结合生成起伏表面,或与数学运算节点组合调制出更复杂的图案。需要更多波形形态时,Pattern 节点族中的通用 Pattern 节点还提供了 Sine、Triangle、Square、Sawtooth 等多种波形以及 XY 组合函数(见 node_pattern_generic.rst),可与 Sine Wave 节点互为补充。

小结

  • Sine Wave 是 Material Maker 中最简单直接的波形图案生成器:无输入、单灰度输出,仅靠amplitude(振幅)、frequency(频率/振荡次数)、phase(相位/周期平移)三个参数即可精确控制波形。
  • 其输出由模板 sine_wave.mmg 中的 GLSL 表达式1.0-abs(2.0*($uv.y-0.5)-$amplitude*sin(($frequency*$uv.x+$phase)*6.28318530718))决定,灰度值表示"像素与波线的距离"。
  • 节点注册于 base.json 的Pattern/Sine Wave分组,参数表达式机制与渲染链路由 gen_base.gd 等引擎源码支撑,可作为自定义 Pattern 类节点的编写参考。
  • 桌面应用
  • 图形学
  • 3D渲染
  • 图像处理

【免费下载链接】material-maker

A procedural textures authoring and 3D model painting tool based on the Godot game engine

项目地址:https://gitcode.com/gh_mirrors/ma/material-maker
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询