Loop
Loop
在着色器中实现迭代计算(等同于 for 循环),是实现程序化生成、累加效果和高级迭代算法的基础。
核心优势
其核心价值在于解锁 GPU 上的程序化生成能力。它将底层的 GLSL for 循环抽象为结构清晰的 TSL 节点,让开发者能优雅地实现光线步进、分形噪波等复杂算法,而无需手动展开循环或拼接 GLSL 字符串,在获得强大算法能力的同时保持了代码的可读性和性能。
常见用途
在光线步进(Ray Marching)中作为“步进引擎”,逐步推进光线以渲染 SDF 图形。
在分形噪波(fBm)中作为“八度累加器”,通过多次迭代叠加不同频率的噪波以创造复杂纹理。
在高级后期处理(如散景模糊)中作为“多重采样器”,循环采样像素周围的点以计算模糊效果。
在生成沃罗诺伊图时作为“最近邻搜索器”,循环遍历所有特征点以找到距离当前像素最近的一个。
如何调整
调整 Loop 节点的 `end` 参数(即循环次数)是控制其效果最直接的方式。例如,在程序化噪波(fBm)算法中,增加循环次数(增加“octaves”)会叠加更多层次的细节。循环 1 次可能只看到模糊的大斑点,而循环 7 次则会生成细节极其丰富的、类似云层或大理石的复杂纹理。每一次迭代都在为最终结果增加一层“高清细节”。
代码示例
1let totalNoise = float(0.0);
2let frequency = float(1.0);
3let amplitude = float(0.5);
4
5// 通过 uniform 控制循环次数 (octaves)
6Loop({ end: octavesUniform }, () => {
7
8 totalNoise.addAssign( noise( uv().mul(frequency) ).mul(amplitude) );
9
10 // 为下一次循环更新频率和振幅
11 frequency.mulAssign( 2.0 );
12 amplitude.mulAssign( 0.5 );
13
14});