사전 HDR
개념

HDR

gabury1고친 사람 github-actions[bot]

HDR 은 아주 밝은 곳과 아주 어두운 곳을 한 장면 안에 함께 살려 두는 방식입니다. 사진이나 화면은 대개 한쪽을 살리면 다른 쪽이 하얗게 날아가거나 까맣게 뭉개집니다. HDR 은 밝기의 폭을 넓게 잡아 두 쪽을 모두 남깁니다.

쉽고 빠른 이해

HDR 은 밝기 차이가 큰 장면을 밝은 쪽과 어두운 쪽 모두 살려서 담는 방식입니다. 방 안에서 창가에 선 사람을 찍는다면 창밖 풍경과 사람 얼굴이 둘 다 보이게 남깁니다.

이게 없으면 어느 한쪽을 버려야 합니다. 보통 이미지는 담을 수 있는 가장 밝은 값이 흰색으로 정해져 있습니다. 창밖에 맞추면 얼굴이 까맣게 묻힙니다. 얼굴에 맞추면 창밖이 하얗게 날아갑니다.

어떻게 도나:

  1. 밝기를 넓은 폭으로 담습니다. 사진은 노출을 달리해 여러 장을 찍어 합칩니다. 게임 같은 그래픽은 빛을 계산할 때 흰색보다 큰 값도 그대로 들고 다닙니다
  2. 내보낼 화면이 낼 수 있는 밝기의 폭을 봅니다
  3. 넓은 폭을 그 화면의 폭에 맞게 눌러 담습니다. 이 과정을 톤 매핑이라고 부릅니다

대가도 있습니다. 밝기 하나에 비트를 더 쓰므로 메모리가 늘어납니다. 그리고 화면마다 낼 수 있는 밝기가 달라서 같은 영상이 화면에 따라 다르게 보입니다.

빛을 계산하는 그래픽과 밝기 차이가 큰 사진에 씁니다. 글자나 아이콘 같은 화면 요소에는 쓰지 않습니다.

상세

자 하나로 개미의 다리 길이와 운동장 끝까지의 거리를 함께 재야 한다고 해 봅니다. 눈금을 촘촘하게 새긴 짧은 자는 운동장 앞에서 모자랍니다. 긴 줄자는 개미 다리 앞에서 눈금이 너무 성깁니다. 둘 다 재려면 길면서도 눈금이 촘촘한 자가 있어야 합니다.

HDR(High Dynamic Range, 하이 다이내믹 레인지)은 밝기를 이런 자로 재는 방식입니다. 한 장면에서 가장 밝은 곳과 가장 어두운 곳이 크게 차이 나도 둘을 모두 서로 구별되는 값으로 담습니다. 한낮의 창밖 하늘과 방 안 그늘진 구석을 한 장에 함께 남기는 것이 그런 예입니다.

가장 밝은 곳과 가장 어두운 곳 사이의 폭을 다이내믹 레인지라고 부릅니다. HDR 은 이 폭이 넓다는 뜻입니다. 그 반대인 보통 폭은 SDR(Standard Dynamic Range, 표준 다이내믹 레인지)이라고 부릅니다.

비율로 재는 밝기의 폭

다이내믹 레인지는 가장 밝은 값을 가장 어두운 값으로 나눈 비율로 잽니다. 차이가 아니라 비율로 재는 까닭은 눈이 밝기를 비율로 느끼기 때문입니다. 어두운 방에서는 촛불 하나를 더 켜면 확 밝아집니다. 대낮 운동장에서는 같은 촛불 하나가 아무 차이도 못 냅니다.

이 비율은 워낙 크게 벌어집니다. 그래서 빛의 양이 두 배씩 몇 번 늘었는지로 셉니다. 두 배를 열 번 하면 약 1000배입니다. 스무 번 하면 약 100만 배입니다.

실제 장면은 이 폭이 넓습니다. 햇빛이 드는 하늘과 그늘 속 바위를 한 장면에 넣으면 수천 배 넘게 차이 나는 일이 흔합니다. 눈은 이 폭을 한꺼번에 알아봅니다. 이미지 한 장은 그만한 폭을 담지 못하는 경우가 많습니다.

보통 이미지가 갇히는 폭

색을 숫자로 적는 규칙을 색 공간이라고 부릅니다. 보통 이미지 파일과 모니터 신호는 대개 sRGB(standard Red Green Blue, 표준 적녹청)라는 색 공간을 씁니다.

보통 이미지는 빨강·초록·파랑 세 채널을 각각 8비트 숫자 하나로 적습니다. 채널 하나에 쓰는 비트 수를 비트 깊이라고 부릅니다.

8비트는 0부터 255까지 256칸 눈금입니다. 0 은 가장 어두운 검정입니다. 255 는 화면이 낼 수 있는 가장 밝은 흰색입니다.

이 256칸은 빛의 양을 같은 간격으로 나눈 눈금이 아닙니다. 앞에서 본 것처럼 눈은 밝기를 비율로 느끼므로 어두운 쪽의 작은 차이를 더 잘 알아챕니다. 그래서 숫자와 빛의 양 사이에 곡선을 하나 두고 어두운 쪽에 칸을 더 많이 줍니다. 이 곡선을 감마 보정 곡선이라고 부릅니다.

이 규칙에는 흰색보다 밝은 값을 적을 방법이 없습니다. 그래서 밝은 쪽이 잘립니다. 창밖이 방 안 벽보다 스무 배 밝다고 해 봅니다. 벽을 흰색 가까이 맞춰 찍었다면 창밖은 255 에서 멈춥니다.

255 를 넘는 값이 모두 255 로 잘려 나가는 이 현상을 클리핑이라고 부릅니다. 사진이 「하얗게 날아갔다」는 말이 이것입니다.

반대로 창밖에 맞추면 어두운 쪽이 뭉개집니다. 방 안의 밝기들이 0 가까이의 몇 칸에 몰립니다. 서로 다르던 밝기가 같은 숫자가 되어 그늘 속 무늬가 까맣게 사라집니다.

256칸을 억지로 넓은 폭에 펼쳐도 문제가 생깁니다. 칸 사이가 벌어져 부드러워야 할 밝기 변화가 층층이 끊겨 보입니다. 이 계단 자국을 밴딩이라고 부릅니다. 그래서 HDR 은 폭을 넓힐 때 비트도 함께 늘립니다.

넓은 폭을 좁은 화면에 담는 톤 매핑

넓게 담은 밝기도 결국 어떤 화면에 보여야 합니다. 화면이 낼 수 있는 폭이 담은 폭보다 좁으면 넓은 폭을 좁은 폭에 맞춰 줄여야 합니다. 이 과정을 톤 매핑이라고 부릅니다.

가장 쉬운 방법은 흰색을 넘는 값을 흰색으로 자르는 것입니다. 이러면 흰색보다 밝았던 곳들이 모두 같은 흰색이 되어 서로 구별되지 않습니다. 톤 매핑은 자르지 않고 곡선으로 눌러 담습니다. 밝은 값일수록 더 세게 누릅니다. 그러면 아주 밝은 값도 흰색 바로 아래에 순서대로 들어갑니다.

아래 코드는 두 방법을 같은 밝기 셋에 걸어 봅니다. 화면의 흰색을 1.0 으로 두고 창밖을 4.0, 방 안 벽을 1.0, 그늘을 0.25 로 잡았습니다. cut 은 자르는 방법이고 tm 은 가장 단순한 톤 매핑 곡선 가운데 하나입니다.

Python
def cut(v): return min(v, 1.0)
def tm(v):  return v / (v + 1)

cut(4.0), tm(4.0)    # 1.0, 0.8
cut(1.0), tm(1.0)    # 1.0, 0.5
cut(0.25), tm(0.25)  # 0.25, 0.2

첫 줄이 창밖, 둘째 줄이 벽, 셋째 줄이 그늘입니다. 자르는 쪽은 창밖과 벽이 둘 다 1.0 이 되어 구별이 사라졌습니다. 톤 매핑 쪽은 0.8, 0.5, 0.2 로 세 밝기의 순서가 살아 있습니다.

대신 흰색이던 벽이 0.5 로 어두워졌습니다. 이 곡선은 1.0 이 들어오면 출력의 한가운데인 0.5 를 내기 때문입니다. 그래서 톤 매핑 앞에 숫자 하나를 곱해 어느 밝기를 곡선의 0.5 자리에 둘지 정합니다. 곱하는 수를 2 로 두면 이렇게 됩니다.

Python
k = 2.0
tm(k * 4.0)   # 0.89
tm(k * 1.0)   # 0.67
tm(k * 0.25)  # 0.33

벽 1.0 이 2.0 이 되어 톤 매핑 뒤 0.67 로 올라왔습니다. 창밖은 0.89 로 여전히 흰색 아래에 남아 벽과 구별됩니다.

사진기에서 빛을 얼마나 받아들일지 정하는 값을 노출이라고 부릅니다. 이 곱하는 숫자가 계산 안에서 노출 노릇을 합니다.

HDR 이라는 이름이 쓰이는 세 곳

HDR 이라는 이름은 세 곳에서 쓰입니다. 셋 다 밝기의 폭을 넓히지만 무엇의 폭을 넓히는지가 다릅니다.

어디서 넓히는 것 결과물
사진 사진 한 장에 담기는 밝기의 폭 노출을 달리한 여러 장을 합친 사진
그래픽 계산 계산 도중의 값이 가질 수 있는 폭 흰색보다 큰 값이 든 계산 결과
화면과 영상 신호 화면이 실제로 내는 빛의 폭 더 밝게 빛나는 화면과 그 화면을 부리는 신호

셋은 따로 쓰이기도 하고 한 흐름으로 이어지기도 합니다. 아래 그림은 넓은 폭으로 담은 밝기가 어느 화면으로 가느냐에 따라 두 갈래로 갈리는 모습입니다.

flowchart TD
    P["HDR 사진 · 노출을 달리한 여러 장을 합친다"] --> A["넓은 폭의 밝기 값"]
    R["HDR 렌더링 · 흰색보다 큰 값으로 계산한다"] --> A
    A --> T["톤 매핑 · 보통 화면의 폭으로 줄인다"]
    T --> S["보통 화면"]
    A --> H["HDR 신호 · 넓은 폭을 그대로 싣는다"]
    H --> D["HDR 화면 · 제 밝기에 맞춰 톤 매핑한다"]

보통 화면으로 가는 갈래는 톤 매핑을 거쳐 SDR 이미지가 됩니다. HDR 화면으로 가는 갈래는 넓은 폭을 신호에 실어 보냅니다. 톤 매핑은 화면이 맡습니다. 이어지는 세 소절이 그림 위쪽의 두 입구와 HDR 화면으로 가는 갈래를 하나씩 봅니다.

HDR 사진

사진기의 센서도 한 번에 담는 폭이 정해져 있습니다. 노출을 길게 잡으면 어두운 곳이 살고 밝은 곳이 날아갑니다. 짧게 잡으면 그 반대입니다.

HDR 사진은 노출만 달리해 같은 장면을 여러 장 찍습니다. 어둡게 찍힌 장에서는 밝은 하늘을 가져옵니다. 밝게 찍힌 장에서는 그늘 속을 가져옵니다.

이렇게 합친 한 장은 한 번 찍은 사진보다 훨씬 넓은 폭을 갖습니다. 휴대폰 카메라 설정에 보이는 HDR 이 대개 이 뜻입니다.

합친 사진도 보통 화면에 보이려면 톤 매핑을 거쳐야 합니다. 그래서 결과물은 대개 보통 이미지로 저장됩니다. 톤 매핑을 세게 걸면 밝은 곳과 어두운 곳이 비슷한 밝기로 눌려 그림처럼 과장된 사진이 됩니다. 「HDR 느낌」이라고 부르는 인상이 이것입니다.

HDR 렌더링

게임이나 3차원 그래픽은 장면에 닿는 빛을 계산해 화면을 만듭니다. 이 계산을 렌더링이라고 부릅니다. 해가 비추는 면은 그늘진 면보다 수십 배, 수백 배 밝은 값이 나오는 것이 자연스럽습니다.

계산 결과를 0부터 255까지의 8비트에 바로 담으면 흰색을 넘는 값이 모두 잘립니다. 그래서 HDR 렌더링은 계산 도중의 색을 부동소수점 숫자로 담습니다. 부동소수점은 소수점 위치를 옮겨 가며 아주 작은 값과 아주 큰 값을 함께 적는 숫자 형식입니다. 흰색을 1.0 으로 두고 4.0 이나 50.0 같은 값도 잘리지 않고 들고 다닙니다.

보통 이미지의 숫자는 앞에서 본 감마 곡선을 거친 값이라 빛의 양에 곧게 비례하지 않습니다. 빛을 더하고 섞는 계산이 맞게 나오려면 숫자가 빛의 양을 곧게 따라가야 합니다. 그래서 렌더링은 감마 곡선을 펴서 빛의 양에 비례하는 값으로 계산합니다. 이렇게 적는 규칙을 선형 색 공간이라고 부릅니다.

계산 도중의 색을 담아 두는 메모리를 렌더 타깃이라고 부릅니다. HDR 렌더링은 렌더 타깃을 채널마다 16비트 부동소수점으로 잡는 경우가 많습니다. 계산이 다 끝나면 앞에서 본 톤 매핑으로 화면의 폭에 맞춥니다.

흰색을 넘는 값을 끝까지 알고 있으면 할 수 있는 일이 늘어납니다. 아주 밝은 곳 둘레로 빛이 번져 보이게 하는 블룸이 그런 예입니다. 1.0 을 넘는 곳만 골라 번지게 하면 됩니다. 그러면 흰 벽과 전등이 똑같이 번지는 일이 없습니다.

HDR 화면과 영상 신호

화면 쪽의 HDR 은 화면이 실제로 내는 빛의 폭을 넓힌 것입니다. 물결에 반짝이는 햇빛처럼 작고 밝은 점을 SDR 의 흰색보다 훨씬 밝게 빛냅니다. 검정은 더 깊게 가라앉힙니다.

화면이 내는 밝기는 니트라는 단위로 잽니다. 1제곱미터 넓이가 촛불 하나만큼 빛나는 밝기가 1니트입니다. 휴대폰이나 모니터 광고에 나오는 최대 밝기 숫자가 이 단위입니다.

폭이 넓어지면 먼저 비트를 늘려야 합니다. 그대로 8비트에 담으면 앞에서 본 밴딩이 생기기 때문입니다. HDR 영상은 흔히 채널마다 10비트 이상으로 적습니다. 10비트는 1024칸이라 8비트보다 눈금이 네 배 촘촘합니다.

다음으로 숫자와 밝기를 잇는 곡선을 바꿉니다. 숫자를 화면이 낼 빛의 양으로 바꾸는 이 곡선을 전달 함수라고 부릅니다. 보통 이미지의 전달 함수는 앞에서 본 감마 곡선입니다. 보통 이미지는 가장 큰 숫자를 그 화면의 흰색으로 읽습니다.

HDR 신호는 감마 곡선보다 훨씬 넓은 폭을 다룹니다. 그래서 눈이 밝기를 비율로 느끼는 성질에 맞춰 넓은 폭을 눈이 알아채는 만큼씩 나누는 곡선을 새로 만들어 씁니다.

널리 쓰이는 곡선이 둘 있습니다. PQ(Perceptual Quantizer, 지각 양자화기)는 숫자 하나가 정해진 니트 값 하나를 뜻하게 적습니다. 화면과 상관없이 밝기를 절대값으로 적는 방식입니다.

HLG(Hybrid Log-Gamma, 하이브리드 로그 감마)는 화면의 흰색을 기준으로 한 상대값으로 적습니다. 어두운 쪽은 보통 감마 곡선과 비슷하게 두었습니다. SDR 화면에서 틀어도 그럴듯하게 보이게 하려는 설계입니다.

화면마다 낼 수 있는 최대 밝기가 다릅니다. 영상의 가장 밝은 값이 화면의 한계보다 밝으면 화면이 스스로 톤 매핑을 해야 합니다. 그 판단을 돕도록 HDR 영상은 「이 영상이 얼마나 밝은가」 같은 정보를 신호에 함께 싣습니다. 이 정보를 HDR 메타데이터라고 부릅니다.

메타데이터를 싣는 방식은 둘로 갈립니다. 영상 전체에 하나만 붙이는 것을 정적 메타데이터라고 부릅니다. HDR10 이 이 방식입니다. 장면마다 바꿔 붙이는 것은 동적 메타데이터라고 부릅니다.

HDR10+ 와 돌비 비전이 동적 메타데이터를 씁니다. 동적 쪽은 어두운 장면과 밝은 장면을 따로 눌러 담을 수 있습니다.

HDR 영상은 흔히 더 넓은 색역과 함께 옵니다. 색역은 화면이 낼 수 있는 색의 범위입니다. 밝기의 폭과 색의 범위는 서로 다른 축입니다. 둘은 한 묶음으로 팔리는 일이 많습니다. 그래서 같은 것으로 헷갈리기 쉽습니다.

HDR 의 대가

첫째는 메모리입니다. 화면의 점 하나를 픽셀이라고 부릅니다. 화면에 그릴 때는 빨강·초록·파랑에 투명도 채널 하나를 더 붙여 네 채널로 담는 일이 많습니다.

네 채널을 8비트씩 담던 픽셀을 16비트 부동소수점으로 담으면 픽셀 하나가 4바이트에서 8바이트가 됩니다. 메모리 사용량이 두 배가 됩니다. 그래픽 칩과 메모리 사이를 오가는 데이터 양도 함께 늘어납니다.

둘째는 화면마다 달라지는 결과입니다. 화면이 낼 수 있는 최대 밝기는 제각각입니다. 그래서 영상의 밝은 부분을 화면마다 다르게 눌러 담습니다. 만든 사람이 본 화면과 보는 사람의 화면이 다르면 밝은 곳의 인상이 달라집니다.

셋째는 톤 매핑을 누가 할지 정하는 일입니다. 그래픽 프로그램과 운영체제와 화면 가운데 누가 할지가 어긋나면 결과가 틀어집니다. 두 번 눌리면 어둡고 밋밋해집니다. 한 번도 안 눌리면 밝은 곳이 하얗게 날아갑니다.

쓰는 경우와 안 쓰는 경우

빛을 계산하는 그래픽은 보통 화면에 내보내더라도 계산 도중에는 HDR 로 담는 일이 많습니다. 내보낼 때만 톤 매핑으로 줄이면 됩니다. 그러면 계산 도중에는 밝은 곳이 잘리지 않습니다.

사진은 밝기 차이가 큰 장면에서 씁니다. 역광이나 창가처럼 한 번 찍어서는 한쪽이 날아가는 장면이 그렇습니다.

내보내는 쪽까지 HDR 로 할지는 보는 화면이 정합니다. 보는 화면이 HDR 화면이 아니면 HDR 신호를 보내도 결국 보통 폭으로 다시 줄여서 보여 줍니다.

밝기 차이가 크지 않은 이미지에는 쓸 까닭이 없습니다. 글자와 도표, 아이콘 같은 화면 요소는 흰색보다 밝은 값이 필요 없습니다. 보통 이미지로 충분합니다.

관련 항목

HDR 이 넓히는 밝기의 폭을 재는 단위와 지표

다이내믹 레인지 · 스톱 · 니트 · 칸델라 · 휘도 · 명암비

HDR 값을 화면의 폭에 맞춰 줄이는 처리

톤 매핑 · 노출 · 클리핑 · 라인하르트 톤 매핑 · 필믹 톤 매핑 · ACES

HDR 영상 신호를 정하는 곡선과 규격

PQ · HLG · HDR10 · HDR10+ · 돌비 비전 · HDR 메타데이터 · Rec.2020 · 색역

HDR 값을 담는 숫자 형식과 파일

부동소수점 · 반정밀도 부동소수점 · 비트 깊이 · 렌더 타깃 · 프레임버퍼 · OpenEXR · Radiance HDR

HDR 값 위에서 도는 그래픽스 처리

렌더링 · 선형 색 공간 · 블룸 · 물리 기반 렌더링 · 이미지 기반 조명 · 포스트 프로세싱 · 셰이더

HDR 사진을 만드는 촬영과 합성 기법

노출 브라케팅 · 노출 융합 · 이미지 센서 · RAW 이미지 · 계산 사진학

HDR 이 넘어서려는 보통 이미지의 규칙

SDR · sRGB · 감마 보정 · 전달 함수 · 밴딩 · 색 공간

HDR 이 속하는 상위 분류

그래픽스 · 영상 처리 · 디스플레이 · 색 과학

다른 이름: High Dynamic Range · 하이 다이내믹 레인지 · 하이 다이나믹 레인지 · 높은 다이내믹 레인지 · 고명암비