vogelDiskSample
基于 Vogel 盘序列,在单位圆盘内部生成均匀分布的 2D 采样点。给定样本索引、总样本数和旋转角度 φ,返回该样本在圆盘上的 vec2 偏移坐标。
核心优势
相比简单的随机或规则网格采样,这种低差异序列能更均匀地覆盖圆盘区域,在相同样本数下产生更少噪点、收敛更快,非常适合实时渲染中的多样本模糊、SSAO、软阴影和去噪等效果。
常见用途
在景深(Depth of Field)/ 散焦模糊中,用作光圈盘上的样本偏移。
在屏幕空间环境光遮蔽(SSAO)、软阴影、体积光等效果中,围绕当前像素进行圆盘区域采样。
在后期模糊、泛光、去噪等后处理通道中,构建分布良好的圆盘采样核。
结合噪声或随机数(如 IGN)为每个像素随机旋转采样图案,打散条纹伪影与重复纹理。
如何调整
vogelDiskSample 有三个核心参数:sampleIndex、samplesCount 和 phi。\n\n1)sampleIndex:样本索引,一般在 Loop 或 for 循环中从 0 迭代到 samplesCount - 1。单独使用时,改变它会沿着 Vogel 螺旋轨迹依次扫过不同的圆盘位置。\n\n2)samplesCount:总样本数。它决定了圆盘上点的密度和均匀程度——数值越大,模糊/遮蔽越平滑,但着色成本也按比例增加。SSAO/DOF 等场景中常见的范围是 8–32。\n\n3)phi:整体旋转角度(弧度)。使用一个每像素不同的随机 φ(例如由 IGN 或 hash(uv) * 2π 得到)可以让每个像素的采样图案随机旋转,从而有效打散条纹伪影;使用随时间变化的 φ 则可以让采样图案缓慢旋转,产生细微的动态颗粒感。\n\n注意:vogelDiskSample 返回的是单位圆盘内的偏移,真正决定“模糊半径/采样半径”的是你后续乘上的缩放系数(例如 offset.mul( blurRadius )),可以根据画面分辨率或世界空间尺寸来调节。
代码示例
1// 使用 Vogel 盘序列在单位圆盘内生成一个采样偏移
2const samplesCount = int(16);
3const phi = time.mul( TSL.PI2 ); // 让采样图案随时间旋转
4
5// 取当前样本索引对应的圆盘偏移(通常在 Loop 中由索引驱动)
6const offset = vogelDiskSample( int(0), samplesCount, phi );
7
8// 将偏移缩放后加到 UV 上,用于模糊或 DOF 等效果
9const sampleUV = uv().add( offset.mul( 0.03 ) );