티스토리 뷰
위도우 메이커는 궁극기를 쓰면 벽 뒤에있는 적들의 실루엣을 볼 수 있다. 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를 바로 화면에 그려보자.
이렇게 보면 Custom Depth를 설정한 오브젝트만 화면에 그려지고, 배경은 하얀색으로 칠해지는것을 볼 수 있는데, 이건 기본적으로 Custom Depth가 없는 pixel의 Custom Depth는 +invinite 값으로 전달되기 때문이다.
벽 뒤에있을 때는 실루엣으로 보이다가 시야에 들어오면 원래대로 보이게 만들어야하는데 이렇게 다른건 아무것도 안보이고 이 오브젝트만 보이면 게임을 만들 수가 없다. 평범한 화면과 섞어보자.
이제 다른 오브젝트들도 화면에 보여서 괜찮은데 주인공인 이 오브젝트가 벽에 가려져있는 부분도, 벽에 가려지지 않은 부분도 전부 하이라이트 색상으로 보이고있다. 지금은 그냥 두 결과물을 더하기해서 나온 결과이기 때문에 가려지지 않은 부분도 Custom Depth를 가지고있어서 실루엣으로 그려진다.
모든 pixel은 Scene Depth, Custom Depth를 가지고 있다고 했다. 그리고 Custom Depth는 따로 설정하지않으면 +infinite 값을 가진다. 우리 큐브를 기준으로 Scene Depth와 Custom 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으로 만들 수 있는 계산이 필요하다.
아직 한가지 마음에 안드는게 있는데, 오버워치의 힐러들은 벽 뒤에있는 자기 팀원들을 노란색 실루엣으로 볼 수 있다. 우리는 빨간색 한 가지만 사용하고있기 때문에 상황에 따라 실루엣의 색을 다르게 보여줄 수 있는 기능을 넣어보자.
Stencil Value라는 값을 사용해보자. 이 값은 Custom Depth와 함께 주로 사용하며, Post Process를 할 때 식별자로서 사용할 수 있다. 기본 설정은 Custom Stencil Value를 사용하지 않도록 되어있기 때문에 project setting에 들어가서 Custom Depth-Stencil Pass를 Enabled with Stencil로 설정해주어야 한다.
Stencil Value를 체크해서 1이면 빨간색, 2면 노란색으로 그릴 수 있게 하자.
이로써 궁극기를 쓴 위도우 메이커의 시야도, 힐러들의 시야도 구현해보았다. 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
- Git
- winsock
- 국내여행
- Java
- ios
- JSP
- swift
- rxswift
- machine learing
- 자료구조
- C
- 운영체제
- C++
- SHADER
- SwiftUI
- ue4
- 알고리즘
- Cocos2d-x
- mongoDB
- scala
- 수학
- SOCKET
- C/C++
- database
- DesignPattern
- OS
- game
- 데이터베이스
- 드라마
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |