프로그래밍 2015. 5. 8. 21:20
728x90

 

그림자 vsm 구현 - 깊이 버퍼 그림자 vsm

 

 

 

 

 

PS()

{

.......

.......

 

return OrigColor * moments.x;

 

}

 

깊이버퍼 텍스쳐의 깊이값을 그대로 컬러에 곱해주면,

부드러운 외곽선을 가진 그림자가 그려집니다.

 

내값과 버퍼의 값을 비교하지 않고,

무조건 그려버리는 것이지요.

 

이건 사실 사용할수 없는 코드와 같습니다.

이유는 밑의 스샷과 같은 결과가 나타나기 때문입니다.

 

 

 

 

위 스샷에서 라이트는 오른쪽 위에 있습니다.

오른쪽 위에서 왼쪽 하단으로 빛이 떨어집니다.

몬스터에 그림자가 드리워 집니다.

여기까지는 좋습니다만,

 

어라,

몬스터와 빛 사이에 그림자가 또 만들어져 있습니다.

 

깊이값을 비교하지 않고, 무조건 그리기 때문에,

라이트와 몬스터간의 사이에 걸쳐진 면에도

moments 값이 적용되게 됩니다.

 

그런데 잠깐 여기서 생각을 해봅시다.

바닥이 평평하다면, 라이트가 머리 꼭대기 쪽( 12시 방향 ) 에 있다면?

 

보다시피, 외곽선은 아주 스무드하게 처리가 되기 때문에,

우리가 바라는 결과입니다.

 

저의 경우는 맵툴에서

선택적으로 vsm 을 사용할 수 있도록 셋팅해두었습니다.

 

위 스샷과 같은 울퉁불퉁한 지형에서는 정상적인 vsm 으로,

(그림자가 여기저기 출력되면 안되니까요)

지형이 넓고 평평하고, 라이트 위치가 12시 방향일때는,

뎁스값 비교없이, 그림자를 만들 수 있도록 하였습니다.

(참고로 셀프쉐도우에서는 이 방식을 사용할 수 없습니다.

보통 오브젝트나, 캐릭터의 경우, 평평하고 단일화된 메쉬의 모양이 아니기 때문에

결과적으로 그림자가 없어야될 수많은 면에 그림자가 붙게 됩니다.) 

 

 

그럼 여기서 뭔가 이상하지 않으신가요?

 

vsm 을 구현되었다면,

왜 선택적으로 비정상적인 구현도 사용을 할까요?

 

 

결론적으로

original vsm 구현 방식으로는 원하는 만큼의 그림자 퀄리티를 뽑아내기 위한,

제한 사항이 너무 많았다는 것입니다. 

 

 

이어서 다시 설명드리겠습니다.

 

 

 

728x90
posted by BK dddDang
: