In-Placeイメージ編集用のアンパックとパッキングDXGI_FORMAT

D3DX_DXGIFormatConvert.inl ファイルには、Direct3D 11 ハードウェアのコンピューティング シェーダーまたはピクセル シェーダーで使用できるインライン形式変換関数が含まれています。 これらの関数をアプリケーションで使用して、テクスチャの読み取りと書き込みの両方を同時に行うことができます。 つまり、インプレース 画像編集を実行できます。 これらのインライン形式変換関数を使用するには、アプリケーションに D3DX_DXGIFormatConvert.inl ファイルを含めます。

D3DX_DXGIFormatConvert.inl ヘッダーは、レガシ DirectX SDK に付属しています。 Microsoft.DXSDK.D3DX NuGet パッケージにも含まれています。

Direct3D 11 の Texture1D、Texture2D、または Texture3D リソースの順序なしのアクセス ビュー (UAV) では、コンピューティング シェーダーまたはピクセル シェーダーからのメモリへのランダム アクセスの読み取りと書き込みがサポートされます。 ただし、Direct3D 11 では、DXGI_FORMAT_R32_UINT テクスチャ形式への読み取りと書き込みの両方が同時にサポートされています。 たとえば、Direct3D 11 では、DXGI_FORMAT_R8G8B8A8_UNORMなどの他の便利な形式への読み取りと書き込みの両方を同時にサポートしていません。 UAV のみを使用して、このような他の形式へのランダム アクセス書き込みを行うことができます。または、シェーダー リソース ビュー (SRV) のみを使用して、このような他の形式からのランダム アクセス読み取りを行うことができます。 フォーマット変換ハードウェアは、このような他の形式に対する読み取りと書き込みの両方で同時に使用することはできません。

ただし、リソースの元の形式がDXGI_FORMAT_R32_UINTへのキャストをサポートしている限り、UAV の作成時にテクスチャを DXGI_FORMAT_R32_UINT テクスチャ形式にキャストすることで、このような他の形式に対する読み取りと書き込みの両方を同時に行うことができます。 要素形式あたりほとんどの 32 ビットでは、DXGI_FORMAT_R32_UINTへのキャストがサポートされています。 UAV の作成時にテクスチャをDXGI_FORMAT_R32_UINTテクスチャ形式にキャストすることで、シェーダーが読み取りと書き込み時に手動形式のアンパックを実行する限り、テクスチャへの読み取りと書き込みを同時に実行できます。

テクスチャをDXGI_FORMAT_R32_UINTテクスチャ形式にキャストする利点は、後でレンダー ターゲット ビュー (RTV) や SRV など、同じテクスチャ上の他のビューで適切な形式 (たとえば、DXGI_FORMAT_R16G16_FLOAT) を使用できることです。 したがって、ハードウェアは、一般的な自動フォーマットのアンパックとパックを実行したり、テクスチャ フィルタリングを実行したり、ハードウェアの制限がない場合に実行したりできます。

次のシナリオでは、アプリケーションがインプレース イメージ編集を実行するために次の一連のアクションを実行する必要があります。

ピクセル シェーダーまたはコンピューティング シェーダーを使用してインプレース編集を実行できるテクスチャを作成し、テクスチャ データを次のいずれかの TYPELESS 形式の子孫である形式で格納するとします。

  • DXGI_FORMAT_R10G10B10A2_TYPELESS
  • DXGI_FORMAT_R8G8B8A8_TYPELESS
  • DXGI_FORMAT_B8G8R8A8_TYPELESS
  • DXGI_FORMAT_B8G8R8X8_TYPELESS
  • DXGI_FORMAT_R16G16_TYPELESS

たとえば、DXGI_FORMAT_R10G10B10A2_UNORM形式は、DXGI_FORMAT_R10G10B10A2_TYPELESS形式の子孫です。 したがって、DXGI_FORMAT_R10G10B10A2_UNORMでは、次の順序で説明されている使用パターンがサポートされます。 DXGI_FORMAT_R32_FLOATなど、DXGI_FORMAT_R32_TYPELESSから派生する形式は、次の順序で説明する形式変換のヘルプを必要とせずに簡単にサポートされます。

インプレース 画像編集を実行するには

  1. 前のシナリオで指定した適切な TYPELESS 依存形式のテクスチャを、必要なバインド フラグと共に作成します (例: D3D11_BIND_UNORDERED_ACCESS |D3D11_BIND_SHADER_RESOURCE。

  2. インプレース 画像編集の場合は、DXGI_FORMAT_R32_UINT形式の UAV を作成します。 通常、Direct3D 11 API では、異なる形式の "ファミリ" 間のキャストは許可されません。ただし、Direct3D 11 API では、DXGI_FORMAT_R32_UINT形式で例外が発生します。

  3. コンピューティング シェーダーまたはピクセル シェーダーで、D3DX_DXGIFormatConvert.inl ファイルに用意されている適切なインライン形式パックとアンパック関数を使用します。 たとえば、テクスチャの DXGI_FORMAT_R32_UINT UAV が実際にDXGI_FORMAT_R10G10B10A2_UNORM形式のデータを保持するとします。 アプリケーションが UAV からシェーダーに uint を読み取った後、テクスチャ形式をアンパックするには、次の関数を呼び出す必要があります。

    XMFLOAT4 D3DX_R10G10B10A2_UNORM_to_FLOAT4(UINT packedInput)
    

    次に、同じシェーダーで UAV に書き込むには、次の関数を呼び出して、アプリケーションが UAV に書き込むことができる uint にシェーダー データをパックします。

    UINT D3DX_FLOAT4_to_R10G10B10A2_UNORM(hlsl_precise XMFLOAT4 unpackedInput)
    
  4. その後、アプリケーションは、必要な形式で他のビュー (SRV など) を作成できます。 たとえば、リソースがDXGI_FORMAT_R10G10B10A2_TYPELESSとして作成された場合、アプリケーションは DXGI_FORMAT_R10G10B10A2_UNORM 形式の SRV を作成できます。 シェーダーがその SRV にアクセスすると、ハードウェアは通常どおりに自動型変換を実行できます。

注意

シェーダーが UAV にのみ書き込む必要がある場合、または SRV として読み取る必要がある場合は、完全に型指定された UAV または SRV を使用できるため、この変換作業は必要ありません。 D3DX_DXGIFormatConvert.inl で提供される書式変換関数は、テクスチャの UAV との同時読み取りと書き込みを実行する場合にのみ役立つ可能性があります。

 

D3DX_DXGIFormatConvert.inl ファイルに含まれる書式変換関数の一覧を次に示します。 これらの関数は、開梱およびパックするDXGI_FORMATによって分類されます。 サポートされている各形式は、前のシナリオで示した TYPELESS 形式の 1 つから派生し、UAV としてDXGI_FORMAT_R32_UINTへのキャストをサポートしています。

DXGI_FORMAT_R10G10B10A2_UNORM

XMFLOAT4 D3DX_R10G10B10A2_UNORM_to_FLOAT4(UINT packedInput)
UINT     D3DX_FLOAT4_to_R10G10B10A2_UNORM(hlsl_precise XMFLOAT4 unpackedInput)

DXGI_FORMAT_R10G10B10A2_UINT

XMUINT4 D3DX_R10G10B10A2_UINT_to_UINT4(UINT packedInput)
UINT    D3DX_UINT4_to_R10G10B10A2_UINT(XMUINT4 unpackedInput)

DXGI_FORMAT_R8G8B8A8_UNORM

XMFLOAT4 D3DX_R8G8B8A8_UNORM_to_FLOAT4(UINT packedInput)
UINT     D3DX_FLOAT4_to_R8G8B8A8_UNORM(hlsl_precise XMFLOAT4 unpackedInput)

DXGI_FORMAT_R8G8B8A8_UNORM_SRGB

XMFLOAT4 D3DX_R8G8B8A8_UNORM_SRGB_to_FLOAT4_inexact(UINT packedInput) *
XMFLOAT4 D3DX_R8G8B8A8_UNORM_SRGB_to_FLOAT4(UINT packedInput)
UINT     D3DX_FLOAT4_to_R8G8B8A8_UNORM_SRGB(hlsl_precise XMFLOAT4 unpackedInput)

注意

_inexact型関数は、正確な答えを得るのに十分な精度を持たないシェーダー命令を使用します。 代替関数では、シェーダーに格納されている参照テーブルを使用して、正確な SRGB-float> 変換を行います。

 

DXGI_FORMAT_R8G8B8A8_UINT

XMUINT4 D3DX_R8G8B8A8_UINT_to_UINT4(UINT packedInput)
XMUINT  D3DX_UINT4_to_R8G8B8A8_UINT(XMUINT4 unpackedInput)

DXGI_FORMAT_R8G8B8A8_SNORM

XMFLOAT4 D3DX_R8G8B8A8_SNORM_to_FLOAT4(UINT packedInput)
UINT     D3DX_FLOAT4_to_R8G8B8A8_SNORM(hlsl_precise XMFLOAT4 unpackedInput)

DXGI_FORMAT_R8G8B8A8_SINT

XMINT4 D3DX_R8G8B8A8_SINT_to_INT4(UINT packedInput)
UINT   D3DX_INT4_to_R8G8B8A8_SINT(XMINT4 unpackedInput)

DXGI_FORMAT_B8G8R8A8_UNORM

XMFLOAT4 D3DX_B8G8R8A8_UNORM_to_FLOAT4(UINT packedInput)
UINT     D3DX_FLOAT4_to_B8G8R8A8_UNORM(hlsl_precise XMFLOAT4 unpackedInput)

DXGI_FORMAT_B8G8R8A8_UNORM_SRGB

XMFLOAT4 D3DX_B8G8R8A8_UNORM_SRGB_to_FLOAT4_inexact(UINT packedInput) *
XMFLOAT4 D3DX_B8G8R8A8_UNORM_SRGB_to_FLOAT4(UINT packedInput)
UINT     D3DX_FLOAT4_to_R8G8B8A8_UNORM_SRGB(hlsl_precise XMFLOAT4 unpackedInput)

注意

_inexact型関数は、正確な答えを得るのに十分な精度を持たないシェーダー命令を使用します。 代替関数では、シェーダーに格納されている参照テーブルを使用して、正確な SRGB-float> 変換を行います。

 

DXGI_FORMAT_B8G8R8X8_UNORM

XMFLOAT3 D3DX_B8G8R8X8_UNORM_to_FLOAT3(UINT packedInput)
UINT     D3DX_FLOAT3_to_B8G8R8X8_UNORM(hlsl_precise XMFLOAT3 unpackedInput)

DXGI_FORMAT_B8G8R8X8_UNORM_SRGB

XMFLOAT3 D3DX_B8G8R8X8_UNORM_SRGB_to_FLOAT3_inexact(UINT packedInput) *
XMFLOAT3 D3DX_B8G8R8X8_UNORM_SRGB_to_FLOAT3(UINT packedInput)
UINT     D3DX_FLOAT3_to_B8G8R8X8_UNORM_SRGB(hlsl_precise XMFLOAT3 unpackedInput)

注意

_inexact型関数は、正確な答えを得るのに十分な精度を持たないシェーダー命令を使用します。 代替関数では、シェーダーに格納されている参照テーブルを使用して、正確な SRGB-float> 変換を行います。

 

DXGI_FORMAT_R16G16_FLOAT

XMFLOAT2 D3DX_R16G16_FLOAT_to_FLOAT2(UINT packedInput)
UINT     D3DX_FLOAT2_to_R16G16_FLOAT(hlsl_precise XMFLOAT2 unpackedInput)

DXGI_FORMAT_R16G16_UNORM

XMFLOAT2 D3DX_R16G16_UNORM_to_FLOAT2(UINT packedInput)
UINT     D3DX_FLOAT2_to_R16G16_UNORM(hlsl_precise FLOAT2 unpackedInput)

DXGI_FORMAT_R16G16_UINT

XMUINT2 D3DX_R16G16_UINT_to_UINT2(UINT packedInput)
UINT    D3DX_UINT2_to_R16G16_UINT(XMUINT2 unpackedInput)

DXGI_FORMAT_R16G16_SNORM

XMFLOAT2 D3DX_R16G16_SNORM_to_FLOAT2(UINT packedInput)
UINT     D3DX_FLOAT2_to_R16G16_SNORM(hlsl_precise XMFLOAT2 unpackedInput)

DXGI_FORMAT_R16G16_SINT

XMINT2 D3DX_R16G16_SINT_to_INT2(UINT packedInput)
UINT   D3DX_INT2_to_R16G16_SINT(XMINT2 unpackedInput)

HLSL 用プログラミング ガイド

HLSL 用プログラミング ガイド