Размытие фрагмента-шейдера ... как это работает? - PullRequest
3 голосов
/ 13 марта 2010
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, который я генерирую. Как это работает?

Ответы [ 3 ]

6 голосов
/ 13 марта 2010

Применяет к изображению ядро ​​размытия. 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;
}
5 голосов
/ 13 марта 2010

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

4 голосов
/ 14 марта 2010

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

...