sRGB 감마 인코딩의 구체적인 작동 방식
sRGB 표준은 리니어 값(L)을 sRGB 값(V)으로 변환하는 공식을 정의합니다.
여기서 '리니어 값'은 물리적인 빛의 강도를 0.0(완전 어두움)부터 1.0(완전 밝음) 사이의 범위로 표현한 값입니다. 'sRGB 값'은 우리가 이미지 파일이나 모니터에서 보게 되는 0.0부터 1.0(또는 8비트의 경우 0부터 255) 사이의 비선형적인 값입니다.
sRGB 변환은 단순히 단일 감마 지수를 적용하는 것보다 약간 더 복잡한 두 부분으로 나뉩니다. 이는 특히 어두운 영역에서의 정확성과 부드러운 전환을 위한 것입니다.
선형 구간 (Linear Segment):
아주 어두운 영역 (L≤0.0031308)에서는 리니어하게 변환됩니다.
공식: V=12.92×L
이 작은 선형 구간은 0에 가까운 값에서 발생하는 감마 곡선의 급격한 변화로 인한 문제를 방지하고, 정확한 검은색 표현을 돕습니다.
비선형 감마 구간 (Non-linear Gamma Segment):
대부분의 밝기 범위 (L>0.0031308)에서는 다음과 같은 비선형 감마 함수가 적용됩니다.
공식: V=1.055×L^(1/2.4) -0.055
여기서 L ^(1/2.4) 부분이 바로 감마 보정에 해당하는 부분입니다.
지수 1/2.4는 약 0.4167에 해당합니다. (많은 사람들이 sRGB의 감마를 대략 2.2로 말하지만, 실제 표준은 1/2.4와 약간의 선형 구간을 포함합니다. 평균적인 유효 감마는 약 2.2에 가깝습니다.)
1.055와 0.055는 스케일링 및 오프셋 상수이며, 이는 감마 곡선을 sRGB의 특정 범위에 맞게 조정합니다.
감마의 역사적 배경: 오래된 음극선관(CRT) 모니터는 빛을 선형 방식으로 표시하지 않았기 때문에, 카메라가 이미지를 저장할 때 자동으로 감마 보정(거의 제곱근과 유사한)을 적용했습니다
이는 모니터의 감마 효과(거의 제곱과 유사한)와 상쇄되어 올바른 밝기를 구현했습니다.
감마 공간의 문제점: 단순히 사진을 보는 경우에는 문제가 되지 않지만, 여러 이미지를 혼합하거나 3D CGI에서 여러 광원을 함께 사용할 때 문제가 발생합니다.
감마 공간에서 광원을 더하면 원치 않는 교차 항이 발생하여 조명 결과가 부정확해집니다.
이로 인해 게임 디자이너는 특정 장면에 맞게 조명을 수동으로 미세 조정해야 했고, 새로운 조명을 추가할 때 문제가 발생했습니다.
선형 공간(Linear Space)의 해결책: 이 문제의 해결책은 텍스처를 읽을 때마다 감마 보정을 해제하고 (거의 제곱), 모든 수학적 연산(조명 추가 등)을 선형 공간에서 수행한 다음, 최종 픽셀 값을 화면에 쓰기 전에 다시 감마 보정을 적용하는 것입니다 (거의 제곱근).
GPU 지원: 최신 GPU는 이러한 색 공간 변환을 위한 하드웨어를 내장하고 있어, 픽셀 셰이더에서 직접 계산할 필요 없이 성능 저하 없이 이 작업을 수행할 수 있습니다.
Unity의 변화:
Unity 4 이전: Unity Pro 버전에서만 GPU 가속 선형 공간 조명이 지원되었고, 무료 버전에서는 셰이더 코드에서 수동으로 이를 처리해야 했습니다.
Unity 5 이후: Unity 5부터는 무료 및 유료 버전 간의 기능 차이가 크게 줄어들어, GPU 가속 선형 공간 조명이 기본적으로 지원됩니다. 이는 물리 기반 렌더링(PBR)을 제대로 구현하기 위해 필수적이기 때문입니다.
Unity 설정 확인: 강사는 Unity 2020.1 베타를 사용하여 프로젝트 설정에서 기본적으로 감마 색 공간이 선택되어 있다는 점을 지적하며, 3D 그래픽스 작업을 할 때는 항상 이를 선형 색 공간으로 변경해야 한다고 강조합니다.
고해상도 렌더 파이프라인(HDRP) 및 범용 렌더 파이프라인(URP)과 같은 최신 렌더 파이프라인은 기본적으로 선형 색 공간으로 설정되어 있습니다.
리니어 공간 출력 파이프라인
[sRGB Texture]
↓ (자동 디코딩)
[Linear Space Texture]
↓
[Lighting & Shading 계산 (선형)]
↓
[Post Processing (선형, HDR)]
↓
[Gamma Correction / sRGB Encoding]
↓
[디스플레이 출력 (sRGB 디스플레이)]