Déballage et empaquetage des DXGI_FORMAT pour In-Place édition d’images

Le fichier D3DX_DXGIFormatConvert.inl contient des fonctions de conversion de format inline que vous pouvez utiliser dans le nuanceur de calcul ou le nuanceur de pixels sur le matériel Direct3D 11. Vous pouvez utiliser ces fonctions dans votre application pour lire et écrire simultanément dans une texture. Autrement dit, vous pouvez effectuer une modification d’image sur place. Pour utiliser ces fonctions de conversion de format inline, incluez le fichier D3DX_DXGIFormatConvert.inl dans votre application.

L’en-tête D3DX_DXGIFormatConvert.inl est fourni dans le Kit de développement logiciel (SDK) DirectX hérité. Il est également inclus dans le package NuGet Microsoft.DXSDK.D3DX .

La vue d’accès non ordonné (UAV) de Direct3D 11 d’une ressource Texture1D, Texture2D ou Texture3D prend en charge les lectures et écritures aléatoires en mémoire à partir d’un nuanceur de calcul ou d’un nuanceur de pixels. Toutefois, Direct3D 11 prend en charge simultanément la lecture et l’écriture à partir du format de texture DXGI_FORMAT_R32_UINT uniquement. Par exemple, Direct3D 11 ne prend pas en charge simultanément la lecture et l’écriture dans d’autres formats plus utiles, tels que DXGI_FORMAT_R8G8B8A8_UNORM. Vous pouvez utiliser uniquement un UAV pour accéder à l’écriture aléatoire dans ces autres formats, ou vous pouvez utiliser uniquement un mode de ressources de nuanceur (SRV) pour accéder de manière aléatoire à la lecture à partir de ces autres formats. Le matériel de conversion de format n’est pas disponible simultanément pour lire et écrire dans ces autres formats.

Toutefois, vous pouvez toujours lire et écrire simultanément dans ces autres formats en cas de conversion de la texture au format de texture DXGI_FORMAT_R32_UINT lorsque vous créez un UAV, tant que le format d’origine de la ressource prend en charge la conversion en DXGI_FORMAT_R32_UINT. La plupart des formats 32 bits par élément prennent en charge la conversion en DXGI_FORMAT_R32_UINT. En cas de conversion de la texture au format de texture DXGI_FORMAT_R32_UINT lorsque vous créez un UAV, vous pouvez ensuite effectuer simultanément des lectures et des écritures dans la texture tant que le nuanceur effectue un déballage de format manuel lors de la lecture et de l’empaquetage lors de l’écriture.

L’avantage de la conversion de la texture vers le format de texture DXGI_FORMAT_R32_UINT est que vous pouvez utiliser ultérieurement le format approprié (par exemple, DXGI_FORMAT_R16G16_FLOAT) avec d’autres vues sur la même texture, telles que les vues cibles de rendu (RTV) ou SRV. Par conséquent, le matériel peut effectuer le déballage et le pack du format automatique standard, peut effectuer le filtrage de textures, et ainsi de suite lorsqu’il n’y a aucune limitation matérielle.

Le scénario suivant nécessite qu’une application effectue la séquence d’actions suivante pour modifier l’image sur place.

Supposons que vous souhaitiez créer une texture sur laquelle vous pouvez utiliser un nuanceur de pixels ou un nuanceur de calcul pour effectuer une modification sur place, et que vous souhaitez que les données de texture soient stockées dans un format descendant de l’un des formats TYPELESS suivants :

  • DXGI_FORMAT_R10G10B10A2_TYPELESS
  • DXGI_FORMAT_R8G8B8A8_TYPELESS
  • DXGI_FORMAT_B8G8R8A8_TYPELESS
  • DXGI_FORMAT_B8G8R8X8_TYPELESS
  • DXGI_FORMAT_R16G16_TYPELESS

Par exemple, le format DXGI_FORMAT_R10G10B10A2_UNORM est un descendant du format DXGI_FORMAT_R10G10B10A2_TYPELESS. Par conséquent, DXGI_FORMAT_R10G10B10A2_UNORM prend en charge le modèle d’utilisation décrit dans la séquence suivante. Les formats qui descendent de DXGI_FORMAT_R32_TYPELESS, tels que DXGI_FORMAT_R32_FLOAT, sont pris en charge de manière triviale sans nécessiter l’aide de conversion de format décrite dans la séquence suivante.

Pour effectuer une modification d’image sur place

  1. Créez une texture avec le format dépendant de TYPELESS approprié spécifié dans le scénario précédent avec les indicateurs de liaison requis, tels que D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE.

  2. Pour la modification d’image sur place, créez un UAV au format DXGI_FORMAT_R32_UINT. L’API Direct3D 11 n’autorise généralement pas le cast entre différentes « familles » de formats. Toutefois, l’API Direct3D 11 fait une exception avec le format DXGI_FORMAT_R32_UINT.

  3. Dans le nuanceur de calcul ou le nuanceur de pixels, utilisez le pack de format inline et les fonctions de décompression appropriées fournies dans le fichier D3DX_DXGIFormatConvert.inl. Par exemple, supposons que le DXGI_FORMAT_R32_UINT UAV de la texture contient réellement DXGI_FORMAT_R10G10B10A2_UNORM données mises en forme. Une fois que l’application a lu un uint à partir de l’UAV dans le nuanceur, elle doit appeler la fonction suivante pour décompresser le format de texture :

    XMFLOAT4 D3DX_R10G10B10A2_UNORM_to_FLOAT4(UINT packedInput)
    

    Ensuite, pour écrire dans l’UAV dans le même nuanceur, l’application appelle la fonction suivante pour empaqueter les données du nuanceur dans un uint que l’application peut écrire dans l’UAV :

    UINT D3DX_FLOAT4_to_R10G10B10A2_UNORM(hlsl_precise XMFLOAT4 unpackedInput)
    
  4. L’application peut ensuite créer d’autres affichages, tels que des SMV, avec le format requis. Par exemple, l’application peut créer un SRV au format DXGI_FORMAT_R10G10B10A2_UNORM si la ressource a été créée en tant que DXGI_FORMAT_R10G10B10A2_TYPELESS. Lorsqu’un nuanceur accède à ce SRV, le matériel peut effectuer une conversion de type automatique comme d’habitude.

Notes

Si le nuanceur doit écrire uniquement dans un UAV ou lire en tant que SRV, aucun de ces travaux de conversion n’est nécessaire, car vous pouvez utiliser des UAV ou des VSR entièrement typés. Les fonctions de conversion de format fournies dans D3DX_DXGIFormatConvert.inl sont potentiellement utiles uniquement si vous souhaitez effectuer simultanément la lecture et l’écriture dans un UAV d’une texture.

 

Voici la liste des fonctions de conversion de format qui sont incluses dans le fichier D3DX_DXGIFormatConvert.inl. Ces fonctions sont classées par DXGI_FORMAT qu’elles déballent et emballent. Chacun des formats pris en charge descend de l’un des formats TYPELESS répertoriés dans le scénario précédent et prend en charge la conversion en DXGI_FORMAT_R32_UINT en tant qu’UAV.

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)

Notes

La fonction de type _inexact utilise des instructions de nuanceur qui n’ont pas suffisamment de précision pour donner la réponse exacte. La fonction alternative utilise une table de choix stockée dans le nuanceur pour donner une conversion SRGB-float> exacte.

 

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)

Notes

La fonction de type _inexact utilise des instructions de nuanceur qui n’ont pas suffisamment de précision pour donner la réponse exacte. La fonction alternative utilise une table de choix stockée dans le nuanceur pour donner une conversion SRGB-float> exacte.

 

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)

Notes

La fonction de type _inexact utilise des instructions de nuanceur qui n’ont pas suffisamment de précision pour donner la réponse exacte. La fonction alternative utilise une table de choix stockée dans le nuanceur pour donner une conversion SRGB-float> exacte.

 

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)

Guide de programmation pour HLSL

Guide de programmation pour HLSL