반응형

 

 

 

 

유니티에서는 색공간 옵션에 Gamma와 Linear가 존재한다.

Linear의 경우 사실적인 색이 표현되고, Gamma의 경우 사람의 눈에 자연스럽게 느껴지는 색으로 표현이된다.

 

위 그라데이션 이미지는 사람이 보기에 Gamma가 더 자연스러워 보이지만 Linear에서 표현된 색이 진짜 그라데이션 색상이다. 하지만 사람이 볼때 Linear 그라데이션이 어색해보이는데 해당 현상은 베버의 법칙으로 설명할 수 있다.

 

베버의 법칙은 간단하게 설명하면, 자극이 없던곳에 추가된 자극은 민감하게 느끼고(Linear의 검은부분에서 흰색으로 넘어가는 부분) 이미 자극을 받은 상태에서는 자극이 추가(Linear의 회색에서 흰색으로 넘어가는부분)되도 민감하게 느껴지지 않는다는 말이다.

그렇기 때문에 Linear그라데이션에서는 진짜 색인데도 불구하고 사람이 볼때에는 어색해보인다.

 

그렇기 때문에 기존 Linear 색에서 출력을 더 떨어뜨려서 사람이 인지할때 자연스럽게 보이게하는게 Gamma 보정이다.

이렇게 모니터에 출력될 때 Gamma 보정이 들어가기 때문에 기존의 Linear 이미지를 저장할 때 기존 이미지의 색상보다 더 밝게하여 저장한다.(sRGB라 한다.)

 

이걸로 Linear와 Gamma의 차이를 알아보았고, 파이프라인에서의 차이점을 알아보자.

만약 Add 이펙트를 사용한다고 가정했을때 각 파이프라인에서의 처리는 다음과 같다.

 

 

 

Gamma 파이프라인

  • Gamma 파이프라인에서는 sRGB상태에서 Add를 하게된다. 그렇게되면  겹치는 부분에서 너무 밝아져서 해당 부분의 색상 데이터가 날아가버리게된다.
  • 이런 상태에서 Gamma 보정이 들어가면 결과적으로 하얗게 뜨게되어 어색하게보인다.

※ 위 그림에서 Linear는 파이프라인을 뜻하는게 아니라, 원본 이미지라고 생각하면 된다.

 

 

 

Linear 파이프라인

  • Gamma 파이프라인과 다르게 sRBG 영역에서 더하지 않고 Add 연산을 하기전에 엔진에서 어둡게 샘플링을 한다음 Add처리를 한다. (Linear를 지원하는 하드웨어에서는 샘플링시에 코스트가 들어가지 않는다.)
  • 해당 결과를 sRBG로 밝게해서 저장한 뒤 디스플레이로 출력하게되기 때문에 Gamma 파이프라인과 다르게 자연스럽게 출력되는 것을 확인할 수 있다.

 

 

결과적으로 Add 연산을 밝게한 상태에서 연산을 하느냐 어둡게한 상태에서 연산을하느냐의 차이가 Gamma와 Linear의 차이점이다.

그래서 URP나 HDRP의 경우 컬러 스페이스의 기본설정이 Linear로 되어있고 레거시의 경우 Gamma로 되어있다.

 

왜 레거시 파이프라인에서 Gamma가 기본설정이냐면, 구형 하드웨어에서는 Linear를 지원하지 않기때문인데 Linear를 지원하는 디바이스 조건은 다음과 같다.

 

 

 

Android

  • Graphics API : OpenGL 3.0 이상
  • Minimum API Level  : 4.3(API Level 18) 이상

 

 

iOS

  • Graphics API : Metal
  • iOS Version : 8 이상

 

 

외국의 경우 구형 디바이스를 사용하는 곳도 있기 때문에, 구형 디바이스도 서비스 대상에 포함되어있으면 어쩔 수 없이 Gamma 파이프라인밖에 선택지가 없지만 그렇지 않으면 Linear 파이프라인으로 사용하는것이 좋다.

※ Gamma로 작업하다가 Linear로 바꾸는것이 아닌 프로젝트 초반부터 Linear로 시작해야 번거로움을 덜수있다.

 

 

 

※ 이해가 가지 않으면 다음 영상 참고

 

 

 

 

 

 

 

반응형

+ Recent posts