포스트

Gamma Correction

Gamma Correction

💫 요약


  • 인간의 인지 능력의 특성 때문에, 어두운 부분의 음영을 더 잘 느낀다.

  • 그래서 모니터는 어두운 영역에 집중되어 출력되도록 세팅되어 있다. (더 좋게 보이기 위해, 모니터마다 차이는 있다.)
  • 그래서 이미지를 그대로 출력하면 원본보다 어두워진다.
  • 컴퓨터 내부적으로는 각 이미지를 모니터에 출력할 때 어두워져도 괜찮도록 일부러 밝게 만들어서 저장하고 있다. (sRGB) (어두운 부분의 밀도를 올리기 위해)

💫 Gamma Correction


모니터는 우리가 알고 있는 색상을 그대로 출력하지 않는다.
모니터는 모니터의 출력 특성상 어두운 영역에 집중되어 출력되도록 세팅되어 있다.

때문에 이미지를 그대로 출력하면 원본보다 어두워진다.
사실 컴퓨터 내부적으로는 각 이미지를 모니터에 출력할 때 어두워져도 괜찮도록 일부러 밝게 만들어서 저장하고 있다.

💫 Linear Workflow


이미지를 밝게 만들어서 저장하기 때문에,
쉐이더 연산을 할 때, 밝게 보정된 이미지끼리 연산되면 기대했던 정상적인 결과물이 나오지 않는다.

따라서 이 부분을 계산할 때 잠시 원래처럼 어둡게 조절해주는 내부 과정이 필요하게 되고, 계산이 끝나면 다시 원래의 밝기로 돌려준다.
이러한 과정을 리니어 워크플로우 (Linear Workflow) 라고 하며, 쉐이더 연산에서는 매우 중요한 단계라고 할 수 있다.

💫 Why (왜 모니터는 어둡게 출력하는가?)


인간의 인지 능력의 특성 때문에,

‘베버의 법칙’
인간은 자극이 없는 상황에서 추가된 작은 자극은 민감하게 느끼면서,
이미 많은 자극이 있는 상태에서 추가되는 자극은 둔감하게 느낀다.

인간이 어두운 부분의 음영을 더 잘 느낀다.

https://youtu.be/Xwlm5V-bnBc?si=1SdTDuif4-zSc0Gt&t=190
(Unity Korea : ‘Gamma Color space와 Linear Color space란?’ 3분 10초 ~)

위 영상 3분 10초의 두 그라데이션 중, 어느 것이 정상으로 보이는가?
라고 한다면 대부분 1번이라고 답할 것이다.

회색은 흰색과 검은색의 중간값이다.
때문에 인간이 느끼는 자연스러운 회색은 1번 그라데이션의 가운데 값이라고 볼 수 있다.

하지만 !
1번 그라데이션의 가운데 값은 정확한 회색이 아니다.

정확한 회색은 187

흰색 줄과 검은색 줄을 번갈아가며 놓은 왼쪽 ‘Gray’ 영역의 색은,

1번 그라데이션의 가운데 값 128이 아니라,
2번 그라데이션의 가운데 값 187에 가까워 보인다.

(환경에 따라 보이는 것에 차이가 있을 수 있음, 직접 포토샵 등의 툴을 이용해 그림을 그려 100% 배율로 확인해보는 것이 정확하다.)

즉, 정확한 회색은 187이고, 정확한 그라데이션은 2번 그라데이션이다.
2번 그라데이션이 어색하게 밝아보였던 이유는, 베버의 법칙 때문이다.

인간은 인지 능력의 특성 (베버의 법칙) 때문에, 어두분 부분의 음영을 더 잘 느낀다.
그라데이션의 밴딩 현상이 어두운 부분에서는 잘 보이지만, 밝은 부분에서는 잘 보이지 않는다.

그래서 모니터는, 어두운 곳에 민감한 인간의 감각에 맞춰 어두운 부분의 밀도를 올리기로 했다.

이미지를 메모리에 저장할 때 일부러 밝게 저장하고, (어두운 부분의 밀도를 올리기 위해)
모니터에 출력 할 때에는 밝아진 이미지를 어둡게 출력한다.

이미지는 우리 생각보다 밝게 저장된다. (sRGB, 감마 공간에 있다.)

💫 Memo


🫧 왜 ‘감마’ 보정이라고 하는가?

비선형 전달 함수의 지수 계수가 감마 (γ) 이기 때문이다.
감마는 2.2가 가장 근접한 값으로 알려져 있는데, 2.0을 쓰는 것이 연산 속도가 빠른 관계로 2.0을 쓰는 경우도 있다.

🫧 In Unity

URP로 넘어오면서 기본적으로 리니어 워크플로우가 적용되어 있다. (2020 영상 기준)
-> 감마 보정을 잘 이해하고 있어야 한다.

예전엔 모바일에서 리니어 렌더링을 쓰지 않았는데, 최근엔 모바일에서도 리니어 렌더링이 ‘기본’이 되어가는 추세. (2020 영상 기준)
유니티 기본 설정이 ‘Gamma’

유니티 엔진은 기본적으로 Gamma로 설정되어 있다. (Project Settings/Player/Rendering/ColorSpace) (2020 영상 기준, 2017 버전)
-> 리니어 파이프라인을 구현못하는 구형 기기를 지원하기 위해서, 호환성을 위해서

감마 파이프라인에서의 ADD 이펙트
-> 밝게 저장된 이미지를 그대로 더한다.
-> 과도하게 밝아지는 부분은 데이터가 날라간다.

리니어 파이프라인에서의 ADD 이펙트
-> 연산하기 전에 다시 어둡게 샘플링 (지원하는 하드웨어에서는 샘플링 시에 이 작업이 공짜)
-> 선형 영역으로 내린 상태에서 연산하고, 그 결과를 sRGB로 밝게 저장
-> 이를 디스플레이로 출력 (다시 어둡게, 감마 보정)

어디서 계산하냐의 차이

🫧 KeyWord

  • Contrast : 이미지의 밝기 차이 (대비)
  • 밴딩 현상 (등고선 현상) :

🫧 Ref

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.