Custom Depth Pass

- Custom Stencil을 사용하지 않는 Actor들에 대해, Depth를 비교해 해당 Actor보다 하이라이트할 대상이 더 뒤에 있으면 Stencil 값을 체크해 Actor 표면에 그려서 Highlight 효과를 부여하는 방식으로 적용
이미 Stencil 값을 가진 다른 Object에 가려진 경우라면…?
- 같은 Render Target를 사용하므로 Draw 순서대로 Stencil 값이 덮어씌워져 버린다
- BitMask를 사용
Foliage 제외
- 표면에 하이라이트할 장애물 카테고리 중에서 Foliage는 제외하기로 결정
- Custom Depth Pass에 렌더하도록 토글을 On하는 방법
- 동일한 Custom Depth Pass에 렌더하니 Foliage를 하이라이트 대상보다 나중에 그리면서 덮어씌울 것으로 기대
- 하지만 모든 Foliage StaticMesh 객체에 이 옵션을 켜는 것은 번거롭다
2. 하이라이트 Material BP에서 Shading Nodel ID를 확인하고 하이라이트할지 말지 결정하는 로직을 추가
- Shading Mpoel은 Enum이고, 이 중 Two Sided Folaige(6)이면 하이라이트 하지 않도록 추가
아군 플레이어 하이라이트 조건
- 아군 캐릭터가 내가 로컬로 조종하는 플레이어에 가려지면 하이라이트 되어야 했다
- 단, 둘 사이에 장애물이 있는 경우에만
-
카메라 |
내 캐릭터 |
장애물 |
아군 캐릭터 -> 하이라이트 처리 |
-
카메라 |
내 캐릭터 |
아군 캐릭터 -> 하이라이트 처리 안 함 |
- 이 케이스를 위해 별도의 로직 처리가 없으면 단순히 내 캐릭터가 아군 캐릭터를 가릴 때도 하이라이트 되는 현상이 발생했다
- 그래서 카메라 위치를 기준으로, 아군 캐릭터들을 향해 Ray를 쏴서 장애물이 있는지 없는지 검사해 하이라이트 여부를 결졍했다
- 매 Tick 하지 않고 일정 Interval을 주었다
아웃라이너 추가
- 기존 아군 캐릭터의 하이라이트 기능을 폐기했다
- 대형 몬스터에 아군 캐릭터가 가려지는 등 특정 상황에 아웃라이너가 보이는 기능을 추가해야 했다
문제 상황
- 몬스터 등 장애물로 판정될 대상들이 이미 Custom Depth & Stencil을 사용하는 경우가 있다
- Stencil로 겹침 여부는 알수 있어도, 어느 것이 앞에 있는지는 판단이 불가했다
솔루션
- 추가 커스텀 뎁스 버퍼 사용
- GBuffer에 마스크값 기록
- 캐릭터 Material에서 GBuffer를 기록하는 MP 중 남는 채널을 활용해 PC/Monster를 구분하여 값을 기록
- PP Material에서 이 값 기반으로 누가 앞에 있는지 판단 가능
- PC의 CustomDepth 여부 판단
- PC의 CustomDepth의 값이 있다면, 무언가가 가리고 있다는 의미
2. G Buffer의 값 확인
- 몬스터의 값이라면, 몬스터에 가려진 것
3. 위 두 조건이 만족할 시, 아웃라이너 로직 실행
G Buffer란?
- 렌더링 엔진이 디퍼드 렌더링 시 사용하는, 픽셀 단위로 필요한 정보를 저장하는 버퍼
- 위치, 색상, 밝기, 그림자 등 정보 저장
- Geometry Pass에서 여러 정보를 각 렌더 타겟에 저장
- 표면 정보 텍스처 세트’가 바로 G-Buffer
- 이렇게 저장한 정보로 Lighting Pass에서 광원 계산 수행
- 즉, 표면 재질을 구성하는 정보 버퍼
출처