이전에 3D 게임 모작 프로젝트를 하면서 알게된 지식 중 감마 코렉션이라는 것이 있다.
간단하지만, 굉장히 중요한 역할을 하는 녀석이다.
감마 코렉션이란, 이미지에 들어가는 감마 보정을 제거하거나 추가하는 모든 과정을 통틀어서 일컫는 단어이다.
감마 보정은 그럼 뭔데? 라는 얘기를 하기 전에 베버의 법칙에 대한 얘기를 먼저 해야한다.
베버의 법칙이란, 인간은 자극에 대해서 선형적이지 않게 반응한다는 것이다.
예를 들어보자.
도서관에서 서로 속삭이며 얘기할 때엔, 소리를 조금만 키워도 모두가 알아차릴 수 있을 것이다.
하지만, 콘서트장에서 들리는 함성소리는 그 변화를 쉽게 탐지할 수 없다.
동일하게 0.1이라는 수치만큼의 소리가 변화했다고 하더라도, 도서관에선 그 변화를 느낄 수 있는 반면
콘서트장에선 느낄 수 없을 것이다.
이 것이 베버의 법칙이다.
인간이 자극의 변화를 탐지하는 것은 처음 자극의 크기에 비례한다고 한다. 처음 자극이 작을수록 그 변화를 쉽게 느낄 수 있는 반면, 처음 자극이 강하다면 그 변화를 쉽게 알아차리지 못한다.
이 것은 시각에서도 마찬가지이다. 우리는 어두운 곳에선 생각보다 쉽게 명암을 구분하지만, 아주 밝은 곳에선 명암을 쉽게 구분하지 못한다고 한다.
실제로 빛의 세기에 대한 감각반응을 그래프로 그려보면, 밝은 곳보다 어두운 곳에서 민감하게 반응한다고 한다.
그렇다면, 이게 그래픽스랑 무슨 상관일까?
모니터를 생각해보자.
모니터는 색상을 RGB값으로 출력한다. 0이 가장 어두운 색이라면, 1이 가장 밝은 색일 것이다.
보통 디자이너가 그림을 그릴 때, 현실에서 본 색상, 밝기를 기준으로 그림을 그릴 것이다.
두 물체의 밝기 차이를 현실에서 0.1정도라 느꼈다면, 0.1의 차이로 그림을 그리게 될 것이다.
하지만, 막상 모니터에 출력해보면 상상했던 것과는 다르게 출력될 것이다. 왜냐하면, 우리가 0.1 차이라고 느꼈던 그 차이는 실제 밝기의 차이가 아니라 그렇게 인지했을 뿐이다. 반면, 모니터는 실제 0.1 차이만큼의 밝기로 출력할 것이다.
이 간극을 좁혀서 현실에서 보는 것처럼 자연스럽게 이미지를 출력하기 위해, 모니터는 색상을 출력할 때 의도적으로 어두운 색상을 강조하여 출력하고 있다. 이를 감마 보정이라 한다. 수치는 디스플레이마다 다를 수 있지만, 일반적으로 최종 색상에 2.2f 제곱을 하여 출력한다고 한다.
하지만, 이미지 파일, 사진 등은 다르다고 한다. 카메라는 기본적으로 선형으로 빛을 기록한다.
하지만, 위에서 말했듯이 인간은 어두움에 더 민감하기 때문에 선형으로 기록된 색상은 밝은 부분에 대해 너무 적은 정보를 담고 있고, 어두움에 대해선 너무 많은 정보를 담고있게 된다. 그렇기 때문에, 모니터와는 반대로 1/2.2f를 제곱하여 색상을 더 밝게하여 저장한다고 한다.
이렇게 하는 것이 파일 저장의 용량면에 있어서도 여러가지로 이득이라고 한다. (감마가 아닌 다른 방식으로 색을 조율하려면, 채널당 8bit가 아니라 16bit가 필요하다네요.)
그래서 이걸 왜 알아야됨??
이건 쉐이더를 쓸 때 중요해진다.
0.5, 0.5, 0.5의 RGB를 가진 이미지를 만들어서 저장했다고 치자.
이 이미지를 쉐이더에서 샘플링하고, 색상 * 2 를 한다고 치면, 우리는 값이 1.0 이 나오기를 기대할 것이다.
하지만, 실제로는 1.0 을 넘는 값이 나온다.
왜?? 이미지는 1/2.2f 제곱을 한 상태로 저장이 되어있기 때문이다.
그렇기 때문에, 쉐이더에선 이런 이미지들을 샘플링한 뒤에 색상에 2.2f 제곱을 하는 과정을 거쳐줘야 제대로 된 연산을 할 수 있게 된다.
물론, 모든 연산을 마친 후엔 다시 색상에 1.0f/2.2f 제곱을 해주어야 한다.
하지만, 가끔 이러한 연산을 해주지 않아도 되는 것들이 있다.
노말맵, 러프니스 맵 등 색상이나 이미지 정보가 아니라 수치에 관한 정보를 담고 있는 이미지들은 저장할 때 감마보정을 하지 않고, 그대로 RGB를 저장할 수도 있기 때문에 샘플링하고자 하는 이미지가 어떻게 저장되어 있는지 꼼꼼히 확인해보아야 한다.
참고로 아래의 사진은 비교 사진이다.
(좌 - 감마를 고려한 상태로 쉐이딩, 우 - 감마를 고려하지 않고 쉐이딩)
'그래픽스' 카테고리의 다른 글
컴퓨터 그래픽스 - 깊이 버퍼 (Z-Buffer, Depth-Buffer) (0) | 2024.04.25 |
---|---|
컴퓨터 그래픽스 - 빛의 반사와 큐브맵 텍스쳐 (환경 매핑) (0) | 2024.04.23 |
컴퓨터 그래픽스 - 퐁 쉐이딩 (Diffuse Light, Specular Light, Ambient Light) (2) | 2024.04.10 |
컴퓨터 그래픽스 - HDR (High Dynamic Range) (0) | 2024.04.03 |
컴퓨터 그래픽스 - 로컬 스페이스, 월드 스페이스 (0) | 2024.04.01 |