Bonus
А я тебе не помогу? :)
Только сегодня писал depth-based размытие :)))
Вот:
uniform sampler2D depth_texture; uniform sampler2D color_texture; uniform vec4 texel_clipplane; float sample_linear_depth(vec2 texC) { float fDepth = texture2D( depth_texture, texC ).x; return 0.5 * texel_clipplane.z * texel_clipplane.w / ( texel_clipplane.w - fDepth * ( texel_clipplane.w - texel_clipplane.z) ); } const int blur_radius = 4; void main ( void) { float fDepth = sample_linear_depth( gl_TexCoord[0].st); float fMultiplier = ( float( blur_radius) + 1.0); vec4 vColor = texture2D( color_texture, gl_TexCoord[0].st) * fMultiplier; for ( int k = 1; k < blur_radius; k++) { float fStep = float( k); float fScale = ( 1.0 + float( blur_radius) - fStep ); float fPrevDepth = sample_linear_depth( gl_TexCoord[0].st - texel_clipplane.xy * fStep); float fNextDepth = sample_linear_depth( gl_TexCoord[0].st + texel_clipplane.xy * fStep); float fPrevDiff = min( 1.0, 1.0 / ( 1.0e-7 + abs( fPrevDepth - fDepth))); float fNextDiff = min( 1.0, 1.0 / ( 1.0e-7 + abs( fNextDepth - fDepth))); vColor += texture2D( color_texture, gl_TexCoord[0].st + texel_clipplane.xy * fStep ) * fScale * fNextDiff; vColor += texture2D( color_texture, gl_TexCoord[0].st - texel_clipplane.xy * fStep ) * fScale * fPrevDiff; fMultiplier += fScale * ( fPrevDiff + fNextDiff); }; gl_FragColor = vec4( vColor.xyz / fMultiplier, 1.0 ); }
кое-как размазал тени. пока без учета коэффициента размытия, просто всю текстуру теней уменьшаю и блюрю.
есть проблема - приходится вычислять освещение для всех пикселей, даже там где будет тень, иначе тень ложится неправильно
P.S. Sergio666 спасибо за код, попробую прикрутить, как только разберусь с основной отрисовкой теней.
Тему не читал, но по первым скринам, проблемма в фильтрации текстуры, установи её не билиниар\анисотропик, а поинт.
MoKa
> Тему не читал, но по первым скринам, проблемма в фильтрации текстуры, установи
> её не билиниар\анисотропик, а поинт.
Да, спасибо. Для PCF это действительно помогло, это обсуждалось на первой странице. Сейчас уже говорим о screen space тенях, поэтому я переименовал тему.
> Кто знает как бороться с этим багом?
>depth-based размытие
LowPolyMan
> > epth-based размытие
Это значит что помимо (коэффициента размытия=расстоянию пикселя до источника света) нужно еще учитывать и глубину пикселя относительно камеры?
В общем я пока не понимаю, какие параметры нужно учитывать при размытии...
ты моешь какойто маской, где у центрального пикселя самый большой вес, у остальных меньше.
и вот если Abs(centralPixelDeth - maskPixelDeph) > treshold, значит maskPixelDeph, не находится в одной плоскости текущим пикселом => значит его не нужно учитывать при зазмытии
в коде Sergio666
float fPrevDepth = sample_linear_depth(gl_TexCoord[0].st - texel_clipplane.xy * fStep); float fNextDepth = sample_linear_depth(gl_TexCoord[0].st + texel_clipplane.xy * fStep); добавить fNextDepth = abs(fNextDepth - fPrevDepth) > fTreshold ? fPrevDepth : fNextDepth;
Tomat
Спасибо, получилось...
Вобщем я поигрался с этими тенями и пришел к выводу, что все таки за один проход все тени размывать нельзя. На скрине из 77 поста видно что зеленый свет проникает сквозь кубик и ложится в зону красного источника, такого быть не должно. Метод не верен. А если размывать тени для каждого источника, то слишком тормозно...
Тогда лучше pcf или vsm. vsm по качеству дает такую же картинку, но при pssm для directional-источников убивает производительность. Наверно можно использовать гибридный подход:
spot и point источники - vsm или pcf
directional источники - screen space blur или pcf
Bonus,у меня для point источника юзается PCF по Poisson Disc + шум:

И не сказал бы что много кушает.
Bonus была у меня подобная ерунда с освещением.
Как и у тетбя у меня на точки действовал источник света который недолжен эти точки "видить", а следовательно освещать
дело было в том что источник пёр по своей тени, потому что незнал о ней.
я добавил в шейдер такое условие - "если данный тексел затенён относительно данного источника, тогда значению цвета присвоить (0,0,0,0). Иначе расчитать свет" и получилось!!! тоесть грубо говоря дифуз текстура - вместе с хард тенями получилась. но на неё сверху отлично накладываются софт тени, это ещё исправляет баг который возникает если издали смотреть на тень - в скрин спэйсблуре она превращается в пятно, а также наличие хард тени под софт тенью чинит то о чём ты писал в 79 посте.
Вобщем вот что у меня было (слева), и вот что получилось(справа)!

и вот просто скрины рабочие такскзать...

PS: на том скрине где ты отверг метод у тебя тень только в том месте которое недоступно для обоих источников света. а должны быть ещё две менее тёмные, которые доступны только для одного или второго. и самая яркая обл. тоже должна быть (та которая доступна для обоих) Метод непричом, тут у тебя строится неверно.
Igor'
> меня для point источника юзается PCF по Poisson Disc
какой kernelSize ?
сколько выборок для диска ?
шум по VPOS ?
Igor'
Бажное SSAO? :)
Bonus
Скрин-спейс размътие - плохая и глючная техника, если ее очень внимательно не приготовить, т.е. не блюрить с учетом глубинъ.
блин да вы дату последнего моего поста посмотрите. развели тут некрофилию)))
я отказался от этой техники, слишком она дорогая
Bonus
> слишком она дорогая
Как по мне она наоборот дешевая (если про тени от солнца, которъе по всему екрану) и соответно некачественная.
Тема в архиве.