Windows ハードウェア ディスプレイのカラー調整パイプライン

このトピックでは、Windows 10 バージョン 2004 (20H1) 以降でサポートされている新しい GPU ディスプレイカラー変換パイプラインを使用した表示色調整について説明します。 パイプラインは、GDI ガンマ ランプ パイプラインなどの既存のパスに対して色の精度を大幅に向上させ、HDR ディスプレイのサポートを追加します。

このトピックは、顧客のディスプレイをより適切に調整したいディスプレイおよび PC メーカーおよびディスプレイ校正プロバイダー向けです。 ほとんどの Windows アプリは、パイプラインの恩恵を受けるために何もする必要はありません。ただし、カラーマネージド アプリを開発する場合は、このテクノロジのしくみを把握しておく必要があります。

GPU がシステム要件を満たしている場合、新しいカラー パイプラインは任意のディスプレイで使用できます。 ディスプレイが HDR の場合、または自動カラー管理を使用している場合は、追加の考慮事項と要件があります。 これは、「 高/標準のダイナミック レンジ ディスプレイで DirectX を高度な色で使用する」で確認できます。

はじめに

ディスプレイカラーキャリブレーションは、ディスプレイが報告された色空間と正確に一致することを保証するプロセスです。たとえば、sRGB や DCI-P3 D65 などです。 製造プロセスやその他のソースが異なるため、個々のディスプレイ パネルがその仕様から逸脱する可能性があります。 ディスプレイが調整されると、アプリとコンテンツは、そのばらつきや不正確さを気にすることなく、ディスプレイの色空間を自信を持ってターゲットにすることができます。

大まかに言えば、表示色の調整には次の手順が含まれます。

  1. 既知の色値のセットをレンダリングするときに、ディスプレイの実際の色出力の光学測定を実行します。
  2. 測定データに基づいて、ディスプレイ内の不正確さを修正する色変換を生成し、表示の結果のカラー ボリュームを記述するメタデータを生成します。
  3. 後で使用できるように、色変換データを格納し、メタデータを表示します。
  4. 実行時に、カラー変換を読み込んで表示フレームバッファーに適用し (ディスプレイに送信される色の値)、表示メタデータをアプリに報告します。

Windows 10、バージョン 2004 では手順 3 と 4 の機能が強化され、ディスプレイの製造元と校正プロバイダーは手順 1 と 2 を担当します。

システム要件

新しい色変換パイプラインには、対応する GPU とディスプレイ ドライバーが必要です。 サポートされている GPU アーキテクチャは次のとおりです。

  • Amd:
    • AMD RX 500 400 シリーズ以降
    • Radeon Graphics を使用した AMD Ryzen プロセッサ
  • インテル:
    • 統合: Intel 10th Gen GPU (Ice Lake) 以降
    • ディスクリート: Intel DG1 以降
  • NVIDIA GTX 10xx 以降 (Pascal+)
  • Qualcomm 8CX Gen 3 以降。7C Gen 3 以降

注意

Intel codename Comet Lake (5 桁モデル コード) チップセットはサポートされていません。

Windows ディスプレイ ドライバー モデル (WDDM) 2.6 以降のドライバーが必要です (Windows 10 バージョン 1903 でリリース)。 GPU ベンダーによっては、WDDM 3.0 (Windows 11 バージョン 21H2 でリリース) と同じくらい新しいドライバーが必要な場合があります。

新しいカラー変換パイプラインがシステムで使用できるかどうかをアプリが判断する方法については、「 新しい表示 ICC プロファイル管理 API」を 参照してください。

新しい GPU カラー変換パイプライン

Windows 10、バージョン 2004 では、線形ガンマ カラー マトリックスと 1DLUT で構成される GPU アクセラレータディスプレイカラー変換パイプラインが公開されています。 既存の ガンマランプ パイプラインと比較して、優れた精度、精度、および広色域ディスプレイのサポートを提供します。 さらに、BT.2100 シグナリングを使用する HDR ディスプレイなどの新しいテクノロジのサポートも追加されています。

パイプラインはアプリによって直接プログラム可能ではなく、代わりに MHC プロファイル経由でのみ公開されます。詳細については、以下を参照してください。 夜間照明などの他のオペレーティング システム (OS) 機能もこのパイプラインを使用する可能性があり、OS は複数のシナリオ間でパイプライン アクセスを共有 (作成) または合理化する方法を管理します。

色変換パイプラインの説明

色変換パイプラインは、色空間変換の標準的な概念モデルに基づいています。

ブロック図: ソース デガムマ、カラー マトリックス、ターゲット の再ギャマ

モデルは、sRGB などの任意の 2 つの RGB (または他の 3 チャネル) カラー スペース間で P3 D65 に変換できます。 また、最も一般的な種類のパネルカラーバリエーションを修正することもできます。

Windows 色変換パイプラインは概念モデルを受け取り、ステージ 2 (カラー マトリックス) と 3 (ターゲット regamma) をサブステージに拡張し、アプリがプログラムするためのステージのサブセット (2b と 3b、緑) を公開し、ドライバーによって制御される残りの部分 (白) を残します。

ブロック図: ソース デガママ;カラーマトリックスはソースRGBからXYZ、XYZからXYZに分解され、RGBをターゲットとするXYZ。電信伝達機能に分解されたターゲットの再ギャマ、1DLUT調整

これらの変更により、カラー パイプラインはソース コンテンツの色空間に依存せず、フレーム間で変更される可能性があります。 また、精度を維持するために不透明な最適化が必要な BT.2100 ST.2084 などの表示色空間との互換性が向上します。

ステージ 0: ソース (グラフィックス入力)

入力は、OS からレンダリングされたフレームバッファーです。 sRGB、sYCC、HDR10、scRGB など、シナリオに応じて複数の色空間のいずれかに指定でき、フレーム単位で変更できます。

ステージ 1: ソース デガマ

ディスプレイ ドライバーはソース コンテンツを自動的に線形ガンマに変換します。このステージはアプリではプログラムできません。

ステージ 2: 色空間変換マトリックス

標準色空間変換モデルでは、マトリックス ステージを 3 つのマトリックスに分割できます。このマトリックスは、一緒に構成 (乗算) されます。

  • 2a: ソース コンテンツの RGB 色空間 (線形ガンマ) から絶対色空間に変換します。Windows パイプラインでは、絶対色空間は CIEXYZ です。

  • 2b: 調整など、CIEXYZ 空間で調整を実行します。

  • 2c: CIEXYZ からターゲット RGB カラー 空間 (線形ガンマ) に変換します。 ターゲット RGB カラー スペースは、ディスプレイ ワイヤ (通常は BT.709 または BT.2020 プライマリ) を介して色を送信するときに使用されるエンコードとして定義されます。 物理パネルの実際の測定プライマリではありません。

マトリックス2aはソースコンテンツによって決定され、マトリックス2cはディスプレイのシグナリングモードによって決定される。マトリックス 2b のみがアプリからアクセスできます。 ドライバーは 3 つを乗算して、ハードウェアで実行される実際のマトリックスを生成します。

FinalMatrix = SourceRGBtoXYZ * XYZtoXYZAdjust * XYZtoTargetRGB

注意

ディスプレイ ドライバーはソース RGB から XYZ を担当し、XYZ から RGB への変換をターゲットとするため、プログラムするマトリックス (ステージ 2b) にはどちらも含めないようにする必要があります。

例 1: 色の調整 (パススルー) を実行しない場合、出力するディスプレイの種類に関係なく、マトリックスは ID である必要があります。

例 2: SDR P3 D65 ディスプレイに出力していて、パネル上の sRGB をエミュレートする "sRGB 校正" プロファイルを実装している場合、マトリックスは sRGB から P3 D65 へのプライマリローテーションで構成されている必要があります。

ステージ 3: ターゲット ReGamma

このステージは、次の 2 つの RGB 1DLUT に分割できます。これらはまとめて構成されます。

  • 3a: ステージ 2c のリニア RGB データを、ディスプレイ ワイヤ上の信号の伝達関数/ガンマにエンコードします。

  • 3b: 調整など、ターゲット ガンマ空間で調整を実行します。

1DLUT 3aは、表示ワイヤフォーマットの色空間によって決定される。SDR ディスプレイの場合は sRGB、HDR ディスプレイの場合は ST.2084 が最も一般的です。 3bは、アプリによってプログラム可能であり、ワイヤフォーマット転送機能が適用された後に発生します。 ドライバーは、ハードウェアで実行される実際の 1DLUT を生成する 2 つの 1DLUT を構成します。

Final1DLUT = Adjustment1DLUT(TargetReGamma(input))

注意

ドライバーは表示信号転送関数のプログラミングを担当するため、プログラムする 1DLUT (3b) にはそのエンコードを含めないようにする必要があります。 たとえば、色の調整 (パススルー) を実行しない場合、表示ワイヤ形式の色空間に関係なく、1DLUT は ID である必要があります。

ステージ 4: ターゲット (スキャンアウトへの出力)

これは、GPU によってネットワーク上でスキャンされるフレームバッファーです。ディスプレイのネイティブカラースペースで、調整後にプログラムを作成します。 その後、YCbCr エンコードなどの追加操作が発生する可能性があります。

より高い精度と精度

線形ガンマ 行列ステージ (XYZ から XYZ 調整) 機能は、Windows 10 バージョン 1709 で導入されました。 この機能を使用すると、カラー プライマリとホワイト ポイント、および任意の RGB 色空間変換に対して調整を実行できます。

1DLUT 調整ステージは、概念的には既存の ガンマ ランプ 1DLUT に似ていますが、最大 16 ビットの固定小数点精度で最大 4096 個の LUT エントリを使用して、精度が向上します。

注意

すべてのハードウェアが、カラー パイプラインによって公開されるエントリまたは精度の完全な数をサポートしているわけではありません。

HDR (BT.2100) ディスプレイのサポート

既存の ガンマ ランプ パイプラインの制限は、ディスプレイで HDR (BT.2100 ST.2084) シグナリングを使用している場合に未定義の動作が発生することです。 新しいカラー変換パイプラインは、SDR (BT.1886 または sRGB) と HDR シグナリングの両方を明示的にサポートし、将来のワイヤ形式の色空間をサポートするようにスケーリングします。 これを実現するには、ブロック図の "XYZ to Target RGB" ステージと "電信伝達関数" () ステージを使用します。

rgbおよび電信伝達関数ステージをターゲットとするxyzを識別するブロック図

ドライバーによって自動的に制御されるこれら 2 つのステージは、ワイヤ形式の色空間 (sRGB や BT.2020 ST.2084 など) に色をエンコードする役割を担います。

したがって、色変換パイプラインをプログラミングする場合は、ディスプレイのアクティブなワイヤ形式の色空間に基づいて適切に定義された動作が得られます。

ICC プロファイル用の新しい "MHC2" タグ

Windows には、実行時に新しい色変換パイプラインを直接制御するための API は用意されていません。 代わりに、アプリは、新しい "Microsoft Hardware Calibration" ("MHC2") プライベート タグに格納された追加データを使用して、適切に書式設定された国際色コンソーシアム (ICC) カラー プロファイルを記述することでパイプラインにアクセスします。 これは、"VCGT" プライベート ICC タグを使用する既存の ガンマ ランプ パイプラインと同様のモデルです。 有効な MHC2 タグ データを持つ ICC プロファイルは、"MHC ICC プロファイル" または "MHC プロファイル" と呼ばれます。

注意

MHC2 は、すべてのWindows 10バージョン 2004 デバイスで使用できるプライベート タグの 2 番目のバージョンを指します。MHC1 は、特定の OEM PC を搭載した Windows の以前のリリースで出荷されました。

補足 ST.2086 HDR 静的メタデータ

新しい色変換パイプラインのプログラミングに加えて、MHC ICC プロファイルには ST.2086 HDR 静的メタデータも含まれています。 これらは、ディスプレイのダイナミックレンジ(輝度)と色域を表す値です。 HDR ディスプレイで広く実装されていますが、任意のディスプレイに役立ちます。 値は次のとおりです。

  • ピーク輝度 (nits)
  • 最大フルフレーム輝度 (nits)
  • 最小輝度 (nits)
  • RGB 色の原色 (xy 座標)
  • 白点 (xy 座標)

ホワイト ポイント、最大フル フレーム輝度、RGB カラー プライマリは、標準の ICC タグを使用して記述されます。 ピークと最小輝度は、MHC2 タグで説明されています。 プロファイルには、OS がプロファイルを受け入れ、高度な色のシナリオで使用するために、この情報がすべて含まれている必要があります。

Windows は、MHC ICC プロファイル、グラフィックス ドライバー、EDID または DisplayID ファームウェアなど、複数のソースから ST.2086 メタデータを合理化します。 MHC ICC プロファイルは、最も信頼できるソースとして扱われ、他のソースをオーバーライドします。 Windows では、「 高/標準のダイナミック レンジ ディスプレイで DirectX と高度な色を使用する」の説明に従って、HDR 機能 API を介してこの情報が公開されます。この方法では、HDR アプリに最適な HDR ディスプレイ情報が提供されます。

調整可能なバックライトディスプレイ用ST.2086輝度の定義

ディスプレイには、調整可能なバックライト (ユーザーによって制御される、周囲光センサーによって自動的に制御されるなど) が含まれる場合があります。 これは、ST.2086 輝度値の解釈方法にあいまいさを導入します。

Windows がバックライトを制御するディスプレイ (通常はノート PC および統合パネル デバイスの場合) の場合、輝度値は、この OS 制御バックライトが最大または最も明るい設定である場合を示す必要があります。

Windows がバックライトを制御できないディスプレイの場合 (通常は外部モニターの場合)、輝度値は測定時の表示状態に対してのみ正確です。

ICC プロファイルの要件

MHC ICC プロファイルでは、ICC 仕様バージョン 2 (ICC.1:2001-04) またはバージョン 4 (ICC.1:2010-12/ISO 15076-1:2010) を使用する必要があります。 MHC ICC プロファイルは、表示装置プロファイルでなければなりません。

MHC ICC プロファイルには、色変換パイプライン データが含まれる場合があります。 色変換を定義する MHC2 構造体の部分は、ID 変換を明示的に示す空の場合があります。

MHC ICC プロファイルには ST.2086 メタデータを含める必要があります。 ST.2086 メタデータのみを含み、変換データを含まないプロファイルは、HDR ディスプレイの調整シナリオで使用されます。その場合、HDR キャリブレーションは、HDR アプリとゲームに対してより正確な最小/最大輝度と色域情報を提供することを意味します。

既存のパブリック タグの再利用

MHC ICC プロファイルは、既存のパブリック タグを使用して ST.2086 メタデータ値の一部を定義します。 これらのタグはすべて、ディスプレイ デバイス プロファイルに既に必要です。 タグとデータ型の定義は、 ICC 仕様で確認できます。

タグ名 データ型 ST.2086 値 Windows によって報告されるユニット
redColorantTag XYZNumber 赤いプライマリ 色度 (xy)
greenColorantTag XYZNumber 緑のプライマリ 色度 (xy)
blueColorantTag XYZNumber 青いプライマリ 色度 (xy)
mediaWhitePointTag XYZNumber 白い点 色度 (xy)
luminanceTag XYZNumber 最大フル フレーム輝度 輝度 (nits)

"MHC2" プライベート タグ定義

MHC ICC プロファイルには、1 つの MHC2 タグ構造が含まれている必要があります。 マトリックスおよび 1DLUT カラー変換要素は、0 (NULL) に設定できます。これは、それぞれのステージの ID 変換を明示的に示します。 ST.2086 メタデータ値には、有効なデータを入力する必要があります。

バイト位置 フィールドの長さ (バイト) Content データ型
0 から 3 4 'MHC2' (4D484332h) Type Signature MHC2Type
4 から 7 4 タグ データ要素の先頭へのオフセット uInt32Number
8 から 13 4 タグ データ要素のサイズ uInt32Number

MHC2Type 構造体の定義

バイト位置 フィールドの長さ (バイト) Content データ型
0 から 3 4 'MHC2' (4D484332h) Type Signature
4 から 7 4 予約済み(0 に設定)
8 から 11 4 1DLUT エントリの数 (4096 以下) [1]
省略可能: 0 = ID 変換
uInt32Number
12 から 15 4 ST.2086 min luminance in nits S15Fixed16Number
16 から 19 4 ST.2086 ピーク輝度 (nits) S15Fixed16Number
20 から 23 4 マトリックスへのバイト単位のオフセット [2]
省略可能: 0 = ID 変換
uInt32Number
24 から 27 4 赤 1DLUT [2] へのバイト単位のオフセット uInt32Number
28 から 31 4 緑色の 1DLUT へのバイト単位のオフセット [2] uInt32Number
32 から 35 4 青色の 1DLUT へのバイト単位のオフセット [2] uInt32Number

[1] OS は、ハードウェアでサポートされているエントリの数にデータを補間します。

[2] MHC2Type 構造体内のオフセットは、ファイルではなく、構造体の先頭に対して相対的です。

マトリックス定義

バイト位置 フィールドの長さ (バイト) Content データ型
0 から 23 24 3x4 XYZ から XYZ 調整マトリックス
行の主な順序で格納されている列 4 は無視されます [1]
s15Fixed16Number

[1] 行列構造は、3x4 行列の 12 個の要素を行の主な順序で収まるようにサイズ変更されます。 ただし、Windows では左の 3 列のデータのみが使用され、実質的に 3 x 3 行列が定義されます。 たとえば、次の 12 個の値を線形順に格納します。

[a, b, c, 0, d, e, f, 0, g, h, i, 0]

は、次の行列を生成します。

最初の列 2 番目の列 3 番目の列
a b c
d e f
G h i

注意

「色空間変換マトリックス」で説明されているように、RGB マトリックス変換をターゲットとするソース RGB を XYZ または XYZ に含めないでください。これは、ドライバーによって自動的に処理されるためです。 ターゲットRGBは、ディスプレイワイヤ上で色を送信するときに使用されるエンコーディングとして定義されます。通常は BT.709 または BT.2020 プライマリです。

1DLUT 定義

バイト位置 フィールドの長さ (バイト) Content データ型
0 から 3 4 'sf32' (73663332h) Type Signature
4 から 7 4 予約済み(0 に設定)
8 から最後まで 変数 (0 から 16384) [0.0, 1.0] に正規化された調整 LUT 値 s15Fixed16Number

注意

Target ReGamma で説明されているように、この LUT は、転送関数がエンコードされた後、ワイヤ形式の色空間で動作します。

注意

測定または検量線で必要な LUT エントリ数が 4096 未満の場合は、実際に必要なエントリの数のみを格納し、MHC2Type 構造体にカウントを指定します。 たとえば、最も単純な ID LUT では、0.0 と 1.0 に設定されたエントリが 2 つだけ必要です。 OS は、ハードウェアでサポートされているエントリの数に補間されます。

新しい表示 ICC プロファイル管理 API

注意

このセクションのガイダンスは、MHC データが含まれているかどうかにかかわらず、表示 ICC プロファイルに適用されます。

MHC ICC プロファイルを生成したら、対象のディスプレイ用に Windows システムでプロビジョニングします。 以前のバージョンの Windows では、 Windows カラー システム (WCS) プロファイル管理機能 を使用してこれを行いました。 これらの既存の API を引き続き使用できますが、Windows 10バージョン 2004 では、表示 ICC カラー プロファイルの管理に特化した一連の新しい最新化された API が WCS に追加されます。 これらの API には、すべて "ColorProfile" というプレフィックスが付いています。

  • ColorProfileAddDisplayAssociation
  • ColorProfileRemoveDisplayAssociation
  • ColorProfileSetDisplayDefaultAssociation
  • ColorProfileGetDeviceCapabilities

注意

上記の API には、同等の既存の WCS API がない機能が用意されています。

  • ColorProfileGetDisplayList
  • ColorProfileGetDisplayDefault
  • ColorProfileGetDisplayUserScope

ColorProfile API を使用して MHC ICC プロファイルをシステムにプロビジョニングする一般的なワークフローは次のとおりです。

  1. ColorProfileGetDeviceCapabilities を使用して、システムが新しい色変換パイプラインをサポートしているかどうかを判断します。 そうでない場合でも、追加の ST.2086 メタデータを提供するためにプロファイルをプロビジョニングすると便利な場合があります。
  2. InstallColorProfile (既存の WCS API) を使用して、カラー プロファイルをインストールします。 システムで使用できるプロファイルの一覧にプロファイルが追加されます。
  3. ColorProfileGetDisplayUserScope を使用して、Windows ユーザーがシステムの既定のプロファイル関連付けをオーバーライドし、独自のユーザーごとの関連付けリストを使用しているかどうかを判断します。
  4. ColorProfileAddDisplayAssociation を使用して、カラー プロファイルをディスプレイに関連付け (インストールされているプロファイルをそのディスプレイで選択可能にする)、必要に応じてプロファイルを既定 (現在アクティブなプロファイル) に設定します。

拡張 Windows ディスプレイ調整ローダー

Windows では、Windows 7 以降、受信トレイの表示色調整ローダーが提供されています。 このキャリブレーション ローダーは、VCGT または MS00 プライベート ICC プロファイル タグに格納された ガンマ ランプ パイプライン データを使用した ICC プロファイルの読み取りをサポートしています。 ガンマ ランプ ローダーは、WcsSetCalibrationManagementState を呼び出して明示的にオンにする必要があります。

Windows 10バージョン 2004 では、MHC ICC プロファイルと新しい色変換パイプラインのサポートが追加され、受信トレイ調整ローダーが強化されます。 MHC ICC プロファイルの作成とプロビジョニング、および Windows ローダーの状態の適用は、アプリがカラー変換パイプラインにアクセスするための唯一の方法です。直接アクセス API はありません。 ガンマ ランプ プロファイルとは異なり、MHC ICC プロファイルからの読み取りは常に有効になるため、対応するシステムで MHC ICC プロファイルが既定として設定されると、そのキャリブレーション状態が自動的に読み込まれます。

自動システム カラー管理を使用した HDR と高度な色のシナリオ

HDRや自動色管理などの新しい高度なカラー技術は、優れた色精度とはるかに大きなディスプレイ色域へのアクセスを含む新しい機能をWindowsに追加します。詳細については、「 高/標準のダイナミック レンジ ディスプレイで DirectX と高度な色を使用する」を参照してください。

高度な色管理と自動色管理により、レガシとモダンの両方の、すべてのアプリで一貫性があり、比色精度の高い表示色が保証されます。 ただし、一部のアプリでは、International Color Consortium (ICC) カラー プロファイルを使用して独自の明示的なカラー管理を実行する場合があります。

SDR ディスプレイまたは HDR ディスプレイで Advanced Color がアクティブになっている場合、ディスプレイ ICC プロファイルの動作は、下位互換性のない方法で変化します。 アプリがディスプレイ ICC プロファイルで動作する場合、Windows は互換性動作を提供して、アプリが引き続き正しい動作を得られるようにします。

ICC プロファイルの動作の変更と、高度な色との互換性を最大限に高めるためにアプリを調整する方法については、「高度な色を使用した ICC プロファイルの動作」を参照してください。