色空間のデータの変換
画面を構成したり、浮動小数点演算を実行したりするには、正しい色空間で作業する必要があります。 線形色空間で浮動小数点演算を実行することをおすすめします。 次に、画像を画面に表示するには、データを標準の RGB データ (sRGB、ガンマ 2.2 補正) 色空間に変換します。 sRGB 色空間で画面に表示することは、色の精度にとって重要です。 画像がガンマ 2.2 で修整されていない場合は、ユーザーが区別できないほど、多すぎるビットか多すぎる帯域幅を割り当てている、およびユーザーが敏感になるほど、値をシャドウ処理をするのにビットや帯域幅が少なすぎるため、同じ見栄えを維持するために、より多くのビットまたは帯域幅が必要になります。 そのため、最適な色精度を確保するために、ガンマ 2.2 補正された画像を画面に表示します。
厳密に言えば、実際の sRGB 伝達関数は、未加工の 2.2 パワー ガンマとは若干異なる、段階的な数式 (線形セグメント + 2.4 累乗) です。 わかりやすくするために、それらを同じ意味で使用します。
色の精度
プレゼンテーションの場合、整数値の表示形式 (DXGI_FORMAT_B8G8R8A8_UNORM_SRGB、DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORMなど) には、常に sRGB ガンマ修整データが含まれます。 浮動小数点型の表示形式 (現在はDXGI_FORMAT_R16G16B16A16_FLOATのみ) には、線形値のデータが含まれています。
_SRGB 形式修飾子 は、アプリが画面に sRGB データを配置するのに役立つオペレーティング システムを示します。 データの形式名にこの書式修飾子がない場合でも、アプリは常に sRGB データを整数値形式のバック バッファーに配置して、sRGB データを画面に表示する必要があります。 表示スキャンアウト形式の完全なリスト:
- Direct3D 機能レベル 12.1 ハードウェアの DXGI 形式サポート
- Direct3D 機能レベル 12.0 ハードウェアの DXGI 形式サポート
- Direct3D 機能レベル 11.1 ハードウェアの DXGI 形式サポート
- Direct3D 機能レベル 11.0 ハードウェアの DXGI 形式サポート
- Direct3D 10Level9 形式のハードウェア サポート
- Direct3D 10.1 形式のハードウェア サポート
- Direct3D 10 形式のハードウェア サポート
パイプラインにバインドされた_SRGB形式修飾子を使用してピクセル シェーダーからレンダー ターゲット ビュー (RenderTargetView) に浮動小数点出力値を書き込む場合、それらをガンマ 2.2 修正色空間に変換します。 同様に、_SRGB形式修飾子を持つシェーダー リソース ビュー (ShaderResourceView) がパイプラインにバインドされている場合は、ShaderResourceViewから値を読み取るときに、値をガンマ 2.2 補正色空間から線形色空間に変換します。 その後、シェーダーはそれらに対して操作を実行できます。
たとえば、次のようなコードを使用して、シェーダーからの浮動小数点出力値を RenderTargetView 形式に書き込みます。
struct PSOut
{
float4 color : SV_Target;
};
PSOut S( PSIn input )
{
PSOut output;
output.color = float4( 1.0, 0.0, 0.0, 1.0 );
return output;
}
‘S’ ルーチンが戻ると、浮動小数点 (1、0、0、1) の値が RenderTargetView 形式に変換されます。 次に、_SRGB形式修飾子を RenderTargetView に割り当てると、ガンマ変換が行われます。
これらは、画面に表示される内容の色精度が最も高いかどうかを確認するために従う手順です。
パイプラインの色の正確性を確保するには
- テクスチャに sRGB コンテンツがある場合は、ShaderResourceView に _SRGB 形式修飾子があることを確認します。ShaderResourceView からシェーダーに読み取るときに、テクスチャ コンテンツをガンマ 2.2 修正色空間から線形色空間に変換します。
- シェーダーの出力値がガンマ変換されるように、RenderTargetView に_SRGB形式修飾子も含まれている必要があります。
上記の手順に従って IDXGISwapChain1::P resent1 メソッドを呼び出すと、スクリーンに表示される内容の色の正確性が最も高まります。
ID3D11Device::CreateRenderTargetView メソッドを使用すると、DXGI_FORMAT_*_UNORM形式でのみ作成するスワップ チェーンからバック バッファーにDXGI_FORMAT_*_SRGB ビューを作成できます。 これは、レンダー ターゲット ビューを作成するルールに対する特別な例外です。これは、DXGI_FORMAT_*_TYPELESSで 表示するリソースを作成した場合にのみ、ID3D11Device::CreateRenderTargetView で 別の形式を使用できることを示します。
データ変換のルールの詳細については、データ変換のルールを参照してください。
テクスチャの読み取りとテクスチャへの書き込みの両方を同時に行う方法については、インプレース イメージ編集の解凍と圧縮 DXGI_FORMATを参照してください。
関連トピック