에픽 게임즈 런처(Epic Games Launcher)의 샘플 메뉴엔 무료로 다운로드 가능한 콘텐츠 예제 프로젝트가 있습니다.
프로젝트 안에는 여러 예제 머테리얼, BP 등이 있는데 그 중 랜더 타겟과 관련된 BP 중 마우스 포인터나 캐릭터와 상호 작용하여 런타임에 잔물결을 만드는 WaterSurface_BP가 있습니다.
이 예제를 이용해 캐릭터가 지나가면 물결이 치는 호수 환경을 만들고자 했습니다.
이 예제를 사용해 캐릭터가 지나가면 물결이 치는 호수 환경을 만들고 싶었는데 맞닥뜨린 몇 가지 문제점이 있었습니다.
랜더 타겟 텍스쳐를 3장 사용하고 각 텍스쳐의 R채널만 사용합니다. 저는 랜더 타겟을 최대한 적게 사용하고 낭비되는 채널이 없길 바랬습니다.
이럴 경우 Plane 메시가 정사각형이 아닌 경우 잔물결이 원형이 아닌 타원형으로 출력될 수도 있고 Plane 메시의 크기에 따라서 잔물결 크기가 달라질 수도 있습니다. 저는 어떤 조건에서도 캐릭터 주위로 동일한 모양의 잔물결이 출력되기를 원했습니다.
단순히 지역별로 레벨에 배치하는 블루프린트 액터가 아닌 월드 전역적으로 쓸 수 있는 월드 서브 시스템으로 사용하길 원했습니다.
예제 기능은 일정 시간 간격마다 랜더 타겟 텍스쳐에 다음 프레임의 잔물결 모양을 그립니다. 이 때, 이전, 그리고 그 이전에 그려둔 2장의 랜더 타겟 텍스쳐에 있는 잔물결 모양을 반영하여 새로운 잔물결을 그려냅니다. 때문에, 3장의 랜더 타겟 텍스쳐를 사용했습니다.
저는 이를 하나의 랜더 타겟 텍스쳐로 통합하되 RGB 채널을 모두 사용하는 방식으로 바꾸었습니다. 세 채널 중 어떤 채널에 다음 프레임을 그려할 지 정할 수 있도록 매 시간 간격마다 0, 1, 2의 값을 순서대로 반복하며 갖는 변수를 생성하여 해당 변수를 참고하여 채널이 선택되도록 구현하였습니다.
캐릭터의 위치 좌표를 물 메시의 UV 좌표계로 변환해 잔물결의 위치를 지정하던 이전 방식(왼쪽)을 벗어나 물 메시의 UV 좌표계와 상관없이 랜더 타겟 텍스쳐에 그려지는 잔물결이 항상 캐릭터의 월드 상의 위치를 따라서 출력되도록 변환(오른쪽)하였습니다.
이를 위해 아래 몇 가지 과정들이 필요했습니다.
월드 서브 시스템과 커스텀 트리거 볼륨을 제작하여 트리거 볼륨 진입 시 틱마다 랜더 타겟 텍스쳐에 잔물결을 그리고 볼륨을 나가면 랜더 타겟 텍스쳐를 초기화하고 틱이 중지되도록 구현하였습니다.