Войти
ПрограммированиеФорумГрафика

Кое-что о размытии изображения с помощью шейдеров. (комментарии) (3 стр)

Страницы: 1 2 3
#30
17:56, 9 окт. 2013

Sergio
Сравнил свой вариант блюра по скорости с вашим (который в конце статьи)
Мой оказался в 1.4 раза быстрее ^_^
Тестировал на iPhone 4S (и ваш шейдер немного оптимизировал для OpenGL ES перед тестами, чуть ускорив)

Тесты: (см. FPS в левом-нижнем углу, а не в верхнем :))

+ Показать

Буду рад, если кто-нибудь ещё потестит мой шейдер на скорость работы... и поднимет мой ЧСВ ещё выше, или наоборот опустит :D

У меня хоть и не Гаусс... но результат вроде выдаёт приличный :)
Форма кривой распределения задается в вертексном шейдере, и её можно задать любую. Сейчас используется такая:

+ Показать

Шейдер:

+ Показать

P.S.
Потестил также блюр с "треугольным законом распределения"
Скорость этого шейдера оказалась точно такой же, как у моего. А результат - среднее между Гауссом и моим (ну оно и видно по кривой распределения).
Но у моего шейдера плюс в том, что можно задавать форму кривой распределения, и сделать её, например, похожей на Гаусса )


#31
18:06, 9 окт. 2013

maniagl
А с моим не сравнивал?

#32
18:32, 9 окт. 2013

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

#33
18:46, 9 окт. 2013

maniagl
> Нет. Не вижу смысла хотя бы из за этого, что сильный и качественный блюр с этим
> не получить:
Как это не получить? Параметр r же! Параметр r относителен, то есть 1 - это эллипс с полуосями, равными ширине и высоте текстуры. Например, 0.1 - это сильное размытие, 0.01 - слабое. Качество максимально, если dir единично. Это если тормозит, то только тогда имеет смысл делать dir не единичным в ущерб качеству.

#34
19:31, 9 окт. 2013

gammaker
Ну значит я неправильно понял твои слова )
Попытался сейчас адаптировать твой шейдер, но че-то там херня какая-то... вот в этой строчке например:
> sum+=texture(s, center+i*dir)*(rn2-i*i);
если i изменяется в цикле на 1, а dir тоже равно 1, то изменение текстурной координаты на i*dir = 1, т.е. на ширину всей текстуры o_O - это что-то явно странное ))
Короче мне жалко дальше тратить свое время, поэтому я пас )

#35
19:38, 9 окт. 2013

maniagl
> если i изменяется в цикле на 1, а dir тоже равно 1, то изменение текстурной
> координаты на i*dir = 1, т.е. на ширину всей текстуры o_O - это что-то явно
> странное ))
Ой нет, я забыл, что потом нормированный dir надо поделить на размеры текстуры в пикселях.

#36
4:51, 3 дек. 2013

Если уж совсем оптимизировать, то зачем вычислять экспоненту для каждой точки? Она же не меняется в процессе рендеринка одного кадра. Проще передавать ее как параметр.
И весь шейдер сведется к:

uniform float _pass; // по вертикали или по горизонтали
uniform float gauss[21]; // значения экспоненты, скажем радиус = 10 точек

vec4  GetPixel(vec2 base, vec2 xy, vec2 sc)
{
  return texture2D(s_texture_0,vec2(base+xy*sc));
}

void main()
{
  vec4 color=0.0;

  float i;
  vec2 d;

  d.x=abs(ddx(gl_TexCoord[0].x));
  d.y=abs(ddy(gl_TexCoord[0].y)); 


  for(i=-10.0;i<=10.0;i+=1.0)
  {
    vec2 coord=mix(vec2(i,0.0),vec2(0.0,i),_pass);
    color+=GetPixel(gl_TexCoord[0].xy,coord,d)*gauss[i+10];
  }

  gl_FragColor = color;

}

Прошло более 11 месяцев
#37
2:03, 19 ноя. 2014

а если использовать в качестве весовой функции smoothstep() вместо Гаусса? как это по производительности и по качеству?

#38
3:29, 19 ноя. 2014

Копнул :)

Шейдеры, которые представлены в статье - чисто для ознакомления и понимания. На практике я очень не советую их использовать. Можно сделать то же самое гораздо быстрее.

Ну а вообще проверь по производительности.

#39
11:25, 19 ноя. 2014

А DOF можно сделать, извините за глупый вопрос (статью еще не читала) ?

#40
11:26, 19 ноя. 2014

programina
По сути DOF это и есть размытие, только величина зависит от удаленности от плоскости фокусировки

#41
11:41, 19 ноя. 2014

d.m.k., ясно. Спасибо.

#42
13:54, 19 ноя. 2014

d.m.k
> По сути DOF это и есть размытие, только величина зависит от удаленности от
> плоскости фокусировки

Достаточно фокусировки - ибо это расстояние от focal plane

#43
14:26, 19 ноя. 2014

Правильный DOF тяжело сделать

Страницы: 1 2 3
ПрограммированиеФорумГрафика

Тема в архиве.