【问题标题】:Linear sampled Gaussian blur quality issue线性采样高斯模糊质量问题
【发布时间】:2022-04-30 00:59:41
【问题描述】:

我最近根据这篇文章实现了线性采样高斯模糊:Linear Sampled Gaussian Blur

它通常效果很好,但似乎文本上有轻微的锯齿和较薄的像素集合。我很困惑是什么原因造成的,这是我的着色器或权重计算的问题,还是使用这种方法的继承缺陷?

我想补充一点,当我定期采样每个像素而不是使用双线性过滤时,我不会遇到这个问题。

非常感谢任何见解。这是我如何计算权重的代码示例:

int support = int(sigma * 3.0f);

float total = 0.0f;

weights.push_back(exp(-(0*0)/(2*sigma*sigma))/(sqrt(2*constants::pi)*sigma));
total += weights.back();

offsets.push_back(0);

for (int i = 1; i <= support; i++)
{
  float w1 = exp(-(i*i)/(2*sigma*sigma))/(sqrt(2*constants::pi)*sigma);
  float w2 = exp(-((i+1)*(i+1))/(2*sigma*sigma))/(sqrt(2*constants::pi)*sigma);
  
  weights.push_back(w1 + w2);
  total += 2.0f * weights[i];
  
  offsets.push_back((i * w1 + (i + 1) * w2) / weights[i]);
}

for (int i = 0; i < support; i++)
{
  weights[i] /= total;
}

这里是片段着色器(这个着色器还有另一个垂直版本):

 void main()
 {
  vec3 acc = texture2D(tex_object, v_tex_coord.st).rgb*weights[0];
  for (int i = 1; i < NUM_SAMPLES; i++)
  {
    acc += texture2D(tex_object, (v_tex_coord.st+(vec2(offsets[i], 0.0)/tex_size))).rgb*weights[i];
    acc += texture2D(tex_object, (v_tex_coord.st-(vec2(offsets[i], 0.0)/tex_size))).rgb*weights[i];
  }
  gl_FragColor = vec4(acc, 1.0);

这是描述问题的屏幕截图:

【问题讨论】:

  • 当我尝试使用浮动偏移时,我之前实现了一个高斯滤波器并且也有这些工件。当我使用整数偏移量(我的意思是只有纹素的中心)时,它看起来更平滑,似乎是一个过滤问题。
  • 我观察到了类似的结果。当我使用 double sigma 在其中心对每个像素进行一次采样时,我会得到更平滑的结果。
  • 您可以应用高斯滤镜几次以获得更高的模糊度,同时使用像素中心来获得平滑且高度模糊的结果。如果结果变暗,您可以将通道加在一起。
  • 使用这种方法的目的是将采样计数减半。我已经有一个看起来不错的模糊,我想优化我已经正常工作的内容。

标签: c++ glsl shader blur antialiasing


【解决方案1】:

对我来说,这看起来像是正确的高斯模糊。文本中断的程度取决于您的sigma。你用的是什么值?

我还会检查您正在使用的投影的缩放矩阵。

如果你想模糊但不影响文字和细像素线,你可能会想到

  • 将结果与温和高通滤波器的输出合成
  • 使用较小的sigma
  • 更改内核的形状,使其不是高斯:您可以尝试使用具有较高超峰度的函数,而不是exp(-i*i/s*s)。您可以尝试使用线性向上/向下功能,或者使用此页面上列出的功能之一:http://en.wikipedia.org/wiki/Kurtosis。它们都会导致模糊,并破坏不同程度的精细细节。

【讨论】:

    【解决方案2】:

    这是双线性过滤的固有问题。这是不可避免的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 2012-08-31
      • 2015-11-05
      • 2020-10-07
      相关资源
      最近更新 更多