[UE5/Shader] 랜드스케이프 하이트맵을 플로우맵으로 활용하기

Tony Kim·2023년 10월 9일
0

언리얼로 개발하기

목록 보기
13/16
post-thumbnail

들어가기

하이트맵은 높이 정보를 저장하는 텍스쳐입니다. 근데 이 녀석이 참 요긴하게 쓰입니다. 특히 랜드스케이프 하이트맵은 배경의 다양한 표현을 저비용으로 할 수 있도록 도와줍니다. 바로 플로우맵으로 변환해서 사용하는 방법입니다.

랜드스케이프 하이트맵 추출하기

언리얼 엔진에서 랜드스케이프 하이트맵을 추출하는 법은 간단합니다.

  1. 랜드스케이프 모드로 들어갑니다.
  2. Manage → Import로 들어간 뒤 Export를 선택하고 '...'을 클릭한 후 하이트맵 저장 위치와 이름을 입력합니다.
  3. 랜드스케이프 전체를 한 장의 텍스쳐에 저장 하고자 한다면 Export Single File을 체크합니다. 비활성화 시 랜드스케이프 컴포넌트 단위로 하이트맵을 나눠 추출합니다.
    모두 완료되었다면 하단 Export를 클릭하여 하이트맵을 저장합니다.
    (랜드스케이프 1Quad 당 1픽셀의 하이트맵이 저장됩니다. 랜드스케이프는 Quad < Section < Component < Landscape 단위로 구성되어 있습니다.)




랜드스케이프 하이트맵을 플로우맵으로

개요

랜드스케이프 하이트맵은 그 자체로도 사용처가 많지만 플로우맵으로 변환할 시 더욱 더 흥미로운 효과들을 만드는 데에 사용할 수 있습니다. 예를 들면,

  • 지면을 따라 퍼지는 안개 그리기
  • 빗물이 위에서 아래로 흐르는 표현하기
  • 파도의 포말이 해안선으로 향하도록 애니메이팅 하기

이런 표현들은 모두 방향성(벡터) 정보가 필요합니다. 때문에 지면의 높이 정보를 바탕으로 벡터 정보를 추출한 플로우맵을 제작하여 구현할 수 있습니다.

하이트맵을 노말맵으로, 그리고 플로우맵으로 변환하기

하이트맵을 월드 스페이스 노말맵으로 변환하면 플로우맵으로 사용할 수 있습니다. 노말(법선)은 표면에 수직인 방향을 나타내는 벡터고 노말의 X, Y값은 대체로 플로우맵이 나타내기를 기대하는 X, Y값과 일치하며 Z값은 표면 기울기에 따른 플로우의 크기에 반비례합니다. (X, Y값은 전체적인 플로우 크기를 결정, Z값은 기울기에 따른 플로우의 크기를 결정)

※ 랜드스케이프가 Z축에 수직인 Plane임을 가정한 상태에서 추출한 하이트맵이기 때문에 월드 스페이스 노말맵이나 탄젠트 스페이스 노말맵이나 사실 상관은 없습니다. 랜드스케이프을 통채로 임의로 기울이지만 않았다면 말이죠!

노멀을 계산하기 위해서는 편미분 식이 필요한데, (x, y)에 인접한 네 개의 좌표

{(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)}

의 높이 값을 이용해 계산합니다. 언리얼 엔진의 NormalFromHeightmap 머테리얼 함수가 지정한 오프셋값(디폴트는 0.005)만큼 하이트맵의 UV를 이동시켜 X, Y값의 변화량을 바탕으로 노말을 추출해줍니다. 추출한 노말맵의 X, Y, Z값을 바탕으로 플로우맵을 추출하면 아래와 같습니다.

제작한 플로우맵 활용하기

플로우맵으로 텍스쳐 UV를 애니메이팅하여 재밌는 효과들을 만들 수 있습니다.
플로우맵을 사용하는 방법은 플로우맵 함수 글을 참고해주세요!

플로우맵을 랜드스케이프에 투영하여 텍스쳐 UV를 애니메이팅하면 아래와 같이 랜드스케이프 모양에 따라 무언가 흐르는 효과를 만들 수 있습니다!

꼭 랜드스케이프에 사용할 필요는 없고 별도 Plane에 랜드스케이프 크기에 맞게 플로우맵(즉, 하이트맵)을 투영하여 사용해도 좋습니다. 예를 들면, 물 머테리얼에서 포말이 랜드스케이프 지면을 향하도록 구현할 수 있습니다.

profile
게임 테크니컬 아티스트

0개의 댓글