Размытие фрагмента-шейдером … как это работает?

StackOverflow https://stackoverflow.com/questions/2437977

  •  19-09-2019
  •  | 
  •  

Вопрос

uniform sampler2D sampler0;
uniform vec2 tc_offset[9];
void blur()
{
  vec4 sample[9];
  for(int i = 0; i < 9; ++i)
    sample[i] = texture2D(sampler0, gl_TexCoord[0].st + tc_offset[i]);

  gl_FragColor = (sample[0] + (2.0 * sample[1]) + sample[2] +
      (2.0 * sample[3]) + sample[4] + 2.0 * sample[5] +
      sample[6] + 2.0 * sample[7] + sample[8] ) / 13.0;
}

Как работает строка sample[i] = Texture2D(sample0, ...)?

Похоже, что для размытия изображения я должен сначала сгенерировать изображение, но здесь я каким-то образом пытаюсь запросить тот самый iamge, который я генерирую.Как это работает?

Это было полезно?

Решение

Как вы заметили, для того, чтобы сделать размытое изображение, вам сначала нужно создать изображение, а затем размыть его.Этот шейдер выполняет (всего лишь) второй шаг, беря изображение, которое было сгенерировано ранее, и размывая его.В другом месте должен быть дополнительный код, чтобы сгенерировать исходное не размытое изображение.

Другие советы

Он применяет к изображению ядро размытия. tc_offset должен быть должным образом инициализирован приложением, чтобы сформировать область точек выборки размером 3x3 вокруг фактической координаты текстуры:

0   0   0
0   x   0
0   0   0

(предполагая, что x - исходная координата).Смещение для верхней левой точки выборки будет равно -1/width,-1/height.Смещение центральной точки должно быть тщательно выровнено по центру текселя (проблема с отклонением на 0,5).Кроме того, аппаратный билинейный фильтр может быть использован для недорогого увеличения степени размытия (путем дискретизации между текселями).

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

for(int i = 0; i < NUM_SAMPLES; ++i) {
    result += texture2D(sampler,texcoord+offsetscaling[i].xy)*offsetscaling[i].z;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top