핵심 정리
| 개념 | 의미 |
|---|---|
| Linear | 물리 계산에 맞는 선형 밝기 값 |
| sRGB | 사람이 보기 좋게 감마 인코딩된 색 공간 |
| Gamma correction | linear 결과를 표시 장치에 맞게 변환 |
| Albedo texture | 보통 sRGB로 저장 |
| Normal/Roughness texture | 보통 데이터라 linear로 취급 |
구조
조명 계산은 빛의 양을 더하고 곱하는 계산입니다. 이런 물리적 계산은 linear space에서 해야 합니다. sRGB 값은 사람이 보는 밝기 감각에 맞게 인코딩되어 있으므로, 그대로 조명 계산에 쓰면 결과가 어둡거나 부자연스러워질 수 있습니다.
sRGB texture -> decode to linear -> lighting -> encode to sRGB output색으로 보는 텍스처와 데이터로 쓰는 텍스처를 구분해야 합니다. albedo/base color는 색이므로 sRGB decode가 필요할 수 있지만, normal, roughness, metallic, mask는 수치 데이터라 감마 변환하면 안 됩니다.
감마 보정
감마 보정은 linear로 계산된 결과를 표시 장치와 sRGB 출력에 맞게 변환하는 과정입니다. 보통 최종 출력 직전에 적용됩니다.
텍스처 기준
| 텍스처 종류 | 보통 취급 |
|---|---|
| Base color, albedo | sRGB |
| Emissive color | sRGB 또는 의도에 따라 HDR |
| Normal map | linear data |
| Roughness, metallic | linear data |
| AO, mask | linear data |
| HDR lighting buffer | linear |
렌더링 결과가 “이상하게 탁함”, “너무 어두움”, “색이 씻겨 보임” 같은 문제는 color space 설정이 원인인 경우가 많습니다.
주의할 점
감마 보정을 두 번 적용하면 화면이 밝게 뜨고, 한 번도 적용하지 않으면 어둡게 보일 수 있습니다. 텍스처 import, shader sampling, framebuffer output이 각각 어떤 색 공간을 쓰는지 확인해야 합니다.
데이터 텍스처를 sRGB로 읽는 실수는 매우 흔합니다. normal map이나 roughness가 이상하면 먼저 sRGB decode가 꺼져 있는지 확인하세요.
참고 링크
1 sources