2023. 6. 7. 18:23ㆍUnity
sRGB
사진 텍스쳐는 sRGB를 켜고 Normal Map이나 Ambient Occlusion 텍스쳐 등 셰이더 계산에 사용되는 데이터 텍스쳐는 sRGB를 끈다.
감마 보정
채널당 8비트의 색 표현도 결국 밴딩 현상이 일어나지만 아주 미세하게 발생해서 잘 느끼지 못할 뿐이다. 감마보정은 어두운 부분의 밴딩 현상을 최소화하는 보완책이다.
왼쪽은 0.45 제곱의 지수 그래프로 0.45 만큼 감마 인코딩할 때 포토샵에서도 같은 모양의 그래프를 볼 수 있다. 모니터에 출력될 때 다시 어둡게 디코딩될 것을 전제로 이미지를 조금 밝게 저장한다.
오른쪽은 2.2 제곰의 지수 그래프로 2.2 감마 디코딩을 나타내며 다시 어둡게 디코딩해서 모니터에 출력한다.
GLSL 그래프를 살펴보면 지수 함수로 바뀌면서 낮은 영역에서는 차이가 많이 없다가 1에 가까워질수록 급격하게 높아지는 전형적인 지수함수의 특징을 볼 수 있다. 이 말은 즉 "인코딩과 디코딩 절차를 거치면 RAW 원본 파일을 바로 밴딩한 것보다 어두운 영역의 색 정보가 더 조밀한 결과를 볼 수 있다."는 말이다. 베버의 법칙에 의해 우리 눈은 어두운 환경의 변화를 더 민감하게 받아들이기 때문에 더 좋은 효과를 낼 수 있다.
인코딩과 디코딩 숫자의 기준은 서로가 역수 관계라는 것이다. 0.45의 역수는 2.2이다. (1 / 0.45 = 2.2)
Gamma & Linear
유니티 에디터의 위쪽 [Edit] 탭을 보면 [Project Setings]가 있다. 여기서 [Player] - [Other Settings] - [Color Space]에서 Gamma 또는 Linear를 선택할 수 있다. 전반적으로 색감에 매우 큰 변화이므로 프로젝트 초반에 검토해야 하는 옵션이다.
Gamma Workflow에서는 Linear로 찍힌 RAW 파일을 sRGB(지수함수 형식의 그래프)인 JPG/PNG로 저장하고 셰이더에서 동일하게 계산한 후 감마 디코딩으로 모니터에 Linear로 출력한다.
Linear Workflow에서는 Linear로 찍힌 RAW 파일을 sRGB 형식의 JPG/PNG로 저장한 후 해당 텍스쳐를 셰이더에서 읽어올 때 하드웨어 샘플링을 통해 빠르게 Linear로 변환된다. 셰이더에서 Linear 형식으로 계산한 후 다시 sRGB 형식으로 출력하여 모니터에는 Linear로 출력한다.
정리하면, Gamma Worklow는 sRGB 공간에서 밝아진 상태로 셰이더 계산을 하고, Linear Workflow에서는 정상적인 밝기로 셰이더 계산을 한다.
좌측이 [Gamma]로 설정한 결과이고 우측이 [Linear]로 설정한 결과이다.
램버트 코사인 법칙에 의해 Linear 설정이 좀 더 사실적인 표면 셰이딩과 컬러 리스폰스를 보여준다.
https://docs.unity3d.com/kr/2021.2/Manual/LinearRendering-LinearOrGammaWorkflow.html
유니티 메뉴얼에 예시가 잘 나와있다.
텍스쳐 sRGB 옵션
텍스쳐의 Inspector 안에 [sRGB]를 켜고 끌 수 있다. 프로젝트 세팅을 Linear로 설정하고 이 [sRGB] 옵션을 켜고 끔으로써 차이를 비교할 수 있다. 텍스쳐 절반의 위쪽은 GrayGradient를 나타내고 아래쪽 절반은 0.5가 되는 부분을 구분 지어준 HLSL 코드가 적용되어 있다.
좌측은 포토샵에서 보는 그래디언트와 동일하게 보이지만, 0.5 위치는 중간이 아니다. 즉, 시각적으로는 익숙하게 처리하지만 정확한 데이터로 사용할 수 없는 텍스쳐가 된다.
우측은 포토샵 모니터에서 보던 모습과는 다르게 밝은 sRGB 모습을 보여준다. 시각적으로는 어색하나 셰이더 데이터 연산 용도로 정확한 값을 얻어올 수 있다.(AO, Noraml Map, Thickness Map, Cavitiy Map, Metallic Map, Smoothness Map 등셰이더에 필요한 데이터)
sRGB 옵션이 켜져있으면 사진 텍스쳐라는 뜻이다. Linear 감마 보정을 해야 정상적인 밝기가 된다. JPG/PNG에서 Shader로 가져올 때 Linear 감마 보정을 거쳐 어둡게 가져온다.
sRGB 옵션이 꺼져있으면 데이터 텍스쳐라는 뜻이다. JPG/PNG에서 Shader로 가져올 때 Linear 감마 보정을 생략한다.
참고자료
'Unity' 카테고리의 다른 글
[Unity] URP 셰이더 HLSL 텍스쳐 적용 (0) | 2023.06.09 |
---|---|
[Unity] URP 셰이더 HLSL 구조와 _BaseColor 적용 (0) | 2023.06.08 |
[Unity] URP 셰이더 Z Buffer와 반투명(Translucent) (0) | 2023.06.07 |
[Unity] URP 셰이더 Sub Graph, Custom Lighting, Keyword (0) | 2023.06.05 |
[Unity] 텍스쳐와 UV를 이용한 셰이더 (Tiling, Offset, Scrollout) (0) | 2023.06.05 |