Quick Reference
색은 sRGB로 저장·표시할 수 있지만 조명과 HDR 계산은 linear에서 수행하고, normal·roughness·mask 같은 수치 데이터에는 sRGB 변환을 적용하지 않습니다.
| 개념 | 의미 |
|---|---|
| Linear | 물리 계산에 맞는 선형 밝기 값 |
| sRGB | 사람이 보기 좋게 감마 인코딩된 색 공간 |
| Gamma correction | linear 결과를 표시 장치에 맞게 변환 |
| Albedo texture | 보통 sRGB로 저장 |
| Normal/Roughness texture | 보통 데이터라 linear로 취급 |
| asset 또는 buffer | 읽기·쓰기 규칙 |
|---|---|
| base color, emissive color | sRGB asset을 sampling 때 linear로 decode |
| normal, roughness, metallic, mask | linear data로 읽고 sRGB conversion 금지 |
| scene HDR buffer | linear 값으로 lighting과 post-process |
| display output | tone mapping 뒤 output transform 한 번 |
구조
조명 계산은 빛의 양을 더하고 곱하는 계산입니다. 이런 물리적 계산은 linear space에서 해야 합니다. sRGB 값은 사람이 보는 밝기 감각에 맞게 인코딩되어 있으므로, 그대로 조명 계산에 쓰면 결과가 어둡거나 부자연스러워질 수 있습니다.
sRGB texture -> decode to linear -> lighting -> encode to sRGB output색으로 보는 텍스처와 데이터로 쓰는 텍스처를 구분해야 합니다. albedo/base color는 색이므로 sRGB decode가 필요할 수 있지만, normal, roughness, metallic, mask는 수치 데이터라 감마 변환하면 안 됩니다.
감마 보정
감마 보정은 linear로 계산된 결과를 표시 장치와 sRGB 출력에 맞게 변환하는 과정입니다. 보통 최종 출력 직전에 적용됩니다.
texture 파일의 색 공간, GPU texture format의 sRGB decode, render target의 sRGB encode는 서로 다른 지점입니다. asset importer에서 sRGB로 표시했다고 해서 shader input과 final output까지 자동으로 맞는 것은 아닙니다. 어떤 단계가 decode하고 어떤 단계가 encode하는지 renderer 단위로 한 번만 정합니다.
텍스처 기준
| 텍스처 종류 | 보통 취급 |
|---|---|
| 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가 꺼져 있는지 확인하세요.
linear buffer에 이미 tone mapping한 LDR 값을 다시 합성하거나, UI 색을 scene HDR 값처럼 합성하면 예상한 색이 달라집니다. UI를 tone mapping 전후 어느 공간에 합성하는지와 alpha 표현도 같은 output 계약으로 유지해야 합니다.
참고 링크
1 sources