Возможно ли реализовать фрагментный шейдер, чтобы сделать однопроходное размытие по Гауссу? Я нашел много реализации двухпроходного размытия (гауссово и размытие в рамке):
- http://callumhay.blogspot.com/2010/09/gaussian-blur-shader-glsl.html
- http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/
- http://www.geeks3d.com/20100909/shader-library-gaussian-blur-post-processing-filter-in-glsl/
и так далее.
Я думал о реализации размытия по Гауссу как свертки (на самом деле, это свертка, приведенные выше примеры являются лишь приблизительными):
glsl
fragment-shader
blur
Мартин Пилч
источник
источник
Хитрость для быстрого размытия по Гауссу с помощью GLSL заключается в том, чтобы использовать тот факт, что графический процессор обеспечивает аппаратную линейную интерполяцию. Следовательно, вы можете эффективно сэмплировать четыре 2D-пикселя с помощью одной предварительной выборки или восьми 3D-вокселей. Решив, где взять образец, вы можете взвесить результат. Точная ссылка - «Быстрая фильтрация текстур третьего порядка» Сигга и Хадвигера, которую вы можете найти в Интернете.
Для наглядного объяснения найдите веб-страницу «Эффективное размытие по Гауссу с линейной выборкой». Как уже отмечалось, поскольку размытие по Гауссу отделимо от широких ядер, наиболее эффективно сделать один проход на измерение.
Однако вы также можете использовать этот трюк для аппроксимации гауссиана с плотным ядром за один проход. В приведенном ниже примере я эмулирую трехмерное ядро с верхним срезом = [1 2 1; 2 4 2; 1 2 1]; средний срез = [2 4 2; 4 8 4; 2 4 2]; нижний срез = [1 2 1; 2 4 2; 1 2 1]. Сэмплируя +/- 0,5 вокселей в каждом измерении, вы делаете это всего с 8 выборками текстур, а не 27. Я демонстрирую это в GLSL как файл шейдера MRIcroGL - просто удалите сохраненный ниже скрипт как «a.txt» и поместите его в Папка "Шейдер" MRIcroGL. Когда вы перезапустите программу, вы увидите, что ваше изображение луча размыто. Нажатие на флажок «doBlur» включает и выключает размытие. Использование моего интегрированного графического процессора Intel в моем ноутбуке и "chris_t1" Изображение, которое поставляется с MRIcroGL Я получаю 70 кадров в секунду без размытия (1 выборка текстуры) и 21 кадров в секунду с размытием (8 выборок). Большая часть кода - просто классический лучник, условное выражение doBlur инкапсулирует ваш вопрос.
//-------a.txt файл следует
источник