面向初学者的3D游戏着色器————污迹

本文面向初学者介绍了3D游戏中的模糊技术,包括盒子模糊和中值滤波器。盒子模糊通过均值滤波实现快速模糊效果,而中值滤波则能保留图像边缘清晰度。文章详细讲解了两种模糊算法的实现原理和代码示例。
摘要由CSDN通过智能技术生成

污迹
当你试图获得一个特定的外观或者执行一些技术比如运动模糊时,模糊这个或者那个的需要会经常出现。下面是一些模糊游戏形象的方法。

盒子模糊
盒子模糊或均值滤波算法是一种简单的实现模糊效果的方法。速度很快,完成了任务。如果你需要更多的技巧,你可以升级到高斯模糊。
// …

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

geescan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值