블랙 레벨 때문에 어두운 부분이 뭉개진다 — 확인할 3가지
렌더를 걸고 밤을 새운 컷이 있습니다. 캐릭터가 어두운 복도에 서 있고, 얼굴 왼쪽은 거의 어둠에 잠겨 있지만 턱선과 옷 주름은 살아 있습니다. 그 미묘한 단계를 맞추느라 라이트를 몇 번이나 다시 잡았죠. 이 컷을 무너뜨리는 범인이 블랙 레벨입니다.
그런데 그 파일을 편집팀에 넘기거나, 유튜브에 올려 폰으로 열거나, 옆자리 사람 모니터에서 띄우는 순간 그림자가 사라집니다. 단계가 뭉개진 게 아니라 한 덩어리 검정이 됩니다. 턱선도 주름도 없어요. 내 자리로 돌아와 같은 파일을 다시 열면 디테일은 그대로 있습니다.
먼저 하나는 짚고 가겠습니다. 이미 잘린 채 저장된 파일은 어떤 설정으로도 되살아나지 않습니다. 이 글이 하는 일은 지금 눈앞의 검정이 아직 살아 있는데 안 보이는 것인지, 이미 죽어서 없는 것인지를 값으로 갈라내는 것입니다. 둘은 화면상으로는 똑같이 보이지만 대응이 정반대예요.

블랙 레벨이 아니라 노출이나 모니터 탓이라는 오해
이 상황에서 가장 먼저 나오는 진단은 둘 중 하나입니다.
- “렌더 노출이 부족했다. 키라이트를 더 올리자.”
- “내 모니터가 어두운 쪽을 과하게 밝게 보여준다. 패널이나 캘리브레이션 문제다.”
둘 다 실제로 존재하는 문제라서 설득력이 있습니다. 저가 패널은 어두운 구간의 계조를 잘 못 그리고, 노출이 모자란 렌더는 실제로 그림자가 뭉칩니다. 저도 처음엔 라이트부터 만졌어요.
그런데 이 관점으로 설명이 안 되는 사실 하나
같은 모니터에서, 같은 파일을, 프로그램만 바꿔 열었는데 결과가 다릅니다.
모니터가 원인이라면 어떤 프로그램에서 열든 똑같이 어두워야 합니다. 노출이 원인이라면 파일에 저장된 픽셀값 자체가 어두워야 하니, 값을 찍어 보면 어디서 열든 같은 숫자가 나와야 합니다. 그런데 실제로는 파일은 그대로인데 보여주는 쪽의 해석만 다릅니다.
즉 문제는 “빛이 얼마나 들어왔나”가 아니라 “어떤 값을 검정으로 볼 것인가” 쪽에 있습니다. 이 약속을 블랙 레벨(Black Level)이라고 부릅니다.
블랙 레벨: 검정은 값이 아니라 약속
8bit 이미지 한 채널은 0부터 255까지 256단계를 갖습니다. 여기서 사람들이 당연하게 여기는 전제가 하나 있어요. 0이 검정이고 255가 흰색이라는 것.
이 전제는 절반만 맞습니다. 파일 안에 든 건 그냥 숫자예요. 그 숫자 중 어느 값을 “더 이상 어두울 수 없는 검정”으로 볼지는 파일과 프로그램 사이의 약속으로 정해집니다. 이 약속이 곧 블랙 레벨이고, 약속이 서로 다르면 같은 숫자가 다른 밝기로 화면에 그려집니다.
Full Range와 Limited Range — 블랙 레벨 약속 두 가지
이 약속에는 널리 쓰이는 두 가지가 있습니다.
| 검정 | 흰색 | 주로 쓰이는 곳 | |
|---|---|---|---|
| Full Range (Data Range) | 0 | 255 | 스틸 이미지, CG 렌더, 컴퓨터 그래픽스 일반 |
| Limited Range (Video/Legal Range) | 16 | 235 | 방송·비디오 규격 계열 |
8bit 기준 숫자입니다. 10bit에서는 같은 지점이 각각 64와 940에 해당합니다.
Limited Range가 위아래를 남겨 둔 건 실수가 아닙니다. 아날로그 시절부터 신호 처리 과정에서 값이 살짝 넘치거나 모자라는 일이 생기는데, 그때 바로 잘리지 않도록 검정 아래와 흰색 위에 여유 구간을 둔 것입니다. 이 여유 구간을 풋룸(footroom)·헤드룸(headroom)이라고 부릅니다.
문제는 여기서부터예요. 파일 하나에는 “나는 Limited Range다”라는 표시가 같이 들어가는 게 보통이지만, 그 표시가 빠지거나 받는 쪽이 무시하면 프로그램이 알아서 추측합니다. 추측이 틀리면 검정이 어긋납니다.

블랙 레벨이 어긋날 때 망가지는 두 방향
어긋남에는 방향이 있고, 방향에 따라 증상이 정반대입니다.
① Limited로 저장된 걸 Full로 읽으면 → 검정이 뜬다 파일 안 가장 어두운 값이 16인데 읽는 쪽이 0을 검정으로 잡습니다. 16은 새까만 검정이 아니라 살짝 밝은 회색으로 그려집니다. 화면이 전체적으로 뿌옇고 대비가 없어 보입니다. 명암을 다시 잡고 싶은 충동이 들지만, 여기서 커브를 눌러 버리면 원본을 덧칠하게 됩니다.
② Full로 저장된 걸 Limited로 읽으면 → 검정이 뭉개진다 이쪽이 이 글의 증상입니다. 읽는 쪽은 “16이 검정일 테니 0~255로 펴 주자”라고 판단하고 값을 늘립니다. 16을 0으로, 235를 255로 옮기는 변환이에요. 그러면 원래 파일에서 16보다 아래에 있던 값들은 갈 자리가 없어져 전부 0으로 밀립니다. 3도, 9도, 14도 전부 0이 됩니다. 턱선과 주름이 살던 구간이 통째로 한 값이 되는 겁니다.
②가 무서운 건, 그 결과를 다시 저장하거나 인코딩하면 뭉개진 상태가 파일에 굳는다는 점입니다. 그때부터는 되돌릴 값이 없어요.
감마 해석이 달라도 나오는 블랙 레벨과 같은 증상
범위만 문제인 게 아닙니다. 뷰 트랜스폼(화면에 보여주기 위한 변환) 을 뭘로 잡느냐로도 어두운 쪽은 크게 흔들립니다.
같은 값을 화면 밝기로 바꾸는 곡선은 여러 개입니다. sRGB 곡선, 감마 2.2, 방송용 Rec.709 계열 등이 다 조금씩 다릅니다. 그리고 이들의 차이는 밝은 쪽보다 어두운 쪽에서 훨씬 크게 벌어집니다.
특히 sRGB 곡선은 아주 어두운 구간에서만 직선 구간을 갖는 형태입니다. 순수한 거듭제곱 곡선(감마 2.2)과 sRGB가 갈리는 지점이 사실상 그림자 영역에 몰려 있다는 뜻이에요. 그래서 중간톤과 하이라이트는 거의 똑같아 보이는데 그림자만 달라 보이는 일이 생깁니다.
여기에 하나가 더 붙습니다. 어떤 프로그램은 색관리를 켜고 파일에 붙은 색공간 정보를 읽어 변환한 뒤 보여주고, 어떤 프로그램은 값을 그대로 화면에 던집니다. 후자에서는 파일이 어떤 곡선을 전제로 만들어졌든 상관없이 그려지니, 두 창의 그림자가 다를 수밖에 없습니다.
정리하면 블랙 레벨이 걸린 어두운 부분이 죽는 경로는 최소 세 가지입니다.
- 범위 해석 불일치 (Full ↔ Limited)
- 감마·뷰 트랜스폼 해석 불일치
- 값이 실제로 잘려서 저장됨 (클리핑)
앞의 둘은 설정 문제라 되돌릴 수 있습니다. 셋째는 못 되돌립니다. 그래서 진단의 목표는 셋째인지 아닌지를 먼저 가르는 것입니다.
32bit·EXR에서 셋째가 잘 안 생기는 이유
셋째가 생기는 이유는 값이 정해진 칸 안에 들어가야 하기 때문입니다. 8bit·16bit 정수 포맷에는 0보다 작은 자리가 아예 없어서, 검정 아래로 내려간 값은 저장되는 순간 0에 붙습니다. 32bit float 방식은 그 전제가 다릅니다. 0보다 작은 값도, 1보다 큰 값도 숫자로 그대로 담을 수 있어서 검정 아래로 밀린 값이 잘리지 않고 남습니다.
그래서 같은 실수를 해도 결과가 다릅니다. EXR로 주고받는 중간 산출물은 블랙 레벨 해석이 어긋나 화면이 뭉개져 보여도 값은 파일 안에 그대로 있고, 설정만 되돌리면 형태가 다시 나옵니다. VFX 파이프라인이 중간 파일을 OpenEXR로 넘기는 이유가 여기 있어요. 32bit float가 실제로 무엇을 저장하는지는 흰색보다 밝은 값이 저장된다 — 32bit Float가 하는 일에서, EXR과 PNG에 담기는 값이 어떻게 다른지는 VFX가 PNG 대신 EXR을 쓰는 이유 — 저장되는 값이 다르다에서 다룹니다.
눌린 것과 잘린 것의 차이
말이 비슷해서 자주 섞이는데, 이 둘은 완전히 다른 상태입니다.
눌린 것(compressed) — 그림자 값들이 좁은 구간에 몰려 있습니다. 3, 5, 6, 9처럼 서로 다른 값이 여전히 남아 있습니다. 눈에는 다 검정으로 보이지만 정보는 있어요. 노출이나 감마를 올리면 형태가 다시 나옵니다.
잘린 것(clipped) — 원래 서로 달랐던 값들이 전부 같은 하나의 값이 됐습니다. 전부 0입니다. 3이었는지 9였는지 파일 안에 남아 있지 않습니다. 노출을 아무리 올려도 평평한 회색 판이 될 뿐 형태가 안 나옵니다.
히스토그램에서도 구분이 됩니다. 눌린 쪽은 왼쪽 끝 근처에 산이 붙어 있고, 잘린 쪽은 맨 왼쪽 한 칸에 벽처럼 솟은 막대가 생깁니다. 그 막대가 클리핑의 흔적이에요.

블랙 레벨 확인 절차: 눈이 아니라 값으로 보기
화면을 보고 판단하면 안 됩니다. 화면은 이미 해석을 거친 결과예요. 순서대로 확인합니다.
1단계 — 검은 영역에 피커를 찍습니다 디테일이 있어야 할 그림자 영역 안에서 서로 떨어진 지점 3~4곳을 찍어 값을 적습니다. 한 곳만 찍으면 눌린 건지 잘린 건지 알 수 없어요. 값이 서로 다르면 정보가 남아 있는 것이고, 넓은 영역이 전부 같은 값이면 잘린 것입니다. Nuke는 뷰어에서 픽셀 값을 직접 읽는 도구를, Photoshop은 정보 패널과 스포이드를 씁니다. 다만 두 프로그램 모두 버전에 따라 패널 이름과 위치가 달라서, 여기서는 “픽셀값을 숫자로 읽는 기능”이라고만 해 둡니다.
2단계 — 그 숫자가 어느 눈금에 붙어 있는지 봅니다 0에 붙어 있는지, 16 근처인지, 음수인지가 갈림길입니다. 판단표는 아래에 있어요.
3단계 — 히스토그램을 봅니다 0 지점에 벽이 있는지 확인합니다. 벽이 있으면 그 픽셀들은 이미 같은 값입니다.
4단계 — 감마나 노출을 임시로 올려 봅니다 파일을 고치는 게 아니라 보기만 밝게 하는 조작이어야 합니다. 뷰어의 게인·감마 슬라이더처럼 원본을 건드리지 않는 자리를 씁니다. 여기서 형태가 살아나면 정보가 남아 있는 것이고, 평평한 회색만 밝아지면 잘린 것입니다. 확인이 끝나면 반드시 원래대로 되돌립니다. 이 값을 올린 채 작업하면 판단 기준 자체가 어긋납니다.
5단계 — 어긋난 쪽을 찾습니다 정보가 남아 있다고 확인됐다면, 이제 원본이 아니라 읽기·내보내기 설정을 봅니다. 파일을 읽어 들이는 노드나 임포트 옵션의 색공간·범위 설정, 그리고 뷰어의 디스플레이 설정 두 곳입니다. 인코딩 단계에서 범위 표기가 붙는 경우도 있으니 내보내기 설정도 같이 확인합니다.


블랙 레벨 판단 기준표
찍어 본 값과 반응을 이 표에 대입합니다.
| 찍은 값 (8bit 기준) | 감마를 올렸을 때 | 상태 | 대응 |
|---|---|---|---|
| 넓은 영역이 전부 정확히 0 | 형태 안 나옴, 회색 판만 | 이미 잘림 | 이 파일로는 복구 불가. 렌더·촬영 원본으로 되돌아간다 |
| 1~15 사이에서 값이 서로 다름 | 형태가 나옴 | 눌려 있음 | 값은 살아 있다. 뷰 트랜스폼·범위 설정을 먼저 점검 |
| 가장 어두운 값이 16 근처에서 멈춤 | 형태가 나옴 | Limited Range 소스일 가능성 | 읽는 쪽을 Limited로 맞춘다. 이미 0~255로 펼쳐 놨다면 그 변환을 끈다 |
| 검정이 회색으로 뜨고 값도 16 이상 | — | Limited를 Full로 읽는 중 | 범위 해석을 맞춘다. 커브로 눌러서 덮지 않는다 |
| 음수 값이 찍힘 (float 파일) | 형태가 나옴 | 검정 아래 값이 남아 있음 | float 상태에서 처리한다. 정수 포맷으로 내보내는 순간 잘린다 |
| 프로그램마다 값은 같은데 밝기만 다름 | — | 뷰 트랜스폼 해석 차이 | 파일이 아니라 각 프로그램의 디스플레이 설정을 맞춘다 |
표에서 갈리는 지점은 하나입니다. 값이 서로 다른가, 전부 같은가. 다르면 설정 싸움이고, 같으면 원본 싸움입니다.
여기서 안 통하는 경우
- 이미 잘려서 저장된 파일. 앞에서 먼저 밝힌 그대로입니다. 8bit·16bit 정수 포맷에는 0보다 작은 값을 담을 자리가 없습니다. 잘린 뒤 저장된 파일에서는 어떤 설정을 바꿔도 형태가 안 나옵니다. 이건 한계지 실력 문제가 아니에요.
- 압축 코덱을 거친 소스. 강하게 압축된 영상은 어두운 구간의 계조가 인코딩 단계에서 이미 줄어듭니다. 범위 설정을 맞춰도 원래 있던 만큼 다 돌아오지는 않습니다.
- 애초에 빛이 없던 영역. 라이팅 단계에서 실제로 광량이 0에 가까웠다면 그건 해석 문제가 아닙니다. 이 경우엔 라이트를 다시 잡는 게 맞습니다. 값을 찍어 보면 판별돼요.
- 최종 표시 장치. 폰과 모니터는 어두운 구간을 그리는 능력 자체가 다릅니다. 파일이 정상이어도 기기 차이는 남습니다. 다만 그 차이는 “덩어리 검정”이 아니라 “조금 더 어두움”으로 나타납니다.
한 줄 정리
어두운 부분이 통째로 죽었을 때 먼저 만질 것은 라이트도 모니터도 아니고, 검은 영역의 실제 값입니다. 값이 서로 다르면 설정을 맞춰 되살릴 수 있고, 전부 같으면 그 파일에는 이미 남아 있지 않습니다.
같은 계열의 다른 증상은 다음 글에서 이어집니다. 그라데이션에 계단이 생기는 문제는 하늘 그라데이션에 계단이 생겼다면: 비트 뎁스와 디더링, 감마 곡선 자체가 왜 그렇게 생겼는지는 감마 2.2는 왜 하필 2.2인가 — 눈과 화면 사이의 보정에서 다룹니다.
마무리
블랙 레벨 문제는 결국 질문 하나로 좁혀집니다. 지금 눈앞의 검정이 아직 살아 있는데 안 보이는 것인지, 이미 죽어서 없는 것인지요. 그리고 그 답은 화면이 아니라 그림자 영역의 실제 값에 적혀 있습니다. 다음에 어두운 부분이 통째로 무너져 보이면, 라이트를 다시 잡기 전에 서로 떨어진 세 지점을 찍어 값이 다른지부터 확인해 보시면 됩니다. 값이 서로 다르면 설정을 맞춰 되살릴 수 있고, 넓은 영역이 전부 0이면 그때는 원본으로 돌아가는 쪽이 가장 빠른 길이에요.
자주 묻는 질문(FAQ)
Q1. 유튜브나 SNS에 올린 뒤에만 그림자가 무너져 보이면 뭘 먼저 볼까요? 업로드하기 전 파일에서 먼저 그림자 값을 찍어 두시면 비교가 쉬워집니다. 원본은 값이 서로 다른데 업로드본만 한 덩어리로 붙었다면 재인코딩 과정의 범위 해석을 의심해 볼 수 있어요. 다만 처리 방식이 플랫폼과 업로드 포맷마다 달라서, 어디서 바뀌는지는 환경에 따라 다릅니다.
Q2. 파일에 Full/Limited 표시를 붙여 두면 이 문제가 안 생기나요? 표시가 붙어 있으면 받는 쪽이 추측할 일이 줄어드니 확실히 유리합니다. 다만 그 표시를 담는 자리와 실제로 읽는지 여부가 컨테이너·코덱·프로그램마다 달라서 완전히 막아 주지는 못해요. 결국 받는 쪽에서 값을 한 번 찍어 확인하는 절차는 남는다고 보시면 됩니다.
Q3. 이미 잘린 걸 확인했는데 원본을 구할 수 없으면 어떻게 하나요? 그 파일 안에는 되살릴 값이 남아 있지 않아서 복구는 안 됩니다. 남는 선택지는 해당 영역을 다시 만들거나, 잘린 부분이 덜 드러나도록 컷 전체의 톤을 다시 잡는 쪽이에요. 어느 쪽이 현실적인지는 남은 일정과 컷 상황에 따라 다릅니다.
vfx 잡학지식



댓글 0
첫 댓글을 남겨보세요.