Проблема качества размытия по Гауссу с линейной выборкой

Недавно я реализовал линейное сэмплированное размытие по Гауссу на основе этой статьи:

Гауссово размытие с линейной выборкой

В целом все получилось хорошо, но, похоже, на тексте есть небольшое алиасинг и более тонкие наборы пикселей. Я довольно озадачен тем, что вызывает это, это проблема с моими вычислениями шейдера или веса, или это наследственный недостаток использования этого метода?

Я хотел бы добавить, что я не сталкиваюсь с этой проблемой, когда регулярно отбираю каждый пиксель вместо использования билинейной фильтрации.

Любые идеи очень ценятся. Вот пример кода того, как я работаю со своими весами:

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);

Вот скриншот, изображающий проблему:

Линейный образец Gaussian Blur Issue

1

Решение

Для меня это выглядит как правильное размытие по Гауссу. Степень нарушения текста зависит от вашего sigma, Какую ценность вы используете?

Также я бы проверил матрицу масштабирования для проекции, которую вы используете.

Если вы хотите размыть, но не влияя на текст и тонкие линии пикселей, вы можете подумать о

  • составление результата с выходом мягкого фильтра верхних частот
  • использовать меньше sigma
  • изменить форму ядра, так что это не гауссовский: а не exp(-i*i/s*s)Вы можете попробовать функцию с более высоким избыточным эксцессом. Вы можете попробовать использовать линейную функцию вверх / вниз или одну из функций, перечисленных на этой странице: http://en.wikipedia.org/wiki/Kurtosis . Все они приводят к размытости с различной степенью нарушения мелких деталей.
2

Другие решения

Это неотъемлемая проблема с билинейной фильтрацией. Это неизбежно.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector