다음을 통해 공유


높은/표준 동적 범위 디스플레이에서 고급 색으로 DirectX 사용

이 항목에서는 HDR(High Dynamic Range), WCG(Wide Color Gamut) 및 자동 시스템 색 관리 및 높은 비트 깊이를 비롯한 고급 색 시나리오에서 DirectX를 사용하는 방법을 보여 줍니다. 위의 향상된 기능 중 하나 이상이 포함된 프리미엄 PC(개인용 컴퓨터) 디스플레이가 널리 보급되어 기존 SDR(표준 동적 범위) 디스플레이보다 훨씬 높은 색 충실도를 제공합니다.

이 항목에서는 Windows Advanced Color 지원의 주요 기술 개념에 대해 간략하게 설명합니다. HDR, WCG 및 고비트 깊이 DirectX 콘텐츠를 이러한 디스플레이 중 하나로 렌더링하기 위한 요구 사항 및 지침을 알아봅니다. 색상 관리 앱(예: ICC 프로필 사용)이 있는 경우 자동 색 관리를 통해 시나리오에서 색 정확도를 높이는 방법을 알아봅니다.

Windows의 고급 색 소개

고급 색 은 표준 디스플레이보다 색 충실도가 훨씬 높은 디스플레이를 위한 OS(운영 체제) 기술의 우산 용어입니다. 주요 확장 기능은 아래 섹션에 설명되어 있습니다. 고급 색 기능은 Windows 10 버전 1709(Fall Creators Update)를 사용하는 HDR 디스플레이 및 Windows 11, 버전 22H2(10.0;)를 사용하여 특별히 프로비전된 SDR 디스플레이에 대해 처음 도입되었습니다. 빌드 22621) 릴리스.

높은 동적 범위

동적 범위는 장면의 최대 광도와 최소 광도 사이의 차이를 나타냅니다. 이것은 종종 nits(평방 센티미터당 칸델라)로 측정됩니다. 이 일몰과 같은 실제 장면은 종종 광도의 크기의 10 순서의 동적 범위를 가지고; 인간의 눈은 적응 후 더 큰 범위를 분별 할 수 있습니다.

장면의 밝기와 가장 어두운 점이 표시된 일몰 그림

Direct3D 9 이후 그래픽 엔진은 물리적으로 정확한 이 수준의 충실도로 내부적으로 장면을 렌더링할 수 있었습니다. 그러나 일반적인 표준 동적 범위 디스플레이는 3배 이상의 광도만 재현할 수 있으므로 HDR 렌더링 콘텐츠는 디스플레이의 제한된 범위로 톤맵핑(압축)되어야 했습니다. HDR10(BT.2100) 표준을 준수하는 디스플레이를 비롯한 새로운 HDR 디스플레이는 이러한 제한 사항을 해결합니다. 예를 들어 고품질의 자기 방출형 디스플레이는 6배 이상의 크기를 달성할 수 있습니다.

넓은 색 영역

색 영역은 디스플레이가 재현할 수 있는 색조의 범위와 채도를 나타냅니다. 인간의 눈이 인식할 수 있는 가장 포화 자연색은 레이저에 의해 생성된 것과 같은 순수하고 단색적인 빛으로 구성됩니다. 그러나 주류 소비자 디스플레이는 사람이 인식할 수 있는 모든 색의 약 35%만 나타내는 sRGB 영역 내에서만 색을 재현할 수 있습니다. 아래 다이어그램은 인간의 "스펙트럼 궤적" 또는 모든 인식 가능한 색(지정된 광도 수준)을 나타내는 것으로, 작은 삼각형은 sRGB 영역입니다.

인간 스펙트럼 궤적 및 sRGB 영역 다이어그램

고급 전문 PC 디스플레이에는 사람이 인식할 수 있는 색의 절반 정도를 커버하는 Adobe RGB 및 DCI-P3와 같이 sRGB보다 훨씬 넓은 오랫동안 지원되는 색 영역이 있습니다. 그리고 이러한 넓은 영역 디스플레이는 점점 더 일반화되고 있습니다.

자동 시스템 색 관리

색상 관리는 장치 전체에서 정확하고 일관된 색 재현을 보장하는 기술 및 관행입니다. 디지털 콘텐츠 작성자의 경우 사진, 제품 이미지 또는 로고와 같은 시각적 콘텐츠의 색이 대상 그룹의 다양한 디지털 장치에서와 동일하게 표시되도록 하는 데 매우 중요합니다.

Windows는 ICM(이미지 색 관리) 및 이후 WCS(Windows Color System) API를 사용하여 Windows 2000부터 색 관리 지원 API를 제공했습니다. 그러나 이러한 API는 색 관리를 수행하려고 하고 필요한 앱의 도우미일 뿐입니다. 대부분의 앱과 디지털 콘텐츠는 단순히 업계 표준 sRGB 색 공간을 가정하지만 OS에서 색을 관리하지 않았습니다. 그것은 과거에 합리적인 가정이었지만 고품질의 넓은 영역 디스플레이가 훨씬 더 일반화되고 있습니다.

새 버전의 Windows는 자동 시스템 색 관리를 지원합니다. 색 인식 여부와 관계없이 모든 Windows 앱의 모든 색이 지원되는 모든 디스플레이에 정확하고 일관되게 표시되도록 합니다.

참고 항목

자동 색 관리는 디스플레이 하드웨어의 속성이 아닙니다. 대신 sRGB보다 색 영역이 큰 디스플레이를 제대로 지원하는 Windows 기능입니다.

전체 정밀도/비트 깊이

숫자 정밀도 또는 비트 깊이는 색을 고유하게 식별하는 데 사용되는 정보의 양을 나타냅니다. 비트 깊이가 높을수록 밴딩과 같은 아티팩트 없이 매우 유사한 색을 구분할 수 있습니다. 일반 PC 디스플레이는 색 채널당 8비트가 지원되는 반면, 사람의 눈은 인식 가능한 왜곡을 방지하기 위해 10~12비트 이상의 정밀도가 필요합니다.

색상 채널당 시뮬레이션된 2비트 및 채널당 8비트의 풍차 그림

고급 색 이전에는 디스플레이가 더 높은 비트 깊이를 지원하는 경우에도 DWM(데스크톱 창 관리자)은 창이 있는 앱을 제한하여 색 채널당 8비트만 콘텐츠를 출력하도록 제한했습니다. 고급 색을 사용하도록 설정하면 DWM은 IEEE FP16(반정밀도 부동 소수점)을 사용하여 컴퍼지션을 수행하여 병목 상태를 제거하고 디스플레이의 전체 전체 정밀도를 사용할 수 있도록 합니다.

Windows 고급 색 시스템 아키텍처

이 섹션의 정보는 고급 색 앱을 빌드하기 위한 선택 사항입니다. 그러나 앱의 렌더링 및 동작을 최적화하기 위해 기술이 작동하는 방식을 이해하는 것이 유용합니다.

이 섹션에서는 간소화된 다이어그램을 사용하여 Windows 그래픽 스택의 관련 구성 요소를 설명합니다.

Windows 그래픽 스택의 블록 다이어그램: 커널을 표시하는 앱에서 DWM으로

기존 Windows: 8비트/sRGB 표시

수십 년 동안 소비자 디스플레이 및 Windows 그래픽 스택은 채널당 약 8비트(픽셀당 24비트) sRGB 콘텐츠를 기반으로 했습니다. DirectX와 같은 그래픽 API를 사용하는 앱은 높은 비트 깊이 및 확장된 색 공간을 사용하여 내부 렌더링을 수행할 수 있습니다. 그러나 OS는 암시적 sRGB가 있고 시스템 색 관리가 없는 8비트 정수만 지원했습니다.

SDR 표시 스택의 블록 다이어그램: 색 관리 없이 sRGB, 8비트로 제한

즉, 앱에서 렌더링하는 추가 색 데이터가 표시될 때 손실됩니다. 그리고 앱이 디스플레이에서 정확한 재현을 보장하기 위해 색 관리 자체를 수행해야 했습니다.

Windows 10 버전 1703: HDR이 고급 색으로 표시

Windows 10 버전 1703에서는 HDR 디스플레이에 대한 고급 색 기능의 첫 번째 버전이 도입되었습니다. 이렇게 하려면 OS 그래픽 스택에서 몇 가지 중요한 발전이 필요했습니다.

  • HDR 디스플레이 신호 지원
  • 높은 비트 깊이의 정식 색 공간을 사용하는 시스템 컴퍼지션
  • 자동 시스템 색 관리

HDR 디스플레이 스택의 블록 다이어그램: FP16, scRGB, 자동 색 관리

각 발전은 아래 하위 섹션에서 다룹니다. 결과적으로 확장된 앱 색 데이터가 OS에 의해 올바르게 보존되고 HDR 디스플레이에서 정확하게 재현됩니다.

HDR 디스플레이 신호 지원

DisplayPort 및 HDMI와 같은 디스플레이 커넥터를 통해 HDR 신호는 주로 채널 전체 자릿수(또는 그 이상) 및 BT.2100 ST.2084 색 공간당 10비트를 사용합니다. 디스플레이 커널, 디스플레이 드라이버 및 기본 GPU 하드웨어는 모두 이 신호 모드 감지, 선택 및 구동을 지원해야 합니다.

높은 비트 깊이의 정식 색 공간을 사용하는 시스템 컴퍼지션

BT.2100 ST.2084 색 공간은 HDR 색 인코딩을 위한 효율적인 표준이지만 많은 렌더링 및 컴퍼지션(혼합) 작업에는 적합하지 않습니다. 또한 향후 OS가 사람이 볼 수 있는 색의 2/3 미만을 포함하는 BT.2100을 훨씬 넘어 기술과 색 공간을 지원하도록 증명하고자 합니다. 마지막으로, 가능한 경우 전력 및 성능을 개선하기 위해 GPU 리소스 소비를 최소화하려고 합니다.

HDR 모드에서 DWM(데스크톱 창 관리자)은 다음과 같이 정의된 CCCS(정식 컴퍼지션 색 공간)를 사용합니다.

  • scRGB 색 공간(선형 감마가 있는 BT.709/sRGB 주체)
  • IEEE 반정밀도(FP16비트 깊이)

이는 위의 모든 목표 간에 적절한 균형을 제공합니다. CCCS는 [0, 1] 숫자 범위를 벗어난 색 값을 허용합니다. 유효한 FP16 값의 범위를 감안할 때, 5백만 nits 이상의 광도 값을 포함하여 자연인 시각적 범위보다 훨씬 더 많은 색의 순서를 나타낼 수 있습니다. FP16은 선형 감마 혼합 작업에 뛰어난 정밀도를 가지고 있지만 GPU 메모리 사용량의 절반과 기존 단일 정밀도(FP32)의 대역폭을 인식할 수 없는 품질 손실이 없습니다.

자동 시스템 색 관리

Windows는 사용자가 겹치는 창과 동시에 여러 SDR 및 HDR 앱을 실행할 수 있는 멀티태스킹 환경입니다. 따라서 디스플레이에 출력할 때 모든 유형의 콘텐츠가 정확하고 최대 품질로 표시되는 것이 중요합니다. 예를 들어 BT.2100 ST.2084(HDR) 비디오 창이 재생 중인 SDR(sRGB) 생산성 앱입니다.

HDR 모드에서 Windows는 다음 두 단계로 색 관리 작업을 수행합니다.

  1. DWM은 혼합하기 전에 각 앱을 네이티브 색 공간에서 CCCS로 변환합니다.
  2. 디스플레이 커널은 OS 프레임 버퍼를 CCCS에서 와이어 형식 색 공간(BT.2100 ST.2084)으로 변환합니다.
    • 필요에 따라 디스플레이 커널은 디스플레이 드라이버와 함께 작동하여 추가 디스플레이 색 보정을 수행합니다. 자세한 내용은 Windows 하드웨어 디스플레이 색 보정 파이프라인을 참조하세요.

DWM 및 디스플레이 커널에서 발생하는 자동 색 관리의 블록 다이어그램DWM 및 디스플레이 커널에서 발생하는 자동 색 관리의 블록 다이어그램, 2부

참고 항목

두 단계 모두에서 색 관리 작업은 색 공간 변환(행렬 및 1DLUT)으로 구성됩니다. 디스플레이의 대상 색 영역을 초과하는 색은 숫자로 잘립니다.

Windows 11 버전 22H2: SDR이 고급 색으로 표시됨

HDR 디스플레이의 보급이 빠르게 증가하고 있지만 SDR 디스플레이는 앞으로도 계속 중요할 것입니다. Windows 10 버전 1703의 HDR 지원은 SDR 디스플레이를 향상시키는 데 필요한 대부분의 기초를 마련했습니다. Windows 11 버전 22H2는 고급 색 및 자동 색 관리 기능을 특정 적격 SDR 디스플레이로 확장합니다. 고급 색 SDR 디스플레이에 대한 그래픽 블록 다이어그램은 HDR과 매우 유사합니다.

SDR AC 디스플레이 스택의 블록 다이어그램: FP16, scRGB, 자동 색 관리

높은 비트 깊이의 SDR 디스플레이 신호 지원

Windows 11 버전 22H2 릴리스는 디스플레이의 기능에 따라 채널당 10비트 이상의 비트를 지원하지만 SDR 디스플레이에 대한 기본 신호는 변경되지 않습니다.

높은 비트 깊이의 정식 색 공간을 사용하는 시스템 컴퍼지션

CCCS의 혼합을 비롯한 DWM 고급 색 기능은 HDR 디스플레이에서 거의 완전히 변경되지 않습니다. 주요 차이점은 DWM이 SDR 디스플레이와 함께 디스플레이 참조 광도를 사용하고 HDR 디스플레이에서 장면 참조 광도를 사용한다는 것입니다. 이렇게 하면 고급 색 렌더링 콘텐츠가 OS에서 해석되는 방식이 변경됩니다.

표시 종류 광도 동작 1.0f 해석 방법
SDR 표시 참조 표시의 참조 흰색 수준으로
HDR 장면 참조 80 nits로(명목 참조 흰색)

자동 시스템 색 관리

OS 시스템 색 관리 기능도 HDR 디스플레이에서 대부분 변경되지 않습니다. 주요 차이점은 디스플레이 커널이 HDR 디스플레이에 대한 표준 BT.2100 ST.2084 색 공간 대신 디스플레이의 색 측정 및 보정 데이터에 정의된 대로 디스플레이 참조 색 공간으로 변환된다는 것입니다.

프로비저닝 필요 표시

표시 커널의 출력 색 관리 작업을 정의하려면 MHC ICC 프로필의 정확한 데이터가 필요합니다. 따라서 제조업체 또는 유효한 프로필이 있는 디스플레이 보정 공급자가 특별히 프로비전한 SDR 디스플레이만 자동 색 관리에 적합합니다. 자세한 내용은 고급 색을 사용하여 ICC 프로필 동작을 참조하세요.

시스템 요구 사항 및 운영 체제 지원

Windows 10 버전 1709는 HDR 디스플레이에 대한 고급 색 지원을 처음 제공했습니다. Windows 11 버전 22H2 릴리스는 정확한 프로비전 데이터가 있는 SDR 디스플레이에 대한 고급 색 지원을 추가합니다.

이 항목에서는 앱이 HDR 디스플레이용 Windows 10 버전 2004 이상 및 SDR 디스플레이용 Windows 11 버전 22H2 릴리스(이상)를 대상으로 하는 것으로 가정합니다.

표시

높은 동적 범위 디스플레이는 HDR10 또는 BT.2100 ST.2084 표준을 구현해야 합니다. HDR 디스플레이 품질은 크게 달라질 수 있으며 VESA DisplayHDR과 같이 인증된 디스플레이를 사용하는 것이 좋습니다. Windows 11 버전 22H2 릴리스부터 Windows는 설정 앱에 알려진 디스플레이의 인증 상태를 표시합니다.

표준 동적 범위 표시에는 고급 색 지원을 위한 정확한 색 프로비저닝 데이터가 있어야 합니다. Windows 11 버전 22H2 릴리스에서 이 데이터를 재정의하는 유일한 지원 방법은 MHC ICC 프로필을 통해서만 지원됩니다. 또한 사용자 또는 디스플레이 제조업체는 자동 색 관리를 사용하도록 설정해야 합니다. 자세한 내용은 고급 색을 사용한 ICC 프로필 동작을 참조 하세요.

GPU(그래픽 프로세서)

SDR 및 HDR 디스플레이 모두에서 전체 고급 색 기능을 사용하려면 최근 GPU가 필요합니다.

  • AMD Radeon RX 400 시리즈(폴라리스) 이상
  • NVIDIA GeForce 10 시리즈(파스칼) 이상
  • 선택한 Intel Core 10세대(Ice Lake) 이상*

참고 항목

Intel 코드 이름 Comet Lake(5자리 모델 코드) 칩셋은 전체 기능을 제공하지 않습니다.

하드웨어 코덱 가속(10비트 HEVC, 10비트 VP9 등) 및 PlayReady 지원(SL3000)을 비롯한 시나리오에 따라 추가 하드웨어 요구 사항이 적용될 수 있습니다. 자세한 내용은 GPU 공급업체에 문의하세요.

그래픽 드라이버(WDDM)

사용 가능한 최신 그래픽 드라이버는 Windows 업데이트 또는 GPU 공급업체 또는 PC 제조업체의 웹 사이트에서 사용하는 것이 좋습니다. 이 항목에서는 HDR 디스플레이용 WDDM 2.7(Windows 10, 버전 2004)의 드라이버 기능과 SDR 디스플레이에 대한 WDDM 3.0(Windows 11, 버전 21H2)을 사용합니다.

지원되는 렌더링 API

Windows 10은 다양한 렌더링 API 및 프레임워크를 지원합니다. 고급 색 지원은 기본적으로 DXGI 또는 시각적 계층 API를 사용하여 최신 프레젠테이션을 수행할 수 있는 앱에 의존합니다.

따라서 이러한 프레젠테이션 방법 중 하나에 출력할 수 있는 렌더링 API는 고급 색을 지원할 수 있습니다. 여기에는 아래가 포함됩니다(제한되지 않음).

  • Direct3D 11
  • Direct3D 12
  • Direct2D
  • Win2D
    • 하위 수준 CanvasSwapChain 또는 CanvasSwapChainPanel API를 사용해야 합니다.
  • Windows.UI.Input.Inking
    • DirectX를 사용하여 사용자 지정 드라이 잉크 렌더링을 지원합니다.
  • XAML
    • MediaPlayerElement를 사용하여 HDR 비디오 재생을 지원합니다.
    • Image 요소를 사용하여 JPEG XR 이미지의 디코딩을 지원합니다.
    • SwapChainPanel을 사용하여 DirectX interop을 지원합니다.

동적 표시 기능 처리

Windows 10은 전원 효율적인 통합 패널에서 고급 게임 모니터 및 TV에 이르기까지 다양한 고급 색 지원 디스플레이를 지원합니다. Windows 사용자는 앱이 유비쿼터스 기존 SDR 디스플레이를 포함하여 이러한 모든 변형을 원활하게 처리할 것으로 예상합니다.

Windows 10은 사용자에게 HDR 및 고급 색 기능을 제어합니다. 앱은 현재 디스플레이의 구성을 검색하고 기능의 변경 내용에 동적으로 응답해야 합니다. 예를 들어 사용자가 기능을 사용하거나 사용하지 않도록 설정하거나 다른 디스플레이 간에 앱을 이동하거나 시스템의 전원 상태가 변경되었기 때문에 여러 가지 이유로 발생할 수 있습니다.

옵션 1: AdvancedColorInfo

참고 항목

AdvancedColorInfo Windows 런타임 API는 렌더링 API와 독립적으로 사용할 수 있으며, SDR 디스플레이에 대한 고급 색을 지원하며, 이벤트를 사용하여 기능이 변경될 때 신호를 보냅니다. 그러나 UWP(유니버설 Windows 플랫폼) 앱에만 사용할 수 있습니다. 데스크톱 앱(CoreWindow가 없음)은 사용할 수 없습니다. 자세한 내용은 데스크톱 앱에서 지원되지 않는 Windows 런타임 API를 참조하세요.

먼저 DisplayInformation::GetAdvancedColorInfo에서 AdvancedColorInfo의 인스턴스를 가져옵니다.

현재 활성 상태인 고급 색 종류를 확인하려면 AdvancedColorInfo::CurrentAdvancedColorKind 속성을 사용합니다. 이는 확인할 가장 중요한 속성이며 활성 종류에 대한 응답으로 렌더링 및 프레젠테이션 파이프라인을 구성해야 합니다.

고급 색 종류 표시 기능
SDR 고급 색 기능이 없는 SDR 디스플레이
WCG 높은 비트 깊이 및 자동 색 관리를 사용하는 SDR 디스플레이
HDR 모든 고급 색 기능이 있는 HDR 디스플레이

지원되지만 반드시 활성화되지는 않는 고급 색 종류를 확인하려면 AdvancedColorInfo::IsAdvancedColorKindAvailable을 호출 합니다. 예를 들어 해당 정보를 사용하여 사용자에게 HDR 또는 자동 색 관리를 사용하도록 설정할 수 있도록 Windows 설정 앱으로 이동하라는 메시지를 표시할 수 있습니다.

AdvancedColorInfo다른 멤버는 SMPTE ST.2086 정적 HDR 메타데이터에 해당하는 패널의 실제 색 볼륨(광도 및 색 분광)에 대한 양적 정보를 제공합니다. ST.2086은 원래 HDR 디스플레이용으로 설계되었지만 해당 정보는 유용하며 HDR 및 SDR 디스플레이 모두에서 사용할 수 있습니다. 이 정보를 사용하여 앱의 톤 매핑 및 영역 매핑을 구성해야 합니다.

고급 색 기능의 변경 내용을 처리하려면 DisplayInformation::AdvancedColorInfoChanged 이벤트에 등록합니다. 어떤 이유로든 디스플레이의 고급 색 기능 매개 변수가 변경되면 해당 이벤트가 발생합니다.

AdvancedColorInfo새 인스턴스를 가져오고 변경된 값을 확인하여 해당 이벤트를 처리합니다.

IDXGIOutput6

참고 항목

DirectX 그래픽 인프라 IDXGIOutput6 인터페이스는 데스크톱이든 UWP(유니버설 Windows 플랫폼)이든 DirectX를 사용하는 모든 앱에서 사용할 수 있습니다. 그러나 IDXGIOutput6은 자동 색 관리와 같은 고급 색 기능이 있는 SDR 디스플레이를 지원하지 않으며 HDR 디스플레이만 식별할 수 있습니다.

Win32 데스크톱 앱을 작성하고 DirectX를 사용하여 렌더링하는 경우 DXGI_OUTPUT_DESC1 사용하여 표시 기능을 가져옵니다. IDXGIOutput6::GetDesc1을 통해 해당 구조체의 인스턴스를 가져옵니다.

현재 활성 상태인 고급 색 종류를 확인하려면 DXGI_COLOR_SPACE_TYPE 형식이며 다음 값 중 하나를 포함하는 ColorSpace 속성을 사용합니다.

DXGI_COLOR_SPACE_TYPE 표시 기능
DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 고급 색 기능이 없는 SDR 디스플레이
DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 모든 고급 색 기능이 있는 HDR 디스플레이

참고 항목

고급 색 기능이 있는 SDR 디스플레이도 DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;로 보고됩니다. DXGI에서는 두 형식을 구분할 수 없습니다.

참고 항목

DXGI에서는 현재 지원되지만 활성이 아닌 고급 색 종류를 확인할 수 없습니다.

DXGI_OUTPUT_DESC1 다른 대부분의 멤버는 SMPTE ST.2086 정적 HDR 메타데이터에 해당하는 패널의 실제 색 볼륨(광도 및 색 분광)에 대한 정적 정보를 제공합니다. ST.2086은 원래 HDR 디스플레이용으로 설계되었지만 해당 정보는 유용하며 HDR 및 SDR 디스플레이 모두에서 사용할 수 있습니다. 이 정보를 사용하여 앱의 톤 매핑 및 영역 매핑을 구성해야 합니다.

Win32 데스크톱 앱에는 고급 색 기능 변경에 응답하는 기본 메커니즘이 없습니다. 대신 앱에서 렌더링 루프를 사용하는 경우 각 프레임으로 IDXGIFactory1::IsCurrent를 쿼리해야 합니다. FALSE를 보고하는 경우 새 DXGI_OUTPUT_DESC1 가져와서 변경된 값을 확인해야 합니다.

또한 Win32 메시지 펌프는 WM_SIZE 메시지를 처리해야 합니다. 이는 앱이 다른 디스플레이 간에 이동했을 수 있음을 나타냅니다.

참고 항목

DXGI_OUTPUT_DESC1 가져오려면 현재 디스플레이를 가져와야 합니다. 그러나 IDXGISwapChain::GetContainingOutput을 호출하면 안 됩니다. 스왑 체인은 DXGIFactory::IsCurrent가 false이면 부실 DXGI 출력을 반환하고 스왑 체인을 다시 만들어 현재 출력 결과를 일시적으로 검은색 화면으로 만들기 때문입니다. 대신 모든 DXGI 출력의 범위를 열거하고 앱 창의 범위와 가장 큰 교집합이 있는 출력을 결정하는 것이 좋습니다.

다음 예제 코드는 GitHub의 Direct3D 12 HDR 샘플 앱 에서 제공됩니다.

// Retrieve the current default adapter.
ComPtr<IDXGIAdapter1> dxgiAdapter;
ThrowIfFailed(m_dxgiFactory->EnumAdapters1(0, &dxgiAdapter));

// Iterate through the DXGI outputs associated with the DXGI adapter,
// and find the output whose bounds have the greatest overlap with the
// app window (i.e. the output for which the intersection area is the
// greatest).

UINT i = 0;
ComPtr<IDXGIOutput> currentOutput;
ComPtr<IDXGIOutput> bestOutput;
float bestIntersectArea = -1;

while (dxgiAdapter->EnumOutputs(i, &currentOutput) != DXGI_ERROR_NOT_FOUND)
{
    // Get the retangle bounds of the app window
    int ax1 = m_windowBounds.left;
    int ay1 = m_windowBounds.top;
    int ax2 = m_windowBounds.right;
    int ay2 = m_windowBounds.bottom;

    // Get the rectangle bounds of current output
    DXGI_OUTPUT_DESC desc;
    ThrowIfFailed(currentOutput->GetDesc(&desc));
    RECT r = desc.DesktopCoordinates;
    int bx1 = r.left;
    int by1 = r.top;
    int bx2 = r.right;
    int by2 = r.bottom;

    // Compute the intersection
    int intersectArea = ComputeIntersectionArea(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2);
    if (intersectArea > bestIntersectArea)
    {
        bestOutput = currentOutput;
        bestIntersectArea = static_cast<float>(intersectArea);
    }

    i++;
}

// Having determined the output (display) upon which the app is primarily being 
// rendered, retrieve the HDR capabilities of that display by checking the color space.
ComPtr<IDXGIOutput6> output6;
ThrowIfFailed(bestOutput.As(&output6));

DXGI_OUTPUT_DESC1 desc1;
ThrowIfFailed(output6->GetDesc1(&desc1));

DirectX 스왑 체인 설정

디스플레이가 현재 고급 색 기능을 지원하는 것으로 확인되면 다음과 같이 스왑 체인을 구성합니다.

대칭 이동 프레젠테이션 모델 효과 사용

CreateSwapChainFor[Hwnd| 중 하나를 사용하여 스왑 체인을 만드는 경우컴퍼지션|CoreWindow] 메서드는 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 또는 DXGI_SWAP_EFFECT_FLIP_DISCARD 옵션을 선택하여 DXGI 대칭 이동 모델을 사용해야 합니다. 그러면 스왑 체인이 DWM의 고급 색 처리 및 다양한 전체 화면 최적화에 적합합니다. 자세한 내용은 최상의 성능을 위해 DXGI 대칭 이동 모델을 사용하세요.

옵션 1. FP16 픽셀 형식 및 scRGB 색 공간 사용

Windows 10은 고급 색의 픽셀 형식과 색 공간의 두 가지 주요 조합을 지원합니다. 앱의 특정 요구 사항에 따라 하나를 선택합니다.

범용 앱은 옵션 1을 사용하는 것이 좋습니다. 모든 유형의 고급 색 표시, 콘텐츠 및 렌더링 API에 대해 작동하는 유일한 옵션입니다. 스왑 체인을 만들 때 DXGI_SWAP_CHAIN_DESC1 DXGI_FORMAT_R16G16B16A16_FLOAT 지정합니다. 기본적으로 부동 소수점 픽셀 형식으로 만든 스왑 체인은 DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 색 공간을 사용하는 것처럼 처리됩니다. 이는 DWM에서 사용하는 것과 동일한 픽셀 형식 및 색 공간입니다.

이 조합은 숫자 범위와 정밀도를 제공하여 물리적으로 가능한 색을 지정하고 혼합을 포함한 임의의 처리를 수행합니다.

그러나 이 옵션은 픽셀당 64비트가 사용되며, 이는 기존 UINT8 픽셀 형식에 비해 GPU 대역폭 및 메모리 사용량을 두 배로 증가합니다. 또한 scRGB는 정규화된 [0, 1] 범위를 벗어난 숫자 값을 사용하여 sRGB 영역 외부에 있는 색 및/또는 80니트 이상의 광도를 나타냅니다. 예를 들어 scRGB(1.0, 1.0, 1.0)는 표준 D65 흰색을 80 nits로 인코딩합니다. 그러나 scRGB (12.5, 12.5, 12.5)는 훨씬 밝은 1000 nits에서 동일한 D65 흰색을 인코딩합니다. 일부 그래픽 작업에는 정규화된 숫자 범위가 필요하며 작업을 수정하거나 색 값을 다시 정규화해야 합니다.

해당 옵션으로 광도 값을 해석하는 방법은 SDR과 HDR 디스플레이 간에 다릅니다. 아래를 참조하세요.

옵션 2: UINT10/RGB10 픽셀 형식 및 HDR10/BT.2100 색 공간 사용

옵션 2는 앱이 다음 조건을 모두 충족하는 경우에만 사용할 수 있는 성능 최적화입니다.

  • HDR 디스플레이를 대상으로 지정합니다.
  • Direct3D 12 또는 Direct3D 11 사용
  • 스왑 체인은 알파/투명도와 혼합할 필요가 없습니다.

앱이 이러한 모든 조건을 충족하지 않는 경우 옵션 1을 사용해야 합니다.

그러나 앱이 옵션 2에 적합한 경우 앱이 비디오 플레이어와 같이 HDR10으로 인코딩된 콘텐츠를 사용하거나 게임과 같은 전체 화면 시나리오에서 주로 사용되는 경우 더 나은 성능을 제공할 수 있습니다. 스왑 체인을 만들 때 DXGI_SWAP_CHAIN_DESC1 DXGI_FORMAT_R10G10B10A2_UNORM 지정하는 것이 좋습니다. 기본적으로 sRGB 색 공간을 사용하는 것으로 처리됩니다. 따라서 IDXGISwapChain3::SetColorSpace1을 명시적으로 호출 하고 HDR10/BT.2100이라고도 하는 색 공간 DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 설정해야 합니다.

이 옵션은 기존 UINT8 SDR 픽셀 형식과 동일한 32비트(픽셀당)를 사용합니다. 또한 특정 GPU에서는 콘텐츠를 HDR10 와이어 형식으로 변환하는 데 필요한 일부 처리가 제거됩니다.

디스플레이가 SDR 모드일 때 고급 색 스왑 체인 사용

디스플레이가 모든 고급 색 기능을 지원하지 않는 경우에도 고급 색 스왑 체인을 사용할 수 있습니다. 이러한 경우 DWM(데스크톱 창 관리자)은 숫자 클리핑을 수행하여 디스플레이의 기능에 맞게 콘텐츠를 축소합니다. 예를 들어 FP16 scRGB 스왑 체인에 렌더링하고 표준 디스플레이를 대상으로 하는 경우 [0, 1] 숫자 범위를 벗어난 모든 항목이 잘립니다.

앱 창이 다른 고급 색 기능으로 둘 이상의 디스플레이를 가로지르고 있는 경우에도 이러한 컨버전 동작이 발생합니다. AdvancedColorInfoIDXGIOutput6은 주 디스플레이의 특성만 보고하도록 추상화됩니다( 디스플레이는 창의 중심을 포함하는 디스플레이로 정의됨).

앱의 참조를 OS SDR 참조 흰색 수준과 일치

참고 항목

참조 흰색은 HDR 디스플레이에만 적용됩니다. SDR 고급 색 표시의 경우(1.0, 1.0, 1.0)는 항상 디스플레이가 재현할 수 있는 최대 흰색 광도를 의미합니다.

많은 시나리오에서 앱은 SDR 및 HDR 콘텐츠를 모두 렌더링하려고 합니다. 예를 들어 HDR 비디오 또는 UI를 통해 자막 또는 전송 컨트롤을 게임 장면으로 렌더링합니다. SDR 콘텐츠가 HDR 디스플레이에서 올바르게 표시되는지 확인하려면 SDR 참조 흰색 수준의 개념을 이해하는 것이 중요합니다. 참조 흰색은 확산 흰색 개체(예: 용지 시트 또는 경우에 따라 UI)가 HDR 장면에 나타나는 밝기를 나타냅니다. HDR 색 값은 장면 참조 밝기를 가지므로 특정 색 값은 가능한 최대 패널 값을 기준으로 하지 않고 절대 광도 수준에서 표시되어야 합니다. 예를 들어 scRGB(1.0, 1.0, 1.0) 및 HDR10(497, 497, 497)은 모두 80니트 광도에서 정확히 D65 흰색을 인코딩합니다. Windows를 사용하면 사용자가 SDR 참조 흰색 수준을 기본 설정으로 조정할 수 있습니다. 즉, Windows에서 sRGB(1.0, 1.0, 1.0)를 렌더링하는 광도입니다. 데스크톱 HDR 모니터에서 SDR 참조 흰색 수준은 일반적으로 약 200니트로 설정됩니다.

HDR 앱은 사용자가 원하는 참조 흰색 수준을 설정하거나 시스템에서 구성한 값을 읽을 수 있도록 허용해야 합니다. 장면의 확산 흰색 값을 SDR 참조 흰색 수준에 매핑해야 합니다. 선형 감마 공간에 앱 프레임 버퍼를 곱해야 합니다.

참고 항목

노트북과 같은 밝기 컨트롤을 지원하는 디스플레이에서 Windows는 사용자가 원하는 밝기 수준과 일치하도록 HDR(장면 참조) 콘텐츠의 광도를 조정하지만 앱에는 보이지 않습니다. HDR 신호의 비트 정확한 재현을 보장하려고 하지 않는 한 일반적으로 무시할 수 있습니다.

앱이 항상 SDR 및 HDR을 별도의 표면으로 렌더링하고 OS 컴퍼지션을 사용하는 경우 Windows는 자동으로 올바른 조정을 수행하여 SDR 콘텐츠를 원하는 흰색 수준으로 향상시킵니다. 예를 들어 앱이 XAML을 사용하고 HDR 콘텐츠를 자체 SwapChainPanel에 렌더링하는 경우입니다.

그러나 앱이 SDR 및 HDR 콘텐츠의 자체 컴퍼지션을 단일 화면으로 수행하는 경우 SDR 참조 흰색 수준 조정을 직접 수행해야 합니다. 그렇지 않으면 일반적인 데스크톱 보기 조건에서 SDR 콘텐츠가 너무 흐리게 표시될 수 있습니다. 먼저 현재 SDR 참조 흰색 수준을 가져온 다음 렌더링하는 모든 SDR 콘텐츠의 색 값을 조정해야 합니다.

1단계. 현재 SDR 참조 흰색 수준 가져오기

다음 방법 중 하나로 현재 SDR 참조 흰색 수준을 가져올 수 있습니다.

2단계. SDR 콘텐츠의 색 값 조정

Windows는 80니트의 명목 또는 기본값 참조 흰색 수준을 정의합니다. 따라서 표준 sRGB(1.0, 1.0, 1.0)를 FP16 스왑 체인에 흰색으로 렌더링하는 경우 80니트 광도로 재현됩니다. 실제 사용자 정의 참조 흰색 수준과 일치하려면 SDR 콘텐츠를 80니트에서 AdvancedColorInfo.SdrWhiteLevelInNits를 통해 지정된 수준으로 조정해야 합니다.

FP16 및 scRGB 또는 선형(1.0) 감마를 사용하는 색 공간을 사용하여 렌더링하는 경우 SDR 색 값을 AdvancedColorInfo.SdrWhiteLevelInNits / 80곱하기만 하면 됩니다. Direct2D를 사용하는 경우 값이 80인 미리 정의된 상수 D2D1_SCENE_REFERRED_SDR_WHITE_LEVEL 있습니다.

D2D1_VECTOR_4F inputColor; // Input SDR color value.
D2D1_VECTOR_4F outputColor; // Output color adjusted for SDR white level.
auto acInfo = ...; // Obtain an AdvancedColorInfo.

float sdrAdjust = acInfo->SdrWhiteLevelInNits / D2D1_SCENE_REFERRED_SDR_WHITE_LEVEL;

// Normally in DirectX, color values are manipulated in shaders on GPU textures.
// This example performs scaling on a CPU color value.
outputColor.r = inputColor.r * sdrAdjust; // Assumes linear gamma color values.
outputColor.g = inputColor.g * sdrAdjust;
outputColor.b = inputColor.b * sdrAdjust;
outputColor.a = inputColor.a;

HDR10과 같은 비선형 감마 색 공간을 사용하여 렌더링하는 경우 SDR 흰색 수준 조정을 수행하는 것이 더 복잡합니다. 고유한 픽셀 셰이더를 작성하는 경우 선형 감마로 변환하여 조정을 적용하는 것이 좋습니다.

톤 매핑을 사용하여 디스플레이 기능에 HDR 콘텐츠 조정

HDR 및 고급 색 디스플레이는 기능 측면에서 매우 다양합니다. 예를 들어 최소 및 최대 광도 및 재현할 수 있는 색 영역입니다. 대부분의 경우 HDR 콘텐츠에는 디스플레이 기능을 초과하는 색이 포함됩니다. 최상의 이미지 품질을 위해서는 HDR 톤 매핑을 수행하는 것이 중요하며, 기본적으로 콘텐츠의 시각적 의도를 가장 잘 유지하면서 디스플레이에 맞게 색 범위를 압축하는 것이 중요합니다.

적응할 가장 중요한 단일 매개 변수는 MaxCLL(콘텐츠 광원 수준)으로도 알려진 최대 광도입니다. 더욱 정교한 톤 매퍼는 MinCLL(MinCLL) 및/또는 컬러 주체도 조정합니다.

1단계. 디스플레이의 색 볼륨 기능 가져오기

UWP(유니버설 Windows 플랫폼) 앱

AdvancedColorInfo를 사용하여 디스플레이의 색 볼륨을 가져옵니다.

Win32(데스크톱) DirectX 앱

DXGI_OUTPUT_DESC1 사용하여 디스플레이의 색 볼륨을 가져옵니다.

2단계. 콘텐츠의 색 볼륨 정보 가져오기

HDR 콘텐츠의 출처에 따라 광도 및 색상 영역 정보를 확인할 수 있는 여러 가지 방법이 있습니다. 특정 HDR 비디오 및 이미지 파일에는 SMPTE ST.2086 메타데이터가 포함되어 있습니다. 콘텐츠가 동적으로 렌더링된 경우 내부 렌더링 단계(예: 장면에서 가장 밝은 광원)에서 장면 정보를 추출할 수 있습니다.

보다 일반적이지만 계산 비용이 많이 드는 솔루션은 렌더링된 프레임에서 히스토그램 또는 기타 분석 패스를 실행하는 것입니다. GitHub의 Direct2D 고급 색 이미지 렌더링 샘플 앱Direct2D를 사용하여 이 작업을 수행하는 방법을 보여 줍니다. 가장 관련성이 큰 코드 조각은 다음과 같습니다.

// Perform histogram pipeline setup; this should occur as part of image resource creation.
// Histogram results in no visual output but is used to calculate HDR metadata for the image.
void D2DAdvancedColorImagesRenderer::CreateHistogramResources()
{
    auto context = m_deviceResources->GetD2DDeviceContext();

    // We need to preprocess the image data before running the histogram.
    // 1. Spatial downscale to reduce the amount of processing needed.
    DX::ThrowIfFailed(
        context->CreateEffect(CLSID_D2D1Scale, &m_histogramPrescale)
        );

    DX::ThrowIfFailed(
        m_histogramPrescale->SetValue(D2D1_SCALE_PROP_SCALE, D2D1::Vector2F(0.5f, 0.5f))
        );

    // The right place to compute HDR metadata is after color management to the
    // image's native colorspace but before any tonemapping or adjustments for the display.
    m_histogramPrescale->SetInputEffect(0, m_colorManagementEffect.Get());

    // 2. Convert scRGB data into luminance (nits).
    // 3. Normalize color values. Histogram operates on [0-1] numeric range,
    //    while FP16 can go up to 65504 (5+ million nits).
    // Both steps are performed in the same color matrix.
    ComPtr<ID2D1Effect> histogramMatrix;
    DX::ThrowIfFailed(
        context->CreateEffect(CLSID_D2D1ColorMatrix, &histogramMatrix)
        );

    histogramMatrix->SetInputEffect(0, m_histogramPrescale.Get());

    float scale = sc_histMaxNits / sc_nominalRefWhite;

    D2D1_MATRIX_5X4_F rgbtoYnorm = D2D1::Matrix5x4F(
        0.2126f / scale, 0, 0, 0,
        0.7152f / scale, 0, 0, 0,
        0.0722f / scale, 0, 0, 0,
        0              , 0, 0, 1,
        0              , 0, 0, 0);
    // 1st column: [R] output, contains normalized Y (CIEXYZ).
    // 2nd column: [G] output, unused.
    // 3rd column: [B] output, unused.
    // 4th column: [A] output, alpha passthrough.
    // We explicitly calculate Y; this deviates from the CEA 861.3 definition of MaxCLL
    // which approximates luminance with max(R, G, B).

    DX::ThrowIfFailed(histogramMatrix->SetValue(D2D1_COLORMATRIX_PROP_COLOR_MATRIX, rgbtoYnorm));

    // 4. Apply a gamma to allocate more histogram bins to lower luminance levels.
    ComPtr<ID2D1Effect> histogramGamma;
    DX::ThrowIfFailed(
        context->CreateEffect(CLSID_D2D1GammaTransfer, &histogramGamma)
        );

    histogramGamma->SetInputEffect(0, histogramMatrix.Get());

    // Gamma function offers an acceptable tradeoff between simplicity and efficient bin allocation.
    // A more sophisticated pipeline would use a more perceptually linear function than gamma.
    DX::ThrowIfFailed(histogramGamma->SetValue(D2D1_GAMMATRANSFER_PROP_RED_EXPONENT, sc_histGamma));
    // All other channels are passthrough.
    DX::ThrowIfFailed(histogramGamma->SetValue(D2D1_GAMMATRANSFER_PROP_GREEN_DISABLE, TRUE));
    DX::ThrowIfFailed(histogramGamma->SetValue(D2D1_GAMMATRANSFER_PROP_BLUE_DISABLE, TRUE));
    DX::ThrowIfFailed(histogramGamma->SetValue(D2D1_GAMMATRANSFER_PROP_ALPHA_DISABLE, TRUE));

    // 5. Finally, the histogram itself.
    HRESULT hr = context->CreateEffect(CLSID_D2D1Histogram, &m_histogramEffect);
    
    if (hr == D2DERR_INSUFFICIENT_DEVICE_CAPABILITIES)
    {
        // The GPU doesn't support compute shaders and we can't run histogram on it.
        m_isComputeSupported = false;
    }
    else
    {
        DX::ThrowIfFailed(hr);
        m_isComputeSupported = true;

        DX::ThrowIfFailed(m_histogramEffect->SetValue(D2D1_HISTOGRAM_PROP_NUM_BINS, sc_histNumBins));

        m_histogramEffect->SetInputEffect(0, histogramGamma.Get());
    }
}

// Uses a histogram to compute a modified version of MaxCLL (ST.2086 max content light level).
// Performs Begin/EndDraw on the D2D context.
void D2DAdvancedColorImagesRenderer::ComputeHdrMetadata()
{
    // Initialize with a sentinel value.
    m_maxCLL = -1.0f;

    // MaxCLL is not meaningful for SDR or WCG images.
    if ((!m_isComputeSupported) ||
        (m_imageInfo.imageKind != AdvancedColorKind::HighDynamicRange))
    {
        return;
    }

    // MaxCLL is nominally calculated for the single brightest pixel in a frame.
    // But we take a slightly more conservative definition that takes the 99.99th percentile
    // to account for extreme outliers in the image.
    float maxCLLPercent = 0.9999f;

    auto ctx = m_deviceResources->GetD2DDeviceContext();

    ctx->BeginDraw();

    ctx->DrawImage(m_histogramEffect.Get());

    // We ignore D2DERR_RECREATE_TARGET here. This error indicates that the device
    // is lost. It will be handled during the next call to Present.
    HRESULT hr = ctx->EndDraw();
    if (hr != D2DERR_RECREATE_TARGET)
    {
        DX::ThrowIfFailed(hr);
    }

    float *histogramData = new float[sc_histNumBins];
    DX::ThrowIfFailed(
        m_histogramEffect->GetValue(D2D1_HISTOGRAM_PROP_HISTOGRAM_OUTPUT,
            reinterpret_cast<BYTE*>(histogramData),
            sc_histNumBins * sizeof(float)
            )
        );

    unsigned int maxCLLbin = 0;
    float runningSum = 0.0f; // Cumulative sum of values in histogram is 1.0.
    for (int i = sc_histNumBins - 1; i >= 0; i--)
    {
        runningSum += histogramData[i];
        maxCLLbin = i;

        if (runningSum >= 1.0f - maxCLLPercent)
        {
            break;
        }
    }

    float binNorm = static_cast<float>(maxCLLbin) / static_cast<float>(sc_histNumBins);
    m_maxCLL = powf(binNorm, 1 / sc_histGamma) * sc_histMaxNits;

    // Some drivers have a bug where histogram will always return 0. Treat this as unknown.
    m_maxCLL = (m_maxCLL == 0.0f) ? -1.0f : m_maxCLL;
}

3단계 HDR 톤 매핑 작업 수행

Tonemapping은 본질적으로 손실 프로세스이며 여러 지각 또는 목표 메트릭에 최적화될 수 있으므로 단일 표준 알고리즘이 없습니다. Windows는 Media Foundation HDR 비디오 재생 파이프라인뿐만 아니라 Direct2D의 일부로 기본 제공 HDR 톤매퍼 효과를 제공합니다. 다른 일반적으로 사용되는 알고리즘으로는 ACES Filmic, Reinhard 및 ITU-R BT.2390-3 EETF(전기-전기 전송 함수)가 있습니다.

간소화된 라인하르트 톤매퍼 연산자는 다음 코드 예제에 나와 있습니다.

// This example uses C++. A typical DirectX implementation would port this to HLSL.
D2D1_VECTOR_4F simpleReinhardTonemapper(
    float inputMax, // Content's maximum luminance in scRGB values, e.g. 1.0 = 80 nits.
    float outputMax, // Display's maximum luminance in scRGB values, e.g. 1.0 = 80 nits.
    D2D1_VECTOR_4F input // scRGB color.
)
{
    D2D1_VECTOR_4F output = input;

    // Vanilla Reinhard normalizes color values to [0, 1].
    // This modification scales to the luminance range of the display.
    output.r /= inputMax;
    output.g /= inputMax;
    output.b /= inputMax;

    output.r = output.r / (1 + output.r);
    output.g = output.g / (1 + output.g);
    output.b = output.b / (1 + output.b);

    output.r *= outputMax;
    output.g *= outputMax;
    output.b *= outputMax;

    return output;
}

HDR 및 WCG 화면 콘텐츠 캡처

Windows.Graphics.Capture 네임스페이스 및 IDXGIOutput5::D uplicateOutput1 메서드와 같은 픽셀 형식 지정을 지원하는 API는 픽셀 정보를 잃지 않고 HDR 및 WCG 콘텐츠를 캡처하는 기능을 제공합니다. 콘텐츠 프레임을 획득한 후에는 추가 처리가 필요합니다. 예를 들어 HDR-SDR 톤 매핑(예: 인터넷 공유를 위한 SDR 스크린샷 복사본) 및 적절한 형식(예: JPEG XR)으로 콘텐츠 저장.

레거시 색 관리 및 ICC 프로필 동작 변경

고급 색 및 자동 색 관리는 모든 앱, 레거시 및 최신 앱에 대해 일관되고 색이 정확한 표시 색을 보장합니다. 그러나 일부 앱은 ICC(International Color Consortium) 색 프로필을 사용하여 고유한 명시적 색 관리를 수행할 수 있습니다.

SDR 또는 HDR 디스플레이에서 고급 색이 활성화되면 디스플레이 ICC 프로필의 동작이 이전 버전과 호환되지 않는 방식으로 변경됩니다. 앱이 디스플레이 ICC 프로필과 함께 작동하는 경우 Windows는 앱이 계속해서 올바른 동작을 얻을 수 있도록 호환성 도우미를 제공합니다.

ICC 프로필 동작의 변경 내용 및 고급 색과의 호환성을 최대화하기 위해 앱을 조정하는 방법에 대한 자세한 내용은 고급 색을 사용한 ICC 프로필 동작을 참조하세요.

추가 리소스

  • GitHub에서 DirectX 11 / DirectX 12용 DirectX 도구 키트와 함께 HDR 렌더링을 사용합니다. DirectXTK(DirectX 도구 키트)를 사용하여 DirectX 앱에 HDR 지원을 추가하는 방법을 연습합니다.
  • Direct2D 고급 색 이미지 렌더링 샘플 앱. Direct2D를 사용하여 고급 색 인식 HDR 및 WCG 이미지 뷰어를 구현하는 UWP SDK 샘플 앱입니다. 표시 기능 변경에 응답하고 SDR 흰색 수준에 맞게 조정하는 등 UWP 앱에 대한 모든 모범 사례를 보여 줍니다.
  • Direct3D 12 HDR 데스크톱 샘플 앱. 기본 Direct3D 12 HDR 장면을 구현하는 데스크톱 SDK 샘플입니다.
  • Direct3D 12 HDR UWP 샘플 앱. 위의 샘플에 해당하는 UWP입니다.
  • SimpleHDR_PC. 기본 Direct3D 11 HDR 장면을 구현하는 Xbox ATG SimpleHDR PC 샘플 앱(데스크톱 샘플 앱)