污迹
当你试图获得一个特定的外观或者执行一些技术比如运动模糊时,模糊这个或者那个的需要会经常出现。下面是一些模糊游戏形象的方法。
盒子模糊
盒子模糊或均值滤波算法是一种简单的实现模糊效果的方法。速度很快,完成了任务。如果你需要更多的技巧,你可以升级到高斯模糊。
// …
vec2 texSize = textureSize(colorTexture, 0).xy;
vec2 texCoord = gl_FragCoord.xy / texSize;
int size = int(parameters.x);
if (size <= 0) { fragColor = texture(colorTexture, texCoord); return; }
// …
这大小参数控制结果的模糊程度。如果大小等于或小于零,则原封不动地返回片段。
// …
float separation = parameters.y;
separation = max(separation, 1);
// …
这分离参数扩展了模糊,而不必对额外的片段进行采样。分离范围从1到无穷大。
// …
for (int i = -size; i <= size; ++i) {
for (int j = -size; j <= size; ++j) {
// …
}
}
// …
就像概述技术,框模糊技术使用以当前片段为中心的内核/矩阵/窗口。窗户的尺寸是尺寸* 2 + 1经过尺寸* 2 + 1。例如,用一个大小设置为2,窗口使用(2 * 2 + 1)^2 = 25每个片段的样本。
// …
fragColor +=
texture
( colorTexture
, ( gl_FragCoord.xy
+ (vec2(i, j) * separation)
)
/ texSize
);
// ...
要计算窗口中样本的平均值或平均值,从窗口循环开始,将每个颜色向量相加。
// ...
fragColor /= pow(size * 2 + 1, 2);
// …
要完成平均值的计算,将采样的颜色之和除以采样的数量。最终片段颜色是窗口内采样片段的平均值或平均值。
中值滤波器
框模糊使用采样的平均颜色。中值滤波器使用所采集样本的中值颜色。通过使用中间值而不是平均值,图像中的边缘得以保留——这意味着边缘保持漂亮和清晰。例如,查看框中模糊图像和中值滤波图像的窗口。
不幸的是,找到中间值可能比找到平均值慢。您可以对这些值进行排序并选择中间值,但这至少需要准线性时间。有一种技术可以找到线性时间的中值&#x