본문 바로가기
vfxai 잡학지식 vfxai 잡학지식

32bit Float 이미지란? 눈에 보이지 않는 HDR 데이터의 세계

vfx 잡학지식 읽는 시간 약 9분 조회 8

VFX 작업을 하다 보면 32bit float 이미지라는 말을 정말 자주 듣게 되는데요, 화면에 뻔히 하얗게 다 날아가 보이는 하이라이트인데 “데이터는 살아있다”는 말을 들으면 처음엔 다들 어리둥절해합니다. 오늘은 이 신비한 float 이미지의 정체를 아주 쉬운 비유로 풀어보겠습니다.

정수 vs 부동소수점, 칸이 정해진 서랍과 자유로운 눈금자

먼저 8bit 이미지를 생각해볼게요. 8bit는 정수(integer) 방식인데, 이건 딱 256개 칸(0~255)만 있는 서랍장이라고 보시면 됩니다. 검은색은 0번 칸, 흰색은 255번 칸이고, 그 사이 어딘가에 모든 밝기 값이 억지로 끼워 맞춰져 들어갑니다. 칸이 정해져 있으니 딱 그만큼만 표현할 수 있고, 그 이상도 이하도 없습니다.

반면 float(부동소수점) 방식은 서랍이 아니라 눈금이 자유롭게 움직이는 자입니다. 0과 1 사이에도 무한히 촘촘한 눈금을 그을 수 있고, 심지어 1을 넘어서도 눈금이 계속 이어집니다. 즉 “몇 번째 칸이냐”가 아니라 “실제로 얼마나 밝으냐”를 그대로 숫자로 담는 방식이에요. 이 차이가 VFX 파이프라인 전체를 뒤흔드는 핵심입니다.

1.0을 넘는 값과 음수, 그게 왜 중요할까요

8bit나 심지어 일반 16bit 정수 이미지에서는 흰색(255 혹은 65535)이 곧 “표현 가능한 가장 밝은 값”이자 물리적인 한계였습니다. 그런데 현실 세계의 빛은 그렇게 작동하지 않죠. 태양은 모니터가 표현할 수 있는 흰색보다 수천, 수만 배 더 밝습니다.

float 이미지는 1.0(모니터 기준 흰색)을 훌쩍 넘는 값, 이를테면 50.0이나 1000.0 같은 값도 그대로 저장할 수 있습니다. 이게 바로 HDR(High Dynamic Range, 넓은 밝기 범위)의 정체예요. 화면에는 어차피 1.0 이상은 다 하얗게 뭉개져 보이지만, 파일 안에는 “이 픽셀은 사실 이만큼 밝았다”는 정보가 고스란히 남아있습니다.

음수 값도 마찬가지로 의미가 있습니다. 컴포지팅 과정에서 색을 빼거나(subtract), 특정 연산 결과가 0 아래로 내려가는 경우가 실제로 생기는데, 정수 방식이었다면 이 값은 그냥 0으로 잘려버립니다(클리핑). float은 음수를 그대로 들고 있다가, 나중에 다른 레이어와 합쳐지면서 원래 의도한 결과로 정확히 복원될 수 있게 해줍니다.

Half Float(16bit)과 Full Float(32bit), 정밀도의 차이

float에도 등급이 있습니다. 실무에서 가장 많이 마주치는 두 가지가 half float(16bit)과 full float(32bit)입니다.

  • Half float(16bit): 유효자릿수가 약 10비트(가수부)로, 십진수로 환산하면 약 3~4자리 정밀도를 가집니다. 표현 가능한 범위는 대략 ±6만 정도까지고, 아주 작은 값 쪽은 6.1×10⁻⁵ 근처부터 표현이 가능합니다. 렌더링 결과물이나 컴포지팅 중간 단계에서 용량과 품질의 균형을 잡을 때 널리 쓰입니다.
  • Full float(32bit): 유효자릿수가 23비트 가수부로, 십진수 약 7자리 정밀도를 가집니다. 표현 범위도 ±3.4×10³⁸ 수준으로 사실상 실무에서 만날 일이 없을 만큼 넓습니다. 정밀도가 생명인 데이터(뎁스, 모션벡터 등)에는 이쪽이 필요합니다.

즉 half float은 “충분히 넓고 가벼운” 절충안이고, full float은 “정밀도가 절대적으로 필요한 데이터”를 위한 선택입니다. 참고로 half float은 용량이 8bit 정수보다는 크지만 32bit full float의 딱 절반이라, 렌더팜 저장 공간과 IO 속도를 고려할 때 굉장히 자주 선택되는 포맷이에요.

화면엔 안 보여도 데이터는 살아있다 — 하이라이트의 비밀

여기가 오늘 글의 핵심입니다. 태양이나 전구 필라멘트를 렌더링하면 모니터에는 그냥 새하얀 덩어리로 보입니다. 8bit였다면 이건 정말로 정보가 사라진 상태(클리핑)예요. 255에서 잘려버렸으니 그 안에 어떤 모양이 있었는지, 얼마나 밝았는지 다시는 알 수 없습니다.

하지만 float 이미지라면 이야기가 다릅니다. 화면 출력을 위해 0~1 범위로 눌러서 보여줄 뿐이지, 실제 데이터에는 전구 코어가 300.0이었는지 800.0이었는지가 그대로 저장되어 있습니다. 비유하자면 사진을 인화할 때 종이가 표현 못 하는 부분이 하얗게 날아간 것처럼 “보이는” 것뿐이고, 원본 필름(float 데이터)에는 모든 정보가 그대로 남아있는 셈이죠.

노출 조절로 되살아나는 디테일

이 살아있는 데이터는 노출(exposure) 조절로 눈에 보이게 끌어낼 수 있습니다. 컴포지팅 소프트웨어에서 뷰어의 노출 스탑을 마이너스 방향으로 내려보면, 방금까지 새하얗던 태양 안에서 갑자기 코로나의 결이나 전구 필라멘트의 형태가 스멀스멀 드러나는 걸 볼 수 있어요.

이건 사진에서 노출을 낮춰 하이라이트 디테일을 살리는 것과 똑같은 원리입니다. 8bit 이미지로는 애초에 잘려나간 정보라 아무리 노출을 조절해도 그냥 회색 덩어리만 나올 뿐이지만, float 이미지는 그 안에 진짜 값이 살아있기 때문에 노출만 바꿔도 디테일이 자연스럽게 복원됩니다. 이 특성 덕분에 컬러리스트나 컴포지터는 초반부터 “가장 예쁜 노출”을 확정하지 않고, 최종 단계에서 자유롭게 밝기를 재조정할 여지를 가질 수 있습니다.

어떤 작업에 32bit가 꼭 필요할까

모든 파일을 다 32bit로 쓸 필요는 없습니다. 하지만 아래 작업들은 32bit float 정밀도가 사실상 필수입니다.

  • 디스플레이스먼트맵: 지형이나 얼굴 주름처럼 미세한 높이 차이를 표현할 때, 정밀도가 떨어지면 표면에 계단 같은 얼룩(밴딩)이 그대로 드러납니다.
  • Z뎁스(깊이) 패스: 카메라부터 물체까지 거리를 담는 패스인데, 이 값을 이용해 디포커스나 안개 효과를 후반에 적용하기 때문에 값이 부정확하면 초점 위치가 미묘하게 어긋나 버립니다.
  • 모션벡터: 픽셀이 프레임 간 얼마나 움직였는지를 담은 패스로, 리타이밍이나 모션 블러 재생성에 쓰이는데 정밀도가 낮으면 움직임이 끊기거나 떨리는 결과가 나옵니다.
  • 딥 컴포지팅(Deep Compositing): 픽셀 하나에 여러 깊이의 색상·투명도 정보를 겹겹이 쌓아 저장하는 방식으로, 애초에 float 기반이 아니면 성립하지 않는 개념입니다.

반대로 최종 딜리버리용 마스터나 참고용 프리뷰처럼 이미 색보정이 끝나고 화면에 보이는 그대로만 필요한 경우에는 8bit나 10bit 정수로도 충분한 경우가 많습니다.

파일 용량과 성능, 그리고 트레이드오프

당연히 공짜는 없습니다. 아래 표로 간단히 비교해볼게요.

구분8bit 정수Half Float(16bit)Full Float(32bit)
픽셀당 용량(채널당)1바이트2바이트4바이트
십진수 정밀도매우 낮음약 3~4자리약 7자리
1.0 초과 값 저장불가가능가능
음수 값 저장불가가능가능
대표 용도최종 출력, 웹용 이미지렌더 결과물, 일반 컴포지팅뎁스·모션벡터·디스플레이스먼트
파일 용량/처리 부담가장 가벼움중간가장 무거움

실무에서는 이 표를 감안해서 “지금 이 패스가 정말 32bit 정밀도가 필요한가”를 늘 따져봅니다. 무작정 다 32bit로 저장하면 디스크 용량과 IO 대역폭이 급격히 늘어나고, 렌더팜이나 캐시 읽기 속도가 눈에 띄게 느려지기 때문이에요. 반대로 필요한 곳에서 정밀도를 아끼면 나중에 되돌릴 수 없는 아티팩트(밴딩, 끊긴 모션 등)로 돌아옵니다. 그래서 “필요한 곳엔 32bit, 아닌 곳엔 half float이나 정수”라는 절충이 현업의 기본 원칙입니다.

자주 묻는 질문(FAQ)

Q1. OpenEXR 파일은 무조건 32bit인가요? 아닙니다. OpenEXR은 컨테이너 포맷일 뿐이고, 그 안에 half float(16bit)로 저장할지 full float(32bit)로 저장할지는 선택할 수 있습니다. 실제로 많은 스튜디오가 렌더 결과물은 half float으로, 뎁스나 모션벡터 같은 정밀도가 중요한 패스만 골라서 32bit로 저장합니다.

Q2. float 이미지를 8bit 모니터로 보면 손해 아닌가요? 모니터 자체는 여전히 제한된 밝기 범위만 보여주지만, 손해는 아닙니다. 원본 데이터는 파일 안에 그대로 보존되어 있고, 뷰어의 노출이나 톤매핑 설정만 바꾸면 언제든 다른 밝기 구간을 확인할 수 있습니다. 즉 “지금 화면에 안 보인다”와 “데이터가 없다”는 완전히 다른 이야기입니다.

Q3. half float과 32bit 중 어떤 걸 기본값으로 쓰는 게 좋을까요? 일반적인 렌더 결과물이나 컴포지팅 중간 산출물은 half float으로도 대부분 충분하고 용량 면에서 훨씬 유리합니다. 다만 디스플레이스먼트, Z뎁스, 모션벡터처럼 미세한 오차가 그대로 시각적 결함으로 드러나는 데이터는 32bit full float을 쓰는 것이 안전합니다.

vfx 잡학지식

함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.