Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Кое-что о размытии изображения с помощью шейдеров. (комментарии) (3 стр)

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

Поделиться
Страницы: 1 2 3
maniaglПостоялецwww9 окт. 201317:56#30
Sergio
Сравнил свой вариант блюра по скорости с вашим (который в конце статьи)
Мой оказался в 1.4 раза быстрее ^_^
Тестировал на iPhone 4S (и ваш шейдер немного оптимизировал для OpenGL ES перед тестами, чуть ускорив)

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

+ Показать

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

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

+ Показать

Шейдер:

+ Показать

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

gammakerПостоялецwww9 окт. 201318:06#31
maniagl
А с моим не сравнивал?
maniaglПостоялецwww9 окт. 201318:32#32
gammaker
Нет. Не вижу смысла хотя бы из за этого, что сильный и качественный блюр с этим не получить:
> dir должен быть единичным: если больше, то цикл будет перепрыгивать через пиксели и будет смотреться не очень...
gammakerПостоялецwww9 окт. 201318:46#33
maniagl
> Нет. Не вижу смысла хотя бы из за этого, что сильный и качественный блюр с этим
> не получить:
Как это не получить? Параметр r же! Параметр r относителен, то есть 1 - это эллипс с полуосями, равными ширине и высоте текстуры. Например, 0.1 - это сильное размытие, 0.01 - слабое. Качество максимально, если dir единично. Это если тормозит, то только тогда имеет смысл делать dir не единичным в ущерб качеству.
maniaglПостоялецwww9 окт. 201319:31#34
gammaker
Ну значит я неправильно понял твои слова )
Попытался сейчас адаптировать твой шейдер, но че-то там херня какая-то... вот в этой строчке например:
> sum+=texture(s, center+i*dir)*(rn2-i*i);
если i изменяется в цикле на 1, а dir тоже равно 1, то изменение текстурной координаты на i*dir = 1, т.е. на ширину всей текстуры o_O - это что-то явно странное ))
Короче мне жалко дальше тратить свое время, поэтому я пас )
gammakerПостоялецwww9 окт. 201319:38#35
maniagl
> если i изменяется в цикле на 1, а dir тоже равно 1, то изменение текстурной
> координаты на i*dir = 1, т.е. на ширину всей текстуры o_O - это что-то явно
> странное ))
Ой нет, я забыл, что потом нормированный dir надо поделить на размеры текстуры в пикселях.
sanПостоялецwww3 дек. 20134:51#36
Если уж совсем оптимизировать, то зачем вычислять экспоненту для каждой точки? Она же не меняется в процессе рендеринка одного кадра. Проще передавать ее как параметр.
И весь шейдер сведется к:

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;

}

simpetarПостоялецwww19 ноя. 20142:03#37
а если использовать в качестве весовой функции smoothstep() вместо Гаусса? как это по производительности и по качеству?
SergioУдалёнwww19 ноя. 20143:29#38
Копнул :)

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

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

programinaЗабаненwww19 ноя. 201411:25#39
А DOF можно сделать, извините за глупый вопрос (статью еще не читала) ?
d.m.kУдалёнwww19 ноя. 201411:26#40
programina
По сути DOF это и есть размытие, только величина зависит от удаленности от плоскости фокусировки
programinaЗабаненwww19 ноя. 201411:41#41
d.m.k., ясно. Спасибо.
innuendoПостоялецwww19 ноя. 201413:54#42
d.m.k
> По сути DOF это и есть размытие, только величина зависит от удаленности от
> плоскости фокусировки

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

SergioУдалёнwww19 ноя. 201414:26#43
Правильный DOF тяжело сделать
Страницы: 1 2 3

/ Форум / Программирование игр / Графика

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

2001—2017 © GameDev.ru — Разработка игр