我最近基于这篇文章实现了线性采样高斯模糊:
它通常表现良好,但看起来在文本和较薄的像素集合上有轻微的变化。我对于造成这种情况的原因感到非常难过,这是我的着色器或重量计算的问题,还是使用此方法的继承退回?
我想补充一点,当我定期对每个像素进行采样而不是使用双线性滤波时,我不会遇到这个问题。
非常感谢任何见解。这是我如何计算权重的代码示例:
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);
以下是描述该问题的屏幕截图:
答案 0 :(得分:2)
对我来说,这看起来像是一个正确的高斯模糊。文本中断的程度取决于您的sigma
。你使用什么价值?
另外,我会检查您正在使用的投影的缩放矩阵。
如果你想模糊但不影响文字和细像素线,你可能会想到
sigma
exp(-i*i/s*s)
,你可以尝试一个具有更高过度峰度的函数。您可以尝试使用线性向上/向下功能,或者尝试使用此页面上列出的其中一项功能:http://en.wikipedia.org/wiki/Kurtosis。它们都会导致模糊不清的细节。答案 1 :(得分:0)
这是双线性过滤的固有问题。这是不可避免的。