-
Display Encoding 정리, Display transfer function개발 2020. 1. 16. 10:10
빛, 텍스처나 다른 연산의 효과를 계산할 때 우리는 사용되는 값들이 선형적(linear)이라고 가정한다. 쉽게 말하면 덧셈과 곱셈이 예상대로 작동한다는 의미다. 하지만, 다양한 시각적 왜곡(visual artifact)을 피하기 위해 디스플레이 버퍼와 텍스처들은 비선형적(nonlinear) 인코딩을 사용한다는 사실을 고려해야 한다. 방법을 대충 설명하면 이렇다. shader의 결과값([0, 1] 범위)을 가져와 power of 1/2.2만큼 올린다. 텍스처와 색상에서는 반대로 한다. 대부분의 경우에는 GPU에게 이 처리를 맡길 수 있다. 여기서는 자세한 방법과 이런 방법을 사용하는 이유를 설명한다.
초기 디지털 영상처리 기술에서는 CRT가 표준이었다. CRT에서는 픽셀 하나에 가해지는 에너지가 증가할 때, 방출되는 빛이 비선형적으로 1보다 큰 수만큼의 제곱에 비례하여 증가했다. 예를 들어 그 수가 2라 하면, 50%의 에너지를 가한 픽셀에서는 0.5^2 = 0.25, 25%의 빛을 방출하는 것이다. 이후 등장한 LCD나 다른 디스플레이에서는 조금 다른 방법을 사용하지만, 여전히 CRT의 반응을 모방하도록 제조되었다.
이 power function은 인간의 시각이 빛에 대한 민감도의 역(inverse)와 거의 일치한다. 이런 행운의 덕분에 인코딩이 거의 시각적으로 균일하게(perceptually uniform) 느껴진다.하다. 다시 말해, 인코딩 된 값 N과 N+1의 차이가 표현 가능한 범위 내에서 거의 일정하게 보인다는 말이다. 텍스처에서도 주로 같은 인코딩 방식을 사용하므로 이 장점을 적용할 수 있다.
Display transfer function은 디스플레이 버퍼에 있는 디지털 값과 화면에서 방출되는 빛의 밝기의 관계를 묘사한다. 이 때문에 electrical optical transfer function(EOTF)라고도 불린다. 이 함수는 하드웨어의 일부로, 모니터, 텔레비전, 프로젝터에 각기 다른 표준들이 존재한다. 이미지나 동영상을 캡처하는 장치에도 비슷한 표준이 있는데, 이건 반대로 optical electrical transfer function(OETF)라 한다.
선형적인 색상 변화를 표현하기 위해 인코딩할 때, 우리의 목적은 이 display transfer function의 효과를 상쇄시켜, 어떤 값을 계산하던 상응하는 세기의 빛을 방출하게 하는 것이다. 값이 두 배가 되면, 당연히 밝기도 두 배가 되기를 원하기 때문이다. 그림 5.39에서 표현 과정에서 인코딩과 디코딩을 어떻게 사용하는지 볼 수 있다.
그림 5.39 왼쪽의 텍스처는 GPU shader가 접근하는 PNG color 텍스처이고, 값이 비선형적이므로 디코딩을 거쳐 선형적인 값으로 변환된다(파란색). shading과 톤 매핑이 끝난 뒤에 이 값은 다시 인코딩되어 프레임 버퍼에 저장된다(녹색). 이 값과 display transfer function이 화면에서 방출되는 빛의 세기를 결정한다(빨강색). 그림의 파란 함수와 붉은 함수는 서로 상쇄되어 빛의 세기는 계산된 선형적인 값과 비례한다.
그림 5.40 두 스포트라이트가 평면 위에서 겹친 모습이다. 왼쪽의 이미지에서는 gamma correction 없이 0.6, 0.4의 밝기 값이 겹친다. 합 연산이 비선형적 값에 수행되어 오류가 발생한다. 두 라이트의 밝기 차이가 더 커 보이고, 가운데 부분은 비현실적으로 밝아 보인다. 반면 오른쪽 이미지에서는 값에 gamma correction이 적용되어 밝기의 차이도 적당하고, 겹치는 부분의 밝기도 적절하게 계산되었다.
'개발' 카테고리의 다른 글
Xsens를 활용한 실시간 바디 모션캡쳐 강의 (2) (0) 2023.08.03 Xsens를 활용한 실시간 바디 모션캡쳐 강의 (1) (0) 2023.08.03 Windows DUMP, .pbd와 디버거 (0) 2023.08.03 NodeJS? (0) 2020.08.29 오큘러스 퀘스트 녹화 동영상 PC재생 오류 해결 (0) 2020.02.14