티스토리 뷰

위도우 메이커는 궁극기를 쓰면 벽 뒤에있는 적들의 실루엣을 볼 수 있다. 3D 게임에서 벽 뒤에있는 물체를 볼 수 없는 이유는 렌더링을 할 때 카메라와의 거리를 계산해서 더 가까이에 있는 물체를 그리기 때문이다. 너무 당연한 자연현상이지만, 이 자연의 법칙을 무시하고 벽을 투시하는 위도우 메이커의 시야를 디지털 세계에서 간접적으로 경험해보자.

벽 뒤에있는 물체를 화면에 그리기 위해서 Custom Depth라는 값을 사용할것이다. 3D 세상의 모든 물체들은 그것이 벽 뒤에있더라도, 좌표를 가지고있다. 그리고 엔진은 이 좌표들을 현재 카메라의 위치를 기준으로 계산하여 화면에 그리는데 이 때 카메라와 카메라에 보이는 물체(pixel) 사이의 거리를 Scene Depth라고 한다. 기본적으로 모든 물체는 Scene Dapth만 렌더링 파이프라인에 전달하여 순서대로 그리게 하지만, 임의로 Custom Depth를 전달할 수 있다.

Custom Depth는 화면에 보이는것과 상관없이 카메라와 물체 사이의 거리를 나타낸다. 이 Depth를 통해 물체가 다른 물체 뒤에있는지 앞에있는지 식별할 수 있다.

Post Process Material을 만들어서 실제로 Custom Depth를 화면에 그려보자. Custom Depth를 Post Process에 전달하려면 오브젝트마다 개별적으로 설정해주어야 한다. 벽 뒤에서도 보이게 하고싶은 Mesh의 rendering 설정에서 Render Custom Depth Pass를 체크해주면 이 Mesh에 대한 Custom Depth 값을 읽을 수 있다. 전달받은 Custom Depth를 바로 화면에 그려보자.

 

Depth는 레벨에서의 거리를 나타내기 때문에 적절한 값으로 나눠서 0~1 정도의 값을 가질 수 있도록 보정한다.

 

이렇게 보면 Custom Depth를 설정한 오브젝트만 화면에 그려지고, 배경은 하얀색으로 칠해지는것을 볼 수 있는데, 이건 기본적으로 Custom Depth가 없는 pixel의 Custom Depth는 +invinite 값으로 전달되기 때문이다.

 

전부 0보다 큰 값이라는것을 알 수 있다.

 

벽 뒤에있을 때는 실루엣으로 보이다가 시야에 들어오면 원래대로 보이게 만들어야하는데 이렇게 다른건 아무것도 안보이고 이 오브젝트만 보이면 게임을 만들 수가 없다. 평범한 화면과 섞어보자.

 

결과물을 섞어서 화면에 그릴 수 있다.

 

이제 다른 오브젝트들도 화면에 보여서 괜찮은데 주인공인 이 오브젝트가 벽에 가려져있는 부분도, 벽에 가려지지 않은 부분도 전부 하이라이트 색상으로 보이고있다. 지금은 그냥 두 결과물을 더하기해서 나온 결과이기 때문에 가려지지 않은 부분도 Custom Depth를 가지고있어서 실루엣으로 그려진다.

모든 pixel은 Scene Depth, Custom Depth를 가지고 있다고 했다. 그리고 Custom Depth는 따로 설정하지않으면 +infinite 값을 가진다. 우리 큐브를 기준으로 Scene Depth와 Custom Depth는 아래 그림처럼 계산된다.

 

벽에 가려지는 부분은 값을 가질 뿐 아니라, Scene Depth보다 큰 값을 가진다.

 

실루엣으로 보일 Color와 Post Process Input을 Lerp로 조합하여 그리고있기 때문에 결국 벽에 가려지는 부분의 픽셀은 1, 나머지 부분은 0이 되도록(반대로 나오게 해도 상관은 없다. 핵심은 벽에 가려진 부분만 식별할 수 있도록 하는 것이다.) 계산식을 만들어서 Lerp의 Alpha 입력으로 넣으면 원하는 결과를 볼 수 있을것이다.

눈에 보이는 부분은 비교적 쉽게 계산할 수 있다. 눈에 보인다는 것은 Scene Depth와 Custom Depth가 같은 값이라는 뜻이기 때문에 두 값을 빼면 자연스럽게 0이 나오고, Lerp의 입력으로 0이 들어가서 Input으로 화면을 그린다.

하지만 Custom Depth가 없는 pixel도 Custom Depth는 +infinite 값을 가지기 때문에 단순히 빼기만 하면 배경도 0보다 큰 값이 돼서 Lerp의 입력으로 1이 들어가게 된다. 0부터 어느정도 크기까지는 1로, +infinite는 0으로 만들 수 있는 계산이 필요하다.

 

ceil은 소수점을 올림연산 한다.  빨간색 연산결과와 파란색 연산결과를 곱해서 Lerp의 Alpha로 입력한다.

 

아직 한가지 마음에 안드는게 있는데, 오버워치의 힐러들은 벽 뒤에있는 자기 팀원들을 노란색 실루엣으로 볼 수 있다. 우리는 빨간색 한 가지만 사용하고있기 때문에 상황에 따라 실루엣의 색을 다르게 보여줄 수 있는 기능을 넣어보자.

Stencil Value라는 값을 사용해보자. 이 값은 Custom Depth와 함께 주로 사용하며, Post Process를 할 때 식별자로서 사용할 수 있다. 기본 설정은 Custom Stencil Value를 사용하지 않도록 되어있기 때문에 project setting에 들어가서 Custom Depth-Stencil Pass를 Enabled with Stencil로 설정해주어야 한다.

Stencil Value를 체크해서 1이면 빨간색, 2면 노란색으로 그릴 수 있게 하자.

 

좀 더 깔끔한 방법을 찾고싶었는데 switch도 없고 if node는 입력을 3개나 강제로 받아서 현재로써는 이게 가장 좋은 방법인것 같다.

 

이로써 궁극기를 쓴 위도우 메이커의 시야도, 힐러들의 시야도 구현해보았다. Post Process는 연산비용이 크기 때문에 사용하기에 겁이났는데 결국 3D 게임을 만드려면 비주얼적인면을 떠나서 여러 기능을 구현하기 위해 필수항목인것 같다. 다양한 시각효과를 만들어보면서 익숙해져야겠다.

'Programming > UnrealEngine' 카테고리의 다른 글

UE4 Beginner | Save/Load  (0) 2020.09.24
UE4 Beginner | Masking Material  (0) 2020.09.04
UE4 Beginner | Level  (0) 2020.08.06
Z-Depth Fog 만들기  (0) 2020.05.28
UE4 Tip - 렌더링 상태 보기  (0) 2018.08.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함