프로그래밍 2020. 4. 13. 18:55
728x90

 

 

 

vsm 에서,

PS 의 구현코드를 살펴보면,

 

//그림자 버퍼에서 계산된

//moments.x -> depth (보통 작은 소수점 값)

//moments.y -> depth * depth (소수점값을 곱해주었으므로 더 작은값이된다)

 

오브젝트 외곽의 depth 가 0.5 라고 할때

x = 0.5, y = (0.5 * 0.5) = 0.25

 

외곽의 경우, 필터링 거친후 대충

x = (0.5 + 1) / 2 = 0.75

y = (0.25 + 1) / 2 = 0.63

 

y = 0.63

x * x = 0.5625

 

그러므로, y - (x * x) 해준다

 

//vsm 그림자 출력 계산

float va = Moments.y - (Moments.x * Moments.x);
va = max( va, fBias );
float d = (fMyDepth - Moments.x);
return smoothstep( Amount, 1.f, (va) / (va + d*d) );  //그림자 컬러 (0~1) , 0이면 완전검정, 1이면 그림자가 없는것

 

 

d = 현재 렌더링되는 오브젝트의 라이트와의 거리 - 그림자버퍼에서 읽어온 라이트와의 거리

인데,

서로 인접한 애들의 거리값은 당연히 작을것이고, 멀리 떨어진 애들의 거리값은 크기 때문에,

( 이 값들은, 0.1 정도의 우리들이 보통 사용하는 값크기가 아니다,

라이트뷰의 farZ 에 따라 다르겠지만, 보통 0.00001 정도의 아주 작은 소수값들이다)

 

va / (va + d*d) 

 

va = 0.00001, d = 0.000001 라고 할때,

0.00001 / (0.00001 + 0.000001) -> 0.90909090

(0일때 완전검은색의 그림자, 1이면 그림자가 없는것과 같다)

 

계산상으로,

인접한 애들의 그림자색은 필연적으로 1 에 가깝게 아주 옅어지게 되어있다

반대로, 멀리 떨어진 경우에는 d 값이 커지니, 

0.00001 / (0.00001 + 0.0001) -> 0.090909090

그림자가 진해진다

 

 

그래서 위의 스샷처럼,

그림자가 시작되는 위치에, 그림자가 드리워지지 않는 결과가 출력된다

 

현실의 그림자가, 시작부분이 진하고, 

끄트머리 부분이 옅어지는 것과는 반대의 결과이다

 

이를 보정하기 위해서,

위 코드에서 fBias 를 0으로 두면, 

va 값이 아주아주 미세한 값이 될 경우에도, d 값은 이 미세한 va 값보다 항상 큰 경우가 되어,

0.0000001 / (0.0000001 + 0.000001) -> 0.090909090

그림자 시작부분에도 그림자를 채워줄수 있다

 

 

밑의 스샷을 보자

 

 

그런데 문제가 있다,

위의 스샷에서는 보이지 않지만,

 

fBias 를 0으로 두면, 

맵의 여러가지 그림자 출력의 경우에서, light bleed  (빛이 샘) 이 두드러지게 된다

(vsm light bleeding 문제)

(특히, 여러개의 오브젝트의 그림자가 섞일때 많이 두드러진다)

 

 

 

위 코드에서 Amount 값을 올리면, (0 ~ 1 )

전체적으로 그림자가 약한 부분이 진해져서, 그림자가 비워진 부분을 그림자로 채울수 있는데

이 역시 문제는, 그림자가 전체적으로 fat 해진다는 것이다

그림자의 외곽이 진해지고, 전체적으로 둥글둥글해진다고나 할까,,,

 

고민해보고,

이것저것 계산식도 변경해서 적용해 보았지만,

light bleeding 해결을 하면, 그림자 외곽의 스무드한 변화를 포기해야하는 결과가 나왔다

 

이렇게도 해보고,

저렇게도 해보았는데,,,

 

나의 결과론적으로, 

 

vsm 에서,

완전히, light bleeding 가 없는, 부드러운 그림자 외곽의 출력은

 

 

 

안된다~~~~~~~~~~~~~~~~~~!!

 

 

 

저 짧은 수식을 여러가지 방법으로 고쳐보아도

원하는 결과를 볼수없었다

 

( 조금이라도 더 나은 출력결과를 얻으려면,

만들어진 shadow depth 텍스쳐를 blur 처리해주면, light bleeding 이 완화되기는 한다)

 

728x90
posted by BK dddDang
: