하이트맵은 높이 정보를 저장하는 텍스쳐입니다. 근데 이 녀석이 참 요긴하게 쓰입니다. 특히 랜드스케이프 하이트맵은 배경의 다양한 표현을 저비용으로 할 수 있도록 도와줍니다. 바로 플로우맵으로 변환해서 사용하는 방법입니다.
언리얼 엔진에서 랜드스케이프 하이트맵을 추출하는 법은 간단합니다.
랜드스케이프 하이트맵은 그 자체로도 사용처가 많지만 플로우맵으로 변환할 시 더욱 더 흥미로운 효과들을 만드는 데에 사용할 수 있습니다. 예를 들면,
이런 표현들은 모두 방향성(벡터) 정보가 필요합니다. 때문에 지면의 높이 정보를 바탕으로 벡터 정보를 추출한 플로우맵을 제작하여 구현할 수 있습니다.
하이트맵을 월드 스페이스 노말맵으로 변환하면 플로우맵으로 사용할 수 있습니다. 노말(법선)은 표면에 수직인 방향을 나타내는 벡터고 노말의 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에 랜드스케이프 크기에 맞게 플로우맵(즉, 하이트맵)을 투영하여 사용해도 좋습니다. 예를 들면, 물 머테리얼에서 포말이 랜드스케이프 지면을 향하도록 구현할 수 있습니다.