Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / VSM и reversed depth

VSM и reversed depth

Поделиться

Страницы: 1 2 Следующая

0xc0deПостоялецwww14 окт. 201713:24#0
Не получается совместить Variance Shadow Mapping и Reversed depth.
Буфер глубины инвертированный, т.е. 1 соответствует ближней плоскости, 0 - дальней.
Clipspace z не [-1,+1] а [0,1].

Шейдер записи карты теней:

void main() {
    float depth = /*1.0 - */VS_Position.z / VS_Position.w;

    //depth = depth * 0.5 + 0.5;

    float moment1 = depth;
    float moment2 = depth * depth;

    float dx = dFdx( depth );
    float dy = dFdy( depth );
    moment2 += 0.25*( dx*dx + dy*dy ) ;

    fragColor = vec4( moment1, moment2, 0.0, 0.0 );
}

Строка depth = depth * 0.5 + 0.5; закомментирована, т.к. Z итак в диапазоне от 0 до 1

Код затенения

float VSM_Shadow( in sampler2D _ShadowMap, in vec4 _TexCoord ) {

    // Chebyshev upper bound

    vec4 ShadowCoordPostW = _TexCoord / _TexCoord.w;
    float distance = /*1.0 - */ShadowCoordPostW.z;

    vec2 moments = texture( _ShadowMap, ShadowCoordPostW.xy ).rg;

    if ( distance <= moments.x )
        return 1.0;

    float variance = moments.y - ( moments.x*moments.x );
    variance = max( variance, 0.00002 );

    float d = distance - moments.x;
    float p_max = variance / ( variance + d*d );

    return p_max;
}

Вот что получается:

+ Показать

Если расскомментировать /*1.0 - ... */ в обоих шейдерах, то результат такой:

+ Показать

0xc0deПостоялецwww14 окт. 201713:34#1
Блин cull-face поменял при записи в буфер глубины и стало вроде норм
0xc0deПостоялецwww14 окт. 201713:35#2
+ Показать
0xc0deПостоялецwww14 окт. 201715:21#3
Не пойму, так и должно быть, что чем дальше тень, тем она темнее?
+ Показать
MisanthropeПостоялецwww14 окт. 201715:30#4
0xc0de
> Не пойму, так и должно быть, что чем дальше тень, тем она темнее?
врятли
Battle Angel AlitaПостоялецwww14 окт. 201715:58#5
0xc0de
Это багофича всех подобных техник.
YukioПостоялецwww14 окт. 201716:06#6
0xc0de
> Не пойму, так и должно быть, что чем дальше тень, тем она темнее?
нет, у вас тени работают наоборот. надо так: чем ближе - контуры тени более плотные и темные, чем дальше - более рассеянные и светлые. Именно контуры а не сама тень. Интенсивность самой тени в большей степени зависит от материала на который попадает свет (матовый-глянцевый, метал-диэлектрик, есть SSS- нет SSS и тд). Плюс ко всему это сильно зависит от положения солнца.
0xc0deПостоялецwww14 окт. 201716:10#7
Так это баг самой техники или я что-то делаю не так?
codingmonkeyПостоялецwww14 окт. 201716:39#8
>Так это баг самой техники или я что-то делаю не так?
да, самой техники
попробуй параметром пофиксить см. ReduceLightBleeding
и в твоём случае с reversed depth, наверное все менять местами нужно будет
+ Показать
0xc0deПостоялецwww14 окт. 201717:24#9
Вот что получилось с reduce light bleeding:
+ Показать

Сравнение с обычным PCF:

+ Показать


Получается, что PCF даже лучше, чем VSM?

g-contПостоялецwww14 окт. 201718:48#10
0xc0de
> Получается, что PCF даже лучше, чем VSM?
а я всегда это говорил
Battle Angel AlitaПостоялецwww14 окт. 201722:54#11
g-cont
> а я всегда это говорил
После того как попробуешь фильтрованные тени PCF уже кажется каменным топором. Никаких зазубрин, можно использовать хардварный антиальясинг, никакого акне, работают мипмапинг и анизотропка, простой шэйдер, можно заранее размыть на какой угодно радиус.
Ах да, и решается одна из фундаментальных проблем обычных depth sadows - не работает полупрозрачность. В фильтрованые тени можно без каких либо проблем вбленживать любые полупрозрачные объекты.
Лично я делала EVSM 2*32, так получается лучший результат для очень мягких разблюреных теней.
Изображение

Правка: 14 окт. 2017 22:57

0xc0deПостоялецwww15 окт. 20173:38#12
Сделал EVSM:
+ Показать

Уже лучше, чем просто VSM. Но:

1. Для обычного PCF достаточно одной карты глубины 32-бит
2. Для VSM нужны:
  - карта глубины 32-бит
  - две текстуры RG_32F (вторая для блюра)
3. Для EVSM нужны:
  - карта глубины 32-бит
  - две текстуры RGBA_32F (вторая для блюра)
При этом каких-то существенных разниц между ними не особо заметно.

SuslikМодераторwww15 окт. 20174:12#13
0xc0de
> float depth = /*1.0 - */VS_Position.z / VS_Position.w;
>
> //depth = depth * 0.5 + 0.5;
>
> float moment1 = depth;
> float moment2 = depth * depth;
>
> float dx = dFdx( depth );
> float dy = dFdy( depth );
ну ведь брехня же, ёпта. vsm производные считаются в world space'е, то есть глубину нужно линеаризовать. тогда не имеет значения, с каким у тебя там знаком буфер глубины хранится. а то у тебя получается, что радиус пенумбры зависит от матрицы трансформации.
g-contПостоялецwww15 окт. 201711:33#14
Battle Angel Alita
> После того как попробуешь фильтрованные тени PCF уже кажется каменным топором
у VSM есть принципиально неустранимые недостатки, тот же блидинг.

Страницы: 1 2 Следующая

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

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