全部专题

高斯模糊为什么先横着做、再竖着做?

二维高斯核可以拆成水平与垂直两个一维核的乘积。直接做 N×N 卷积,每像素需采样 N² 次;分两遍约需 2N 次,但要额外读写中间纹理。核很小时多一遍未必划算,半径增大后则更有优势。

先固定问题

二维高斯核可以分解为水平一维核与垂直一维核的乘积。直接做 N×N 卷积需要每像素 N² 次取样;分成两遍则约为 2N 次,加上中间纹理的存取成本。小核未必值得多开一个通道,大半径时优势更明显。

关键代码

// Execute once with direction=(1,0), then with direction=(0,1).
vec2 stepUV=direction/u_resolution;
vec3 sum=texture2D(source,uv).rgb*0.227027;
sum+=(texture2D(source,uv+stepUV*1.384615).rgb
     +texture2D(source,uv-stepUV*1.384615).rgb)*0.316216;
sum+=(texture2D(source,uv+stepUV*3.230769).rgb
     +texture2D(source,uv-stepUV*3.230769).rgb)*0.070270;

按顺序验证

在可分离示例中选择 u_horizontal,看文字是否只向左右扩散,再选最终图检查上下方向。与 3×3 示例比较时,先匹配核半径和权重,不能只凭两张模糊图比较速度。

适用范围和常见错误

第二遍必须读取第一遍的输出,不能再读原图;也不能把正在写入的目标当作本遍输入。偏移单位应是输入纹理的纹素尺寸。

继续实验

参考

官方文档

运行相关示例