[UE5] Assassin12 - Draw OutLine

윤정민·2023년 5월 28일
0

[Unreal Project]Assassin

목록 보기
13/26

1. 개요

참고하고있는 Assassin's Creed를 보면 암살할 적을 보여주기위해 암살타겟 적에게 외곽선을 그려준다. 최근 게임에서는 자료를 찾기 힘들어 어크2를 가져왔는데 어크2에서는 전체 머티리얼의 외각 부분을 밝은색으로 설정해준것 같다. 아마 비용생각을 해서 이렇게 구현한것 같다. 우리는 Unreal의 Postprocessing을 사용해 Custom Depth으로 표현해주자.

2. 외곽선을 그리는 원리

해당 방법은 메쉬를 두 번 렌더링 하는 방법이다. 원래 출력되는걸로 화면에 출력하는 것 한번, 그 후 포스트 프로세스로 외곽선을 출력하는 것 한번 총 두번이다.

2.1. Pixel Depth

  • Pixel Depth: 현재 렌더링되고 있는 픽셀의 깊이 또는 카메라에서의 거리를 출력하는 표현식

  • 픽셀 자기 자신의 Depth 값

    • 메쉬 바깥 픽셀: 매우큼
    • 메쉬 테두리 픽셀: 작음
    • 메쉬 안쪽 픽셀: 작음
  • 자기 자신을 둘러싼 픽셀의 Depth의 합

    • 메쉬 바깥 픽셀: 매우큼
    • 메쉬 테두리 픽셀: 매우 큼
    • 메쉬 안쪽 픽셀: 작음
  • 위의 Depth을 이용해 픽셀의 외곽 여부를 구할 수 있음

2.2 테두리 픽셀 구하기

  • 메쉬 바깥 픽셀: 0, 메쉬 테두리 픽셀: 1, 메쉬 내부 픽셀: 1 로 정규화

  • 메쉬 바깥 픽셀: 1, 메쉬 테두리 픽셀: 1, 메쉬 내부 픽셀: 0 로 정규화

    • 상하좌우, 대각선 4개의 Custom Depth을 구해 합을 구하면 됨
  • 두 결과를 곱하여 메쉬 테두리 픽셀을 구함

    • 메쉬 바깥 픽셀: 0, 메쉬 테두리 픽셀: 1, 메쉬 내부 픽셀: 0
  • 해당 결과를 postprocess로 출력하기 위해 Lerp

2.3. Custom Depth을 사용하지 않는 액터 뚫는 오류 수정

  • 벽 뒤에 가려진 픽셀을 0이 되로록 코드를 짠 뒤 해당값을 곱함

3. 가까히 있는 액터를 검출

3.1. 플레이어 전방에 Trace 생성

  • 플레이어의 바로앞에 Controller Rotation을 따라가도록 Trace를 생성해주자

3.2. 가장 가까운 적을 검출

  • 검출된 Actors 중 Player 사이에 아무것도 없는 액터를 구함
  • 구한 액터의 Player 사이 거리를 구해 가장 가까운 적을 구함
  • 해당 적을 TargetCharacter라는 변수에 저장

3.3. 해당 적의 Custom Depth을 활성화

  • 프로젝트에 사용하는 Skeletal Mesh가 많아 해당 Mesh를 배열로 저장해 모든 Skeletal Mesh를 활성화
  • 만약 다른 액터가 TargetCharacter가 되었다면 이전 TargetCharacter의 Custom Depth을 비활성화

4. 느낀점

내가 생각한 방법은 대학 멀티미디어 시간에 배운 방법을 사용하려 했다. 마스크의 픽셀 값을 사용하여 픽셀 값이 급격히 변화하는 부분을 에지로 검출하는 기능이다. 하지만 이 방법을 사용하면 색이 다른 부분 모두 에지로 검출될것이다. 액터의 외곽만이아니라 카툰처럼 내부도 모두 에지로 검출되니 해당 방법은 지금상황에 맞지 않은 방법이었다. 저학년때 수강한 과목이라 하나를 배우면 하나만 알고 지나갔는데, 수강할 당시에 에지를 찾는 다양한 방법을 찾아봤으면 좋았을 것 같다. 항상 배우고 관련된 내용을 찾아보는 습관을 들여야겠다.

profile
그냥 하자

0개의 댓글