사전 밉맵
자료구조

밉맵

gabury1고친 사람 github-actions[bot]

밉맵은 그림 한 장을 미리 여러 크기로 줄여 한 벌로 들고 다닙니다. 화면에서 작게 보이는 물체에는 원본 대신 알맞게 줄인 장을 읽어 줍니다. 줄일 때 이웃한 색을 미리 섞으므로 한 지점만 읽어도 주변 색이 함께 담깁니다.

쉽고 빠른 이해

밉맵은 같은 그림을 절반씩 줄여 만든 여러 장을 묶은 한 벌입니다. 멀리 있는 벽에 벽돌 그림을 입히면 원본이 아니라 작게 줄인 장에서 색을 읽습니다.

그림은 네모 칸이 모인 격자입니다. 물체가 멀어지면 화면의 점 하나가 그 격자의 칸 여러 개를 덮습니다. 색은 그중 한 칸에서만 읽습니다.

물체가 조금만 움직여도 읽히는 칸이 다른 칸으로 건너뜁니다. 그래서 무늬가 지글거립니다.

어떻게 도나:

  1. 그림을 올릴 때 각 변을 절반으로 줄인 장을 차례로 만들어 함께 둡니다
  2. 그리는 동안 물체가 화면에서 얼마나 줄어들어 보이는지를 잽니다
  3. 그 정도에 맞는 장을 골라 읽습니다. 두 장 사이에 걸치면 양쪽에서 읽어 섞습니다

대가는 메모리입니다. 줄인 장을 전부 합치면 원본의 삼분의 일쯤이 더 듭니다.

안 쓰는 곳도 있습니다. 화면의 점과 그림의 칸이 하나씩 맞아떨어지는 그리기, 그리고 색이 아니라 계산에 쓸 숫자를 담은 그림에는 두지 않습니다.

상세

이 절은 밉맵이 어떤 모양으로 쌓이는지, 그리는 동안 그 가운데 어느 장이 읽히는지를 다룹니다. 그림 한 장과 그 그림을 입힌 벽 하나를 놓고 따라갑니다.

축척이 다른 지도를 여러 장 묶은 지도책을 떠올려 봅시다. 나라 전체를 볼 때는 축척이 작은 장을 폅니다. 골목을 찾을 때는 축척이 큰 장을 폅니다.

밉맵도 같은 그림을 크기별로 미리 여러 장 만듭니다. 그때그때 그중 한 장을 폅니다.

밉맵이 줄여 쌓는 그림은 텍스처입니다. 텍스처는 물체 표면에 입힐 그림을 격자로 담은 자원입니다. 그 격자의 칸 하나를 텍셀이라고 부릅니다. 이 편에서는 그냥 칸이라고 쓰겠습니다.

줄인 장이 없을 때 생기는 깨짐

밉맵이 없으면 읽을 장이 원본 하나뿐입니다. 물체가 화면에서 작아지면 화면의 점 하나가 덮는 칸이 늘어납니다. 가장 단순하게 읽으면 덮은 칸이 넷이어도 색은 그중 한 칸에서만 읽어 옵니다. 나머지 셋의 색은 화면에 나타나지 못합니다.

물체가 조금 움직이면 덮는 위치가 밀려 읽히는 칸이 다른 칸으로 건너뜁니다. 그래서 무늬가 반짝이고 지글거립니다.

이 깨짐을 에일리어싱이라고 합니다. 격자무늬나 줄무늬처럼 규칙적인 그림에서는 원본에 없던 물결 무늬로 나타납니다. 이 물결 무늬가 모아레입니다.

읽는 칸을 늘리면 될 것 같지만, 멀어질수록 덮는 칸이 수십 수백 개로 불어납니다. 점 하나를 칠할 때마다 그만큼 읽으면 그리는 데 드는 비용이 거리에 따라 함께 불어납니다. 밉맵은 그 섞기를 그릴 때가 아니라 미리 해 둡니다.

block-beta
columns 4
  H1["원본을 읽을 때 · 점 하나가 칸 넷을 덮는다"]:4
  a1["읽는 칸"] a2["건너뛴 칸"] a3["건너뛴 칸"] a4["건너뛴 칸"]
  H2["줄인 장을 읽을 때 · 그 칸 넷이 미리 한 칸으로 섞여 있다"]:4
  b1["읽는 칸 · 네 칸을 섞은 값"]:4

절반씩 줄인 사슬

밉맵은 원본을 레벨 0 으로 삼습니다. 각 변을 절반으로 줄인 장이 레벨 1, 그것을 다시 절반으로 줄인 장이 레벨 2 입니다. 이렇게 한 변이 한 칸이 될 때까지 이어집니다. 이 사슬의 한 장을 밉 레벨이라고 부릅니다.

block-beta
columns 8
  T["아래로 갈수록 한 변이 절반이다 · 시간 순서가 아니라 쌓인 차례다"]:8
  L0["레벨 0 · 256 칸"]:8
  L1["레벨 1 · 128 칸"]:4 space:4
  L2["레벨 2 · 64 칸"]:2 space:6
  L3["레벨 3 · 32 칸"]:1 space:7

장 수는 원본 한 변을 절반으로 몇 번 나눌 수 있나로 정해집니다. 한 변이 256 칸이면 아홉 장이 됩니다. 사슬 전체를 한 덩이로 묶습니다. 그리는 동안 그중 필요한 장을 골라 읽습니다.

아래 레벨의 칸 하나는 위 레벨의 이웃한 네 칸을 섞어 만듭니다. 네 칸의 평균을 내는 것이 가장 흔한 방법입니다. 그래서 아래 레벨의 한 칸에는 위 레벨의 네 칸 몫 색이 이미 담겨 있습니다.

더 드는 메모리

한 변이 절반이면 칸 수는 사분의 일입니다. 레벨을 내려갈 때마다 칸 수가 사분의 일씩 줄어드니, 아래 장들은 금세 작아집니다.

레벨 한 변 칸 수가 원본 대비
0 256 칸 1
1 128 칸 사분의 일
2 64 칸 십육분의 일
3 32 칸 육십사분의 일

이 값을 사슬 끝까지 더해도 원본의 삼분의 일을 넘지 않습니다. 원본을 들고 있을 메모리가 있으면 밉맵까지 들고 있을 수 있다는 뜻입니다.

어느 레벨을 읽을지 고르기

고르는 일은 밉맵이 아니라 읽는 쪽이 합니다. 읽기 규칙을 모아 놓은 것이 샘플러입니다. 레벨 고르기도 그 규칙의 하나입니다.

이웃한 화면 점 둘이 그림의 어느 지점을 가리키는지를 견주면 물체가 화면에서 얼마나 줄어들어 보이는지 알 수 있습니다. 점 하나가 칸 하나를 덮으면 레벨 0, 칸 둘을 덮으면 레벨 1 입니다. 덮는 칸이 두 배가 될 때마다 레벨이 한 장씩 내려갑니다.

한 장 안에서 읽을 때도 한 칸만 집는 것은 아닙니다. 읽을 지점 둘레의 이웃 네 칸을 가로세로로 섞어 그 지점의 색을 낼 수 있습니다. 이것을 쌍선형 필터링이라고 합니다.

레벨 번호는 대개 정수로 떨어지지 않습니다. 그때는 위아래 두 레벨에서 각각 이렇게 읽습니다. 그리고 남은 소수만큼의 비율로 두 값을 다시 섞습니다.

flowchart TD
    A["화면 점 하나가 덮는 칸 수를 잰다"] --> B["레벨 번호가 소수로 나온다"]
    B --> C["위 레벨에서 이웃 네 칸을 섞어 읽는다"]
    B --> D["아래 레벨에서 이웃 네 칸을 섞어 읽는다"]
    C --> E["두 값을 소수 비율로 섞는다"]
    D --> E

가로로 한 번, 세로로 한 번, 두 레벨 사이로 한 번. 섞기가 셋이라 이 방식을 삼선형 필터링이라고 부릅니다.

섞지 않고 가까운 레벨 하나만 읽을 수도 있습니다. 두 장에서 읽던 것을 한 장에서만 읽으니 읽는 횟수가 절반이 됩니다. 대신 레벨이 바뀌는 경계에서 색이 툭 끊어져 띠처럼 보입니다.

밉맵을 두지 않는 그리기

화면의 점과 그림의 칸이 하나씩 맞아떨어지는 그리기에는 밉맵이 필요 없습니다. 포스트 프로세싱이 그렇습니다. 화면을 다 그린 뒤 화면 전체를 한 번 더 훑어 손보는 처리입니다. 줄어들어 보일 일이 없으니 고를 레벨도 없습니다.

색이 아니라 계산에 쓸 숫자를 칸에 담은 텍스처에도 두지 않습니다. 이웃 칸과 섞인 값은 원래 숫자가 아닙니다. 미리 섞은 장을 읽으면 계산이 엉뚱한 답을 냅니다.

밉맵이 못 막는 흐릿함

면이 비스듬히 누우면 화면의 점이 덮는 자국이 한쪽으로 길쭉해집니다. 레벨은 가로와 세로를 함께 줄인 장이라 어느 장을 골라도 한 축이 안 맞습니다. 길쭉한 쪽에 맞추면 짧은 축까지 필요 이상으로 뭉개집니다.

block-beta
columns 4
  H1["점이 덮는 자국 · 가로로 길쭉하다"]:4
  a1["덮인 칸"] a2["덮인 칸"] a3["덮인 칸"] a4["덮인 칸"]
  H2["고를 수 있는 레벨 · 가로와 세로가 같다"]:4
  b1["칸"] b2["칸"] space:2
  b3["칸"] b4["칸"] space:2

이방성 필터링이 이 뭉개짐을 줄입니다. 누운 방향을 따라 여러 번 읽어 섞는 방식입니다. 밉맵을 대신하는 것이 아니라 밉맵 위에서 함께 돕니다. 어느 레벨에서 읽을지는 그대로 밉맵이 정합니다.

밉맵이 손해를 보는 텍스처

내용이 매 장면 바뀌는 텍스처는 레벨도 그때마다 다시 만들어야 합니다. 그리기가 끝날 때마다 사슬을 새로 채우는 비용이 붙습니다.

여러 그림을 한 장에 모아 붙인 텍스처 아틀라스도 조심할 대목입니다. 레벨을 내려갈수록 이웃한 조각끼리 색이 섞여 들어옵니다. 그래서 경계에 옆 그림의 색이 번집니다.

관련 항목

밉맵이 줄여 쌓는 그림 자원

텍스처 · 텍셀 · 밉 레벨 · 텍스처 좌표 · 큐브 맵 · 텍스처 배열 · 텍스처 아틀라스 · 노멀 맵

밉맵에서 읽을 값을 고르고 섞는 읽기 규칙

샘플러 · 텍스처 필터링 · 쌍선형 필터링 · 삼선형 필터링 · 이방성 필터링 · 밉 레벨 바이어스 · 최근접 이웃 샘플링

밉맵이 줄이려는 화면의 깨짐

에일리어싱 · 모아레 · 안티앨리어싱 · 샘플링

밉맵을 읽어 화면을 칠하는 단계

그래픽스 파이프라인 · 래스터화 · 프래그먼트 셰이더 · 텍스처 샘플링

밉맵이 더 쓰는 메모리를 덜어 내는 방법

텍스처 압축 · 텍스처 스트리밍 · VRAM · 텍스처 해상도

다른 이름: mipmap · Mipmap · MIP map · 밉맵 사슬 · mipmap chain · 밉맵 피라미드