HLOD

대규모 3D 게임에서는 단순히 Mesh의 Polygon 수만 줄인다고 렌더링 문제가 해결되지 않는다.

오픈월드처럼 하나의 Scene에 수천, 수만 개의 Object가 존재하는 환경에서는 또 다른 문제가 발생한다.

많은 Object -> 많은 Renderer -> 많은 Draw Call 및 CPU 관리 비용

이때 사용하는 대표적인 기술이 HLOD(Hierarchical Level of Detail)다.

HLOD의 핵심은 단순하다.

여러 개의 Object를 하나의 저해상도 Representation으로 묶어서 처리하는 것이다.

일반적인 LOD가 하나의 Object를 대상으로 한다면 HLOD는 여러 Object를 대상으로 한다.

LOD -> 하나의 Object의 Detail 감소

HLOD -> 여러 Object를 하나의 그룹으로 묶고 Detail 감소

LOD의 한계

일반적인 LOD는 카메라에서 멀어질수록 하나의 Object가 사용하는 Mesh를 단순화한다.

예를 들어 나무 하나가 있다면

Tree -> LOD 0 -> LOD 1 -> LOD 2

처럼 구성한다.

카메라가 가까울 때는 고해상도 Mesh를 사용하고, 멀어질수록 Polygon 수가 적은 Mesh를 사용한다.

Unity의 LOD 역시 카메라와의 거리가 증가할수록 렌더링하는 Triangle 수를 줄이는 방식이다.

그런데 Object가 매우 많아지면 문제가 달라진다.

예를 들어 도시 하나에 건물이 1,000개 있다고 하자.

각 건물에 LOD를 적용하면

Building 1 -> LOD

Building 2 -> LOD

Building 3 -> LOD

...

Building 1000 -> LOD

가 된다.

각각의 Mesh가 저해상도가 되더라도 1,000개의 Object 자체가 존재한다는 사실은 변하지 않는다.

즉,

Triangle 감소 != Object 개수 감소

다.

여기서 HLOD가 등장한다.

HLOD란

HLOD는 Hierarchical Level of Detail의 약자다.

말 그대로 LOD를 계층적으로 적용한다.

가까운 거리에서는 Object를 개별적으로 관리하지만, 멀어지면 여러 Object를 하나의 그룹으로 묶어 더 단순한 Representation으로 대체한다.

예를 들어 도시가 있다면

Building A / Building B / Building C / Building D

를 가까운 거리에서는 각각 렌더링한다.

하지만 멀어지면

Building A + B + C + D -> HLOD

처럼 하나의 단순한 Representation으로 바꿀 수 있다.

핵심은 Geometry의 단순화와 Object의 그룹화가 동시에 일어날 수 있다는 것이다.

일반 LOD와 HLOD

둘의 차이를 가장 간단하게 표현하면 다음과 같다.

LOD -> Object 하나를 단순화

HLOD -> Object 여러 개를 그룹화 + 단순화

예를 들어 나무 한 그루는 일반 LOD의 대상이다.

Tree -> High Poly -> Low Poly

반면 숲 전체는 HLOD의 대상이 될 수 있다.

Tree 1 + Tree 2 + Tree 3 + ... -> HLOD Group

따라서 HLOD는 LOD의 상위 개념이라기보다는 여러 Object를 계층적으로 묶어 LOD를 적용하는 방식이라고 이해하는 편이 정확하다.

왜 Object를 묶는가

GPU Rendering 비용은 단순히 Triangle 수만으로 결정되지 않는다.

Scene에 Object가 많아지면 Renderer와 관련된 CPU 측 관리 비용, Culling 처리, Draw Call 등의 비용도 커질 수 있다.

예를 들어

1000 Objects -> 각각 Rendering

1000 Objects -> 하나의 HLOD Representation

은 같은 Geometry 양을 렌더링하더라도 처리 구조가 다르다.

HLOD는 먼 거리에서 개별 Object를 계속 유지하는 대신 여러 Object를 하나의 단순한 Representation으로 대체하여 관리해야 할 Object와 Rendering 작업을 줄이는 방향으로 동작한다.

따라서 HLOD의 목적은 단순한 Polygon 감소가 아니다.

Object 수 감소 -> Rendering 관리 비용 감소

까지 노린다.

HLOD의 기본 구조

HLOD는 보통 공간을 일정한 영역으로 나누고 해당 영역에 포함된 Object를 하나의 그룹으로 만든다.

예를 들어 거대한 월드가 있다고 하자.

World -> Region A / Region B / Region C / Region D

그리고 Region A 안에 여러 건물이 존재한다.

Region A -> Building A / Building B / Building C / Building D

가까이에서는 각각의 건물을 렌더링한다.

하지만 멀어지면

Building A + B + C + D -> HLOD Region A

로 대체한다.

더 멀리 있는 경우에는 더 큰 영역을 다시 하나로 묶을 수도 있다.

HLOD Region A / B / C / D -> Higher HLOD

이렇게 계층을 만들 수 있다.

HLOD의 계층 구조

이것이 HLOD의 이름에 Hierarchical이 들어가는 이유다.

개념적으로

개별 Object -> 지역 HLOD -> 상위 지역 HLOD -> 월드 HLOD

처럼 여러 단계의 Representation을 구성할 수 있다.

가까운 곳에서는 높은 Detail을 유지하고 멀어질수록 더 큰 단위로 묶는다.

카메라 가까움 -> 개별 Object

카메라 중간 -> 작은 그룹 HLOD

카메라 멂 -> 큰 그룹 HLOD

카메라 매우 멂 -> 매우 단순한 HLOD

결과적으로 카메라와의 거리에 따라 Geometry Detail뿐만 아니라 Scene의 공간적 표현 단위 자체가 바뀐다.

LOD와 HLOD의 차이

둘을 비교하면 명확하다.

구분LODHLOD
대상하나의 Object여러 Object
핵심Geometry 단순화Object 그룹화 + Geometry 단순화
목적Triangle 감소Triangle + Object/Rendering 관리 비용 감소
사용 환경일반적인 3D Object대규모 Scene
대표적인 활용캐릭터, 나무, 차량도시, 건물, 오픈월드

따라서

LOD -> Mesh 최적화

HLOD -> Scene 단위 최적화

라고 이해하면 쉽다.

Culling과도 다르다

HLOD를 Culling과 혼동하면 안 된다.

Culling은 보이지 않는 Object를 렌더링하지 않는 것이다.

시야 밖 -> Culling -> Rendering하지 않음

HLOD는 보이지만 너무 멀리 있는 여러 Object를 단순한 Representation으로 대체하는 것이다.

멀리 있음 -> HLOD -> 단순한 Representation Rendering

따라서 둘은 서로 다른 문제를 해결한다.

Culling -> 렌더링 대상 제거

LOD -> Geometry 복잡도 감소

HLOD -> 여러 Object를 그룹화 + Geometry 복잡도 감소

실제 대규모 Scene에서는 이 기술들을 함께 사용할 수 있다.

Scene Object -> Culling -> 보이는 Object -> 거리 판단 -> LOD / HLOD -> Rendering

Mesh LOD와 HLOD

앞서 살펴본 Mesh LOD와 HLOD도 구분해야 한다.

Mesh LOD는 하나의 Mesh를 어떻게 효율적으로 여러 Detail 단계로 표현할 것인가에 초점을 둔다.

Mesh -> LOD 0 / LOD 1 / LOD 2

반면 HLOD는 여러 Object를 어떻게 묶어서 하나의 Detail 단계로 표현할 것인가에 초점을 둔다.

Object A + Object B + Object C -> HLOD

따라서 둘은 경쟁 관계가 아니다.

오히려 같이 사용할 수 있다.

여러 Object -> HLOD Group -> 그룹 단위 LOD

이런 식으로 구성할 수 있다.

오픈월드에서 중요한 이유

HLOD가 특히 중요한 분야가 오픈월드다.

오픈월드는 한 Scene에 엄청난 양의 Object가 존재한다.

건물, 나무, 바위, 가로등, 차량, 장식물 등 수많은 Object가 동시에 존재한다.

플레이어 근처의 Object는 세밀하게 표현해야 한다.

하지만 플레이어에게서 수백 미터 떨어진 도시 전체를 각각의 고해상도 Object로 유지할 필요는 없다.

따라서

플레이어 근처 -> 개별 Object + LOD

플레이어 중거리 -> 저해상도 Object

플레이어 원거리 -> HLOD Group

시야 밖 -> Culling

처럼 단계적으로 최적화할 수 있다.

HLOD의 본질

HLOD를 단순히 “여러 Mesh를 합치는 기술”이라고 이해하면 부족하다.

핵심은 거리와 화면상 중요도에 따라 Scene을 표현하는 단위를 바꾸는 것이다.

가까이 있을 때는

Building A / Building B / Building C

를 각각 관리한다.

멀어지면

Building A + B + C -> HLOD

로 바꾼다.

더 멀어지면

Region A + Region B -> Higher HLOD

처럼 더 큰 단위로 표현할 수도 있다.

결국

가까움 -> 개별 Object -> 높은 Detail

중간 -> 그룹 단위 -> 낮은 Detail

멀리 있음 -> 상위 그룹 -> 매우 낮은 Detail

이라는 계층적인 최적화가 만들어진다.

정리

LOD의 핵심은 하나의 Object를 멀리서 단순하게 표현하는 것이다.

HLOD의 핵심은 여러 Object를 멀리서 하나의 단순한 Representation으로 묶어 표현하는 것이다.

따라서 게임 그래픽스 최적화를 하나의 흐름으로 보면 다음과 같이 정리할 수 있다.

Culling -> 보이지 않는 Object 제거

LOD -> 보이는 Object의 Geometry 감소

HLOD -> 여러 Object를 그룹화하고 저해상도 Representation으로 대체

이 세 가지는 서로 대체하는 기술이 아니다.

Scene이 커질수록 문제의 단위가 Mesh에서 Object로, Object에서 Region으로 올라가며 최적화 방식도 함께 변한다.

HLOD는 바로 그 Scene 규모의 문제를 해결하기 위한 LOD라고 볼 수 있다.