사전 LOD
개념

LOD

gabury1고친 사람 github-actions[bot]

LOD 는 멀리 있는 물체일수록 더 단순한 모형으로 바꿔 그립니다. 멀리 있는 물체는 화면에서 몇 픽셀밖에 차지하지 않습니다. 그 크기에서는 정교한 모형과 단순한 모형이 거의 똑같아 보입니다. 덜어 낸 계산만큼 한 화면을 빨리 그립니다.

쉽고 빠른 이해

LOD 는 물체가 화면에 작게 보일수록 대충 그리는 방법입니다. 언덕 너머의 나무는 잎을 하나하나 만들어 그려도 초록 점 몇 개로 보입니다.

이렇게 하지 않으면 눈에 안 띄는 잎까지 전부 계산하느라 한 화면을 그리는 시간이 길어집니다. 그러면 화면이 끊겨 보입니다.

어떻게 도는가:

  1. 한 물체를 정교한 모형부터 단순한 모형까지 몇 벌 만들어 둡니다
  2. 화면을 그릴 때마다 그 물체가 화면에서 얼마나 크게 보이는지 잽니다
  3. 크게 보이면 정교한 모형을, 작게 보이면 단순한 모형을 골라 그립니다

대가도 있습니다. 모형을 여러 벌 들고 있으니 메모리를 더 씁니다. 모형이 바뀌는 순간 모양이 툭 튀어 보일 수 있습니다.

LOD 는 가까운 것과 아주 먼 것이 한 화면에 섞일 때 잘 듣습니다. 모든 물체가 비슷한 거리에 있으면 얻을 것이 적습니다.

상세

지도를 떠올려 봅니다. 나라 전체를 담은 지도에는 고속도로만 그려져 있습니다. 동네 지도로 넘어가면 그제야 골목길과 건물이 나타납니다. 같은 땅이라도 보는 넓이에 맞춰 그리는 양이 달라집니다.

LOD(Level of Detail, 세부 수준)는 이 생각을 화면 그리기에 옮긴 것입니다. 「레벨 오브 디테일」이라고 소리 나는 대로 부르기도 합니다. 한 물체에 정교함이 다른 모형을 여러 벌 마련해 둡니다. 그리고 그 물체가 화면에 얼마나 크게 보이는지에 따라 한 벌을 골라 그립니다.

나무 한 그루라면 모형을 세 벌 만들어 둘 수 있습니다. 잎과 가지를 하나하나 살린 모형, 가지를 덩어리로 뭉친 모형, 원뿔 몇 개로 줄인 모형입니다. 가까이 서면 첫째를 그리고, 멀어질수록 둘째와 셋째를 그립니다.

이렇게 마련한 모형 한 벌 한 벌을 LOD 단계라고 부릅니다. 흔히 가장 정교한 모형을 0단계로 둡니다. 숫자가 커질수록 단순한 모형입니다.

물체를 그리는 비용

LOD 가 무엇을 아끼는지 보려면 물체를 그리는 데 무엇이 드는지부터 봐야 합니다. 이 소절은 모형의 생김새와 그리는 순서를 짚습니다.

게임 화면의 입체 물체는 작은 삼각형을 수없이 이어 붙여 만듭니다. 이렇게 이어 붙인 모형을 메시라고 합니다. 삼각형의 꼭짓점 하나하나는 정점입니다. 모형이 정교하다는 것은 삼각형과 정점이 많다는 뜻입니다.

GPU(Graphics Processing Unit, 그래픽 처리 장치)는 화면을 그릴 때마다 정점의 위치를 하나씩 계산합니다. 그다음 삼각형마다 화면의 어느 픽셀을 덮는지 찾습니다. 삼각형이 덮는 픽셀을 찾는 이 둘째 과정을 래스터화라고 합니다.

두 과정 모두 삼각형과 정점이 많을수록 늘어납니다. 그래서 한 화면을 그리는 시간도 그리는 삼각형 수를 따라 길어집니다. 이 시간을 프레임 시간이라고 부릅니다. 프레임 시간이 길어지면 1초에 보여 주는 화면 수가 줄고 움직임이 끊겨 보입니다.

멀리 있는 물체에 디테일이 낭비되는 까닭

멀리 있는 물체는 화면에서 작게 보입니다. 거리가 두 배가 되면 화면에 비친 높이는 절반이 됩니다. 넓이로는 4분의 1이므로 덮는 픽셀 수도 그만큼 줄어듭니다.

모형의 삼각형 수는 거리와 상관없이 같습니다. 그래서 물체가 멀어질수록 삼각형 하나가 맡는 픽셀이 줄어듭니다. 끝내는 삼각형 여러 개가 한 픽셀을 두고 겹칩니다.

이때는 삼각형마다 계산을 다 하고도 화면에는 한 점만 남습니다. 계산한 만큼 버리는 셈입니다.

화면에 보이는 모양도 나빠집니다. 픽셀보다 잘게 새긴 무늬는 카메라가 조금만 움직여도 반짝거리며 깨져 보입니다. 픽셀이 모자라 모양이 깨지는 이 현상을 앨리어싱이라고 합니다. 단순한 모형으로 바꾸면 계산도 이 반짝임도 줄어듭니다.

단계를 고르는 기준

단계를 고를 때 흔히 보는 값은 둘입니다. 카메라와 물체 사이의 거리, 그리고 화면에 비친 물체의 크기입니다.

거리만 보면 계산이 가장 쉽습니다. 단계마다 문턱 거리를 정해 둡니다. 물체가 그보다 멀어지면 다음 단계로 넘어갑니다.

거리만으로는 놓치는 경우가 있습니다. 망원경처럼 화면을 확대하면 먼 물체도 크게 보입니다. 큰 건물과 작은 돌멩이는 같은 거리에서도 화면에 비친 크기가 다릅니다.

그래서 화면에 비친 크기를 직접 재는 쪽이 더 정확합니다. 그러려면 먼저 물체의 크기를 숫자 하나로 정해야 합니다. 물체는 생김새가 제각각이니 물체를 통째로 감싸는 구를 하나 씌우고 그 반지름을 씁니다. 이 구를 바운딩 스피어라고 합니다.

다음으로 카메라가 위아래로 한 번에 담는 각도가 필요합니다. 이 각도를 시야각이라고 합니다. 반지름과 거리, 시야각을 알면 물체가 화면 높이에서 차지하는 비율이 나옵니다. 이 비율이 곧 화면에 비친 크기입니다.

거리 d 에서 화면 절반 높이에 담기는 길이는 d·tan(시야각/2)입니다. 반지름을 이 길이와 견주면 비율이 나옵니다. 지름을 화면 전체 높이와 견준 것과 같은 값입니다.

아래 코드는 이 비율을 구합니다. 그리고 비율에 따라 단계를 고릅니다. 문턱값 0.25 · 0.05 · 0.01 은 예로 고른 수입니다.

Python
import math

def screen_size(r, d, fov):
    # 화면 높이에서 물체가 차지하는 비율
    return r / (d * math.tan(fov / 2))

def pick_lod(s):
    if s > 0.25: return 0
    if s > 0.05: return 1
    if s > 0.01: return 2
    return None   # 그리지 않는다

반지름 1 인 물체를 거리만 바꿔 가며 넣어 봅니다. 시야각은 60도로 둡니다. 마지막 줄만 시야각을 10도로 좁혀 화면을 확대했습니다.

Python
fov = math.radians(60)
pick_lod(screen_size(1, 3, fov))    # 0
pick_lod(screen_size(1, 20, fov))   # 1
pick_lod(screen_size(1, 60, fov))   # 2
pick_lod(screen_size(1, 200, fov))  # None

zoom = math.radians(10)
pick_lod(screen_size(1, 60, zoom))  # 1

거리 60 인 두 줄의 답이 갈렸습니다. 확대하자 물체가 화면에서 커져서 1단계가 나왔습니다. 거리만 봤다면 확대한 화면에도 2단계의 거친 모형을 그렸을 겁니다.

단계를 미리 만들어 두는 방식

단계마다 쓸 모형은 대개 화면을 그리기 전에 다 만들어 둡니다. 사람이 손으로 만들기도 합니다. 도구가 원본을 자동으로 줄이기도 합니다. 이렇게 단계가 몇 개로 딱 나뉘는 방식을 이산 LOD라고 합니다.

원본을 자동으로 줄이는 일을 메시 단순화라고 합니다. 흔한 방법은 삼각형의 변 하나를 접어 양 끝 정점을 하나로 합치는 것입니다. 변 하나를 접으면 그 변을 함께 쓰던 삼각형 둘이 사라집니다. 모양이 덜 망가지는 변부터 골라 접기를 되풀이하면 점점 단순한 모형이 나옵니다.

flowchart TD
    subgraph MAKE["만들 때 · 한 번만"]
        M0["0단계 · 원본 모형"] --> M1["1단계 · 변을 접어 줄인 모형"]
        M1 --> M2["2단계 · 더 줄인 모형"]
    end
    subgraph DRAW["그릴 때 · 화면마다"]
        D1["화면에 비친 크기를 잰다"] --> D2["단계를 고른다"]
        D2 --> D3["그 단계의 모형을 그린다"]
    end
    MAKE --> DRAW

모형 줄이기는 접을 변을 수없이 골라야 해서 시간이 오래 걸립니다. 그래서 만들 때 한 번만 합니다. 화면마다 하는 일은 크기를 재고 문턱과 견주는 계산 몇 번뿐입니다.

단계가 바뀌는 순간

단계가 바뀌면 그 순간 모형이 통째로 갈아 끼워집니다. 삼각형 수가 갑자기 달라지니 윤곽이 툭 튀어 보입니다. 이 현상을 팝핑이라고 부릅니다.

물체가 문턱 바로 근처에 머물면 더 나빠집니다. 카메라가 조금씩 흔들릴 때마다 두 단계를 오가며 모양이 계속 깜박입니다.

이를 막으려고 내려갈 때와 올라갈 때의 문턱을 다르게 둡니다. 예를 들어 화면에 비친 크기(앞 코드가 구한 비율)가 0.20 아래로 내려가야 단순한 모형으로 바꾸고, 0.30 위로 올라가야 정교한 모형으로 돌아옵니다. 이렇게 가는 길과 오는 길의 문턱을 벌려 두는 것을 히스테리시스라고 합니다.

stateDiagram-v2
    state "0단계 · 정교한 모형" as L0
    state "1단계 · 단순한 모형" as L1
    L0 --> L1: 화면에 비친 크기가 0.20 아래로
    L1 --> L0: 화면에 비친 크기가 0.30 위로

두 화살표의 문턱이 다릅니다. 화면에 비친 크기가 0.20 과 0.30 사이에서 흔들리는 동안에는 어느 화살표도 타지 않고 지금 단계에 머뭅니다.

튀는 모습 자체를 감추는 방법도 있습니다. 바꾸는 순간 잠깐 두 모형을 겹쳐 그립니다. 새 모형은 서서히 나타나고 옛 모형은 서서히 사라집니다. 이 방법을 크로스페이드라고 합니다.

아예 단계를 나누지 않는 방식도 있습니다. 변을 접는 순서를 저장해 두고, 화면에 비친 크기에 맞춰 필요한 만큼만 접거나 펴서 그립니다. 삼각형 수가 한 번에 조금씩만 바뀌니 튀는 모습이 거의 안 보입니다.

이 방식을 연속 LOD라고 부릅니다. 대신 화면마다 모형을 고치는 계산이 듭니다.

모형 말고도 줄이는 것

「멀면 덜 한다」는 생각은 삼각형 수에만 쓰이지 않습니다. 화면에 작게 보일 때 티가 안 나는 일이면 무엇이든 단계를 둘 수 있습니다. 아래 표는 흔한 대상을 모은 것입니다.

표에 나오는 텍스처는 모형 표면에 입히는 그림입니다. 나무껍질의 결이나 벽돌 무늬가 텍스처입니다.

대상 가까울 때 멀 때
모형 삼각형이 많은 메시 삼각형이 적은 메시
텍스처 원본 크기 그림 미리 줄여 둔 작은 그림
땅 촘촘한 격자 성긴 격자
아주 먼 물체 입체 모형 물체를 찍은 그림 한 장을 붙인 판
캐릭터 동작 화면마다 다시 계산 몇 화면에 한 번 계산

둘째 줄처럼 텍스처를 크기별로 미리 줄여 둔 묶음을 밉맵이라고 합니다.

셋째 줄의 땅은 바둑판처럼 칸을 나눈 격자 모양의 메시로 만들곤 합니다. 멀리 있는 땅은 칸을 크게 잡아 삼각형 수를 줄입니다.

넷째 줄의 그림 붙인 판은 임포스터라고 부릅니다.

마지막 줄은 그리기가 아니라 계산을 줄입니다. 화면에 작게 보이는 캐릭터는 동작이 조금 거칠어도 티가 나지 않습니다.

LOD 가 치르는 대가

첫째 대가는 메모리입니다. 한 물체마다 모형을 여러 벌 들고 있어야 합니다. 단계마다 삼각형을 절반으로 줄이면 모든 단계를 합쳐도 원본의 두 배를 넘지 않습니다. 1 + 1/2 + 1/4 + … 가 2 에 다가가기 때문입니다.

둘째는 만드는 수고입니다. 자동으로 줄인 모형이 엉뚱하게 망가지면 사람이 손봐야 합니다. 얼굴이나 글자처럼 조금만 뭉개져도 티가 나는 부분이 특히 그렇습니다.

셋째는 앞에서 본 팝핑입니다. 히스테리시스와 크로스페이드는 이것을 줄일 뿐 없애지는 못합니다.

LOD 가 줄이는 것은 물체 하나를 그리는 비용입니다. 그리는 물체의 개수는 그대로입니다. 화면에 안 보일 물체를 그리기 전에 빼는 일은 컬링이 맡습니다. 둘은 서로를 대신하지 않고 함께 씁니다.

LOD 가 잘 듣는 장면

LOD 로 얻는 것은 물체들의 거리가 크게 갈릴수록 커집니다. 넓은 들판이나 도시처럼 가까운 것과 아주 먼 것이 한 화면에 같이 나오는 장면이 그렇습니다. 먼 물체가 많을수록 덜어 낼 삼각형도 많습니다.

반대로 모든 물체가 비슷한 거리에 있으면 얻을 것이 적습니다. 좁은 방 안이나 카메라가 고정된 퍼즐 화면이 그렇습니다. 이런 장면에서는 모형을 여러 벌 만드는 수고와 메모리만 늘어납니다.

관련 항목

LOD 의 하위 종류

이산 LOD · 연속 LOD · 계층적 LOD · 지형 LOD · 텍스처 LOD · 애니메이션 LOD

LOD 단계를 만드는 메시 단순화 기법

메시 단순화 · 변 접기 · 프로그레시브 메시 · 이차 오차 행렬 · 리토폴로지

LOD 단계를 고르는 데 쓰는 기준값

화면 공간 오차 · 시야각 · 바운딩 스피어 · 원근 투영 · 카메라 거리

LOD 전환의 튐을 감추는 기법

히스테리시스 · 크로스페이드 · 디더링 · 지오모핑

LOD 가 줄이려는 화면 결함

팝핑 · 앨리어싱 · 모아레 · 깜박임

LOD 와 같은 생각을 모형 밖에 적용한 기법

밉맵 · 임포스터 · 빌보드 · 클립맵 · 가상 텍스처 · 가변 레이트 셰이딩 · 테셀레이션

LOD 와 함께 그릴 양을 줄이는 기법

컬링 · 절두체 컬링 · 오클루전 컬링 · 인스턴싱 · 드로 콜 배칭 · 해상도 스케일링

LOD 가 줄이려는 비용과 그 지표

프레임 시간 · 프레임 예산 · 프레임률 · 정점 수 · 드로 콜 · GPU 바운드 · 메모리 대역폭

LOD 가 걸리는 그리기 단계

그래픽스 파이프라인 · 메시 · 정점 · 정점 셰이더 · 래스터화 · 텍스처 · 픽셀

LOD 가 쓰이는 상위 분야

게임 개발 · 실시간 렌더링 · 그래픽스 · 게임 엔진 · 오픈 월드 · GPU

다른 이름: Level of Detail · 레벨 오브 디테일 · 세부 수준