감마 보정 사용

감마 보정 또는 간단한 감마는 시스템에서 이미지의 픽셀 값을 코딩하고 디코딩하는 데 사용하는 비선형 작업의 이름입니다.

감마란 무엇이며 무엇을 위한 것인가요?

이미지가 모니터 케이블을 따라 이동하기 위해 컴퓨터를 떠나는 그래픽 파이프라인의 끝에는 픽셀 값을 즉석에서 변환할 수 있는 작은 하드웨어 조각이 있습니다. 이 하드웨어는 일반적으로 조회 테이블을 사용하여 픽셀을 변환합니다. 이 하드웨어는 표면에서 제공되는 빨간색, 녹색 및 파란색 값을 사용하여 테이블에서 감마 수정 값을 조회한 다음, 수정된 값을 실제 표면 값 대신 모니터에 보냅니다. 따라서 이 조회 테이블은 모든 색을 다른 색으로 바꿀 수 있는 기회입니다. 테이블에는 해당 수준의 전원이 있지만 일반적인 사용법은 모니터 응답의 차이를 보정하기 위해 이미지를 미묘하게 조정하는 것입니다. 모니터의 응답은 픽셀의 빨간색, 녹색 및 파란색 구성 요소의 숫자 값과 해당 픽셀의 표시된 밝기를 연결하는 함수입니다.

이것이 바로 이 테이블의 의도였지만, 게임 개발자들은 심리적 효과를 위해 전체 화면을 빨간색으로 깜박이는 등 창의적인 용도를 발견했습니다. 최신 게임 앱에서는 각 프레임의 사후 처리의 일환으로 일반적으로 이러한 작업을 수행하는 다른 방법을 제공합니다. 실제로 감마 테이블은 모니터의 응답을 보정하는 데 사용 중일 수 있으므로 감마 테이블을 그대로 두는 것이 좋습니다. 감마 램프를 도매로 변경하면 이 신중한 보정이 삭제됩니다.

감마 보정을 결정하는 과학은 복잡하며 이름이 "감마"의 어디에서 왔는지 조명하는 것 외에는 여기에 제시되지 않습니다. CRT(즉, 구식 유리) 모니터의 응답은 복잡한 함수이지만 이러한 모니터의 물리학은 이 전원 함수로 조잡하게 나타낼 수 있는 응답을 나타낸다는 것을 의미합니다.

brightness( input ) = inputgamma

감마 값은 일반적으로 2.0 값에 가깝습니다. LCD 모니터 및 기타 모든 최신 기술은 유사한 응답을 나타내도록 특별히 설계되었으므로 모든 소프트웨어와 이미지는 이러한 새로운 기술에 대해 재보정할 필요가 없습니다. sRGB 표준은 이 감마 값이 정확히 2.2임을 선언하며, 이 값은 널리 구현된 표준이 되었습니다.

사람의 눈에는 CRT 전원 함수를 대략적으로 반전하는 응답 함수도 있습니다. 즉, 픽셀의 인식된 밝기가 해당 픽셀의 RGB 값과 매우 대략 선형으로 올라갑니다.

감마 값 2.2는 사실상 표준이 되었기 때문에 일반적으로 이 테이블에 인코딩된 감마 곡선에 대해 너무 걱정할 필요가 없으며 선형 일대일 매핑으로 둘 수 있습니다. 적절한 색상 일치는 물론이 기능에 대한 절묘한 주의가 필요하지만, 그 토론은이 항목의 scope 넘어. Windows에는 사용자가 디스플레이를 감마 2.2로 보정할 수 있는 도구가 포함되어 있으며, 이 도구는 조회 테이블 하드웨어를 사용하여 컴퓨터에 대해 신중하게 선택한 미세 조정을 파생합니다. 사용자는 "색 보정"을 검색하여 이 도구를 실행할 수 있습니다. 이 프로세스를 자동화하는 특정 모니터에 대해 잘 정의된 색 프로필도 있습니다. "색 보정" 도구는 이러한 최신 모니터를 감지하고 보정이 이미 적용되어 있음을 사용자에게 알릴 수 있습니다.

전원 법칙을 색 값으로 인코딩하는 이 개념은 그래픽 파이프라인의 다른 곳, 특히 텍스처에서도 유용합니다. 텍스처의 경우 방금 이야기한 로그적 인간의 눈 반응 때문에 어두운 색에 대한 정밀도를 높일 수 있습니다. 파이프라인의 이 부분에서 감마를 신중하게 처리하는 것이 중요합니다. 자세한 내용은 색 공간에 대한 데이터 변환을 참조하세요.

이 항목의 나머지 부분에서는 프레임 버퍼 데이터와 모니터 사이의 파이프라인의 마지막 부분에서 감마 수정에만 중점을 둡니다. 보정 마법사를 작성하거나 사후 처리 단계가 실용적이지 않은 전체 화면 앱에서 특수 효과를 만들려는 경우 필요한 정보는 다음과 같습니다.

Windows의 감마 배경

Windows 컴퓨터에는 일반적으로 세 배의 바이트를 사용하고 세 배의 바이트를 출력하는 조회 테이블인 감마 테이블이 있습니다. 이러한 트리플릿은 768(256 x 3) 바이트의 RAM입니다. 디스플레이 형식에 RGB BYTE 값의 삼중값이 포함되어 있지만 표시 형식의 범위가 [0,1]보다 큰 경우(예: 부동 소수점 값) 변환을 설명할 만큼 표현력이 충분하지 않은 경우에는 괜찮습니다. 디스플레이 형식이 더 복잡해짐에 따라 감마를 제어하는 Windows의 API가 진화했습니다.

감마 컨트롤을 제공하는 첫 번째 Windows API는 Windows GDI(Graphics Device Interface)의 SetDeviceGammaRampGetDeviceGammaRamp입니다. 이러한 API는 3개의 256개 항목 WORD 배열에서 작동하며, 각 WORD 인코딩은 0에서 1까지이며 WORD 값 0과 65535로 표시됩니다. WORD의 추가 정밀도는 일반적으로 실제 하드웨어 조회 테이블에서 사용할 수 없지만 이러한 API는 유연하게 사용할 수 있습니다. 이러한 API는 이 섹션의 뒷부분에서 설명하는 다른 API와 달리 ID 함수에서 약간만 편차를 허용합니다. 실제로 램프의 모든 항목은 ID 값의 32768 이내여야 합니다. 이 제한은 어떤 앱도 디스플레이를 완전히 검은색으로 바꾸거나 읽을 수 없는 다른 색으로 바꿀 수 없음을 의미합니다.

다음 API는 SetDeviceGammaRamp와 동일한 패턴 및 데이터 형식을 따르는 Microsoft Direct3D 9의 SetGammaRamp입니다. Direct3D 9 감마 램프의 기본값은 특별히 유용하지 않습니다. API가 0-65535로 정의되어 있더라도 0-65535가 아닌 0-255로 초기화된 WORD의 램프입니다.

최신 API는 IDXGIOutput::SetGammaControl입니다. 이 API는 채널당 정수 비트 10개, 16비트 부동 소수점 형식 및 XR_BIAS 확장 범위 형식을 포함하여 DXGI의 증가된 디스플레이 형식 집합에 적합하므로 감마 컨트롤을 표현하는 보다 유연한 체계를 제공합니다.

이러한 모든 API는 동일한 하드웨어에서 작동하고 동일한 값을 변경합니다. Direct3D 9 및 DXGI API는 "쓰기 전용"입니다. 하드웨어의 값을 읽고 수정한 다음 설정할 수 없습니다. 램프만 설정할 수 있습니다. 또한 앱이 전체 화면일 때만 감마를 설정할 수 있습니다. 이 제한은 데스크톱을 항상 읽을 수 있도록 보장하는 또 다른 방법입니다. 즉, 앱이 자체 디스플레이를 방해할 수 있지만 앱이 전체 화면을 잃을 때(예: alt-tab 또는 ctrl-alt-del을 통해) Windows에서 이전 감마 램프를 복원합니다.

디스플레이 하드웨어의 진화

일부 최신 모니터는 광범위한 강도를 표시할 수 있습니다. 그러나 표시 형식이 0과 1 사이의 값만 나타낼 수 있는 경우 디스플레이는 0을 가장 어두운 값에 매핑하고 0을 가장 밝은 값에 매핑해야 합니다. 이 가장 밝은 값은 흰색 배경에 검은색 텍스트가 있는 웹 페이지를 편안하게 보기에는 너무 밝을 수 있지만 호수에서 반짝이는 햇빛을 보거나 하늘을 번개처럼 밝게 하는 것과 같은 지나치게 밝은 특수 효과에는 훌륭합니다. 그래서, 우리는 이러한 넓은 범위를 표현하는 방법이 필요합니다. DXGI 1.1 이상에는 1.0이 편안한 흰색 값을 나타내고 밝은 특수 효과를 위해 더 넓은 디스플레이 형식 값을 예약할 수 있는 디스플레이 형식 값이 포함되어 있습니다. DXGI 1.1은 DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM 및 16비트 부동 소수점이라는 더 넓은 값을 표현할 수 있는 두 가지 표시 형식을 지원합니다. 이러한 형식에 대한 자세한 내용은 확장 형식의 세부 정보를 참조하세요. 다음으로 DXGI의 IDXGIOutput::SetGammaControl 감마 API에 1.0보다 큰 픽셀 값이 필요한 이유를 살펴봅니다.

DXGI의 감마 컨트롤 기능

DXGI를 사용하면 디스플레이 드라이버가 감마 컨트롤을 단계별 선형 함수로 표현할 수 있습니다. 이 단계별 선형 함수는 이 함수의 제어점, 함수가 변환할 수 있는 값 범위 및 변환 후에 적용할 수 있는 추가 선택적 배율 및 오프셋 작업에 의해 정의됩니다. 앱은 IDXGIOutput::GetGammaControlCapabilities 메서드를 호출하여 DXGI_GAMMA_CONTROL_CAPABILITIES 구조에서 이러한 모든 컨트롤 기능을 검색할 수 있습니다.

이 그래프는 4개의 제어점만 있는 선형 함수를 보여줍니다.

감마 보정 선형 함수

DXGI는 표면 색 축을 따라 위치별로 제어점을 정의합니다. 이전 그래프에서 제어점의 위치는 0, 0.5, 0.75 및 1.0입니다. 이러한 제어점은 하드웨어가 0에서 1.0 범위의 값을 변환할 수 있음을 나타냅니다. DXGI는 이러한 제어점을 DXGI_GAMMA_CONTROL_CAPABILITIESControlPointPositions 배열 멤버에 나열하고 항상 증가하는 순서로 선언합니다. DXGI는 ControlPointPositions 배열의 첫 번째 요소만 채우고 DXGI_GAMMA_CONTROL_CAPABILITIES NumGammaControlPoints 멤버가 있는 요소 수를 나타냅니다. NumGammaControlPoints가 1025보다 작으면 DXGI는 ControlPointPositions 요소의 나머지 부분을 정의되지 않은 상태로 둡니다.

이 그래프로 표시되는 하드웨어는 값을 0~1.25 범위로 변환할 수 있습니다. 따라서 DXGI 는 MinConvertedValueMaxConvertedValue 멤버를 각각 0.0f 및 1.25f로 설정합니다.

DXGI는 하드웨어가 스케일링 및 오프셋 기능을 지원하는지 여부를 나타내도록 DXGI_GAMMA_CONTROL_CAPABILITIESScaleAndOffsetSupported 멤버를 설정합니다. 하드웨어에서 크기 조정 및 오프셋을 지원하는 경우 간단한 일대일 조회 테이블을 유지한 다음 테이블의 출력을 조정하여 출력을 [0,1]보다 큰 범위로 늘입니다. 하드웨어는 먼저 조회 테이블에서 나오는 값의 크기를 조정한 다음 오프셋합니다.

참고

동일한 컴퓨터에 연결된 다른 모니터에는 서로 다른 감마 제어 기능이 있을 수 있습니다. 또한 감마 컨트롤 기능은 출력의 표시 모드에 따라 실제로 변경 될 수 있습니다. 따라서 앱이 전체 화면 모드로 전환된 후 항상 IDXGIOutput::GetGammaControlCapabilities 를 호출하여 감마 제어 기능을 쿼리하는 것이 좋습니다.

 

이러한 감마 컨트롤 기능 값을 사용하여 IDXGIOutput::SetGammaControl API를 사용하여 설정할 수 있는 컨트롤 값을 파생시킬 수 있습니다.

DXGI를 사용하여 감마 컨트롤 설정

감마 컨트롤을 설정하려면 IDXGIOutput::SetGammaControl API를 호출할 때 DXGI_GAMMA_CONTROL 구조체에 포인터를 전달합니다.

DXGI_GAMMA_CONTROLScaleOffset 멤버를 설정하여 하드웨어가 조회 테이블에서 가져오는 값에 적용할 크기 조정 및 오프셋 값을 지정합니다. 스케일링오프셋 기능을 사용하지 않으려는 경우 또는 하드웨어에 해당 기능이 없는 경우 Scale을 1로, Offset을 0으로 안전하게 설정할 수 있습니다(즉, 1씩 크기 조정은 효과가 없고 오프셋은 0이 적용되지 않음).

DXGI_GAMMA_CONTROLGammaCurve 배열 멤버를 감마 곡선의 포인트에 대한 DXGI_RGB 구조 목록으로 설정합니다. 각 DXGI_RGB 요소는 해당 지점에 대한 빨간색, 녹색 및 파란색 구성 요소를 나타내는 float 값을 지정합니다. 감마 곡선은 알파 값을 사용하지 않습니다. DXGI_GAMMA_CONTROL_CAPABILITIES NumGammaControlPoints에서 가져온 숫자를 사용하여 GammaCurve 배열 의 요소 수를 채웁니다. GammaCurve 배열에 배치하는 각 요소는 각 제어점의 높이입니다.

이전 그래프에서는 이제 각 제어점의 세로 배치를 제어할 수 있으며 빨간색, 녹색 및 파란색에 대한 별도의 컨트롤이 있습니다. 예를 들어 모든 녹색 및 파란색 값을 0으로 설정하고 빨간색 값을 0에서 1로 오름차순 계단으로 설정할 수 있습니다. 이 시나리오에서 표시된 이미지는 빨간색 부분만 표시하며 파란색과 녹색은 검은색으로 표시됩니다. 모든 색에 대해 내림차순 계단을 설정하여 반전된 디스플레이를 만들 수도 있습니다. GammaCurve 배열에 배치하는 모든 값은 DXGI_GAMMA_CONTROL_CAPABILITIESMinConvertedValueMaxConvertedValue 멤버에서 얻은 값 내에 포함되어야 합니다.

감마 컨트롤 실용성

DXGI의 감마 컨트롤은 앱이 전체 화면인 경우에만 적용됩니다. Windows는 앱이 종료되거나 창 모드로 돌아올 때 디스플레이의 이전 상태를 복원합니다. 그러나 앱이 전체 화면 모드로 다시 전환되면 Windows는 앱의 감마 상태를 복원하지 않습니다. 앱이 전체 화면 모드로 다시 전환되면 감마 상태를 명시적으로 복원해야 합니다.

모든 어댑터가 감마 컨트롤을 지원하는 것은 아닙니다. 어댑터가 감마 컨트롤을 지원하지 않는 경우 감마 램프를 설정하는 호출을 무시합니다.

원격 데스크톱에서 실행되는 앱은 감마를 전혀 제어할 수 없습니다.

마우스 커서가 하드웨어에서 구현되는 경우(대부분의 경우) 일반적으로 감마 설정에 응답하지 않습니다.

DXGI 프로그래밍 가이드