2021년 2월 1일 월요일

Gamma


 https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-24-importance-being-linear


위 글이 정석이라고 봐도 좋을 아티클이다.


요약하면 다음과 같다.


현재 많이 쓰이는 8비트로 색을 표시하는 방법으로는 우리 눈이 민감한 어두운 영역과 우리 눈이 둔감한 밝은 영역을 동일하게 표현하게 된다.

아까우므로 어두운 영역에 더 많은 색 영역을 표시하기 위해서 이미지파일은 1/gamma 를 제곱해서 색을 표현한다.

실제로 화면에 표시할 땐 이 보정치가 선형 공간으로 돌아와야 하므로 디스플레이는 gamma 를 제곱한 결과를 화면에 표시를 한다.

디스플레이의 gamma 는 사용자가 설정할 수 있으며 파일에 대해선 2.2 가 가장 많이 쓰인다.


gamma 보정이 들어간 이미지 파일에서는 쉐이더에서 계산한 결과가 왜곡된다.

위쪽으로 볼록한 형태의 그래프가 되기 때문에 어두운부분은 더 어두워지고 밝은 부분은 더 밝아지는 왜곡이 일어나는게 보통의 현상으로, 위 아티클의 예에서도 잘 드러난다.


이를 막기위해 주의해야할 부분은 소스를 들고올 때 선형공간으로 변환하는 것과 결과물을 내보낼 때 감마 보정을 해서 넣는 것이다.

첫번째 방법으로, 쉐이터 코드를 추가해서 이를 해결할 수 있다.

감마 보정된 공간에서 선형 공간으로 갈 땐 알파값을 제외한 색상값에 2.2를 제곱해주고, 화면에 띄우기 위한 결과값을 내보낼 때 1/2.2 를 제곱해준다. 이 경우 개인 디스플레이 환경에 영향을 많이 받는다.

다른 방법으로는, Direct X 에서는 DXGI_FORMAT_R8G8B8A8_UNORM_SRGB 로 백버퍼와 텍스쳐를 만들면 보통의 환경에선 자동으로 보정을 해준다. 개인 환경에 맞춰서 해주는지는 찾아봐야함.



List