[UE5/C++/Shader] 언리얼 콘텐츠 예제 속 물 상호작용 최적화 및 캐릭터 위치와 동기화

Tony Kim·2023년 6월 24일
0

언리얼로 개발하기

목록 보기
1/16
post-thumbnail

개요

에픽 게임즈 런처(Epic Games Launcher)의 샘플 메뉴엔 무료로 다운로드 가능한 콘텐츠 예제 프로젝트가 있습니다.

프로젝트 안에는 여러 예제 머테리얼, BP 등이 있는데 그 중 랜더 타겟과 관련된 BP 중 마우스 포인터나 캐릭터와 상호 작용하여 런타임에 잔물결을 만드는 WaterSurface_BP가 있습니다.

이 예제를 이용해 캐릭터가 지나가면 물결이 치는 호수 환경을 만들고자 했습니다.



문제 상황

이 예제를 사용해 캐릭터가 지나가면 물결이 치는 호수 환경을 만들고 싶었는데 맞닥뜨린 몇 가지 문제점이 있었습니다.

1. 랜더 타겟 텍스쳐를 3개나 사용한다.

랜더 타겟 텍스쳐를 3장 사용하고 각 텍스쳐의 R채널만 사용합니다. 저는 랜더 타겟을 최대한 적게 사용하고 낭비되는 채널이 없길 바랬습니다.

2. 캐릭터 위치를 Plane 메시의 로컬 UV 좌표계로 전환하여 잔물결을 출력한다.

이럴 경우 Plane 메시가 정사각형이 아닌 경우 잔물결이 원형이 아닌 타원형으로 출력될 수도 있고 Plane 메시의 크기에 따라서 잔물결 크기가 달라질 수도 있습니다. 저는 어떤 조건에서도 캐릭터 주위로 동일한 모양의 잔물결이 출력되기를 원했습니다.

3. 메시와 함께 사용하는 블루프린트다.

단순히 지역별로 레벨에 배치하는 블루프린트 액터가 아닌 월드 전역적으로 쓸 수 있는 월드 서브 시스템으로 사용하길 원했습니다.




해결 방법

1. 랜더 타겟 텍스쳐 하나의 RGB 채널 사용.

예제 기능은 일정 시간 간격마다 랜더 타겟 텍스쳐에 다음 프레임의 잔물결 모양을 그립니다. 이 때, 이전, 그리고 그 이전에 그려둔 2장의 랜더 타겟 텍스쳐에 있는 잔물결 모양을 반영하여 새로운 잔물결을 그려냅니다. 때문에, 3장의 랜더 타겟 텍스쳐를 사용했습니다.
저는 이를 하나의 랜더 타겟 텍스쳐로 통합하되 RGB 채널을 모두 사용하는 방식으로 바꾸었습니다. 세 채널 중 어떤 채널에 다음 프레임을 그려할 지 정할 수 있도록 매 시간 간격마다 0, 1, 2의 값을 순서대로 반복하며 갖는 변수를 생성하여 해당 변수를 참고하여 채널이 선택되도록 구현하였습니다.

2. 캐릭터 위치를 따라 랜더 타겟이 출력되도록 구현.

캐릭터의 위치 좌표를 물 메시의 UV 좌표계로 변환해 잔물결의 위치를 지정하던 이전 방식(왼쪽)을 벗어나 물 메시의 UV 좌표계와 상관없이 랜더 타겟 텍스쳐에 그려지는 잔물결이 항상 캐릭터의 월드 상의 위치를 따라서 출력되도록 변환(오른쪽)하였습니다.

이를 위해 아래 몇 가지 과정들이 필요했습니다.

  1. 물 머테리얼
    우선, 물 머테리얼 상에서 랜더 타겟 텍스쳐에 랜더된 잔물결이 캐릭터 위치를 따라 캐릭터 반경 일정 범위 내에 출력되도록 설정하였습니다.
  1. 랜더 타겟 텍스쳐와 UV
    기존엔 캐릭터 위치를 메시의 UV 좌표계로 변환해서 랜더 타겟 텍스쳐 상 해당 UV 좌표에 잔물결을 출력했다면 이젠 랜더 타겟 텍스쳐의 정가운데(UV 좌표: 0.5,0.5)에 잔물결을 그리고 랜더 타겟 텍스쳐 자체의 UV를 캐릭터 움직임 크기만큼 캐릭터 움직임 방향과 반대로 움직여 줍니다.

3. 월드 서브 시스템 구축

월드 서브 시스템과 커스텀 트리거 볼륨을 제작하여 트리거 볼륨 진입 시 틱마다 랜더 타겟 텍스쳐에 잔물결을 그리고 볼륨을 나가면 랜더 타겟 텍스쳐를 초기화하고 틱이 중지되도록 구현하였습니다.

profile
게임 테크니컬 아티스트

0개의 댓글