Desempacotar e empacotar DXGI_FORMAT para edição de imagem In-Place

O arquivo D3DX_DXGIFormatConvert.inl contém funções de conversão de formato embutido que você pode usar no sombreador de computação ou sombreador de pixel no hardware direct3D 11. Você pode usar essas funções em seu aplicativo para ler e gravar simultaneamente em uma textura. Ou seja, você pode executar a edição de imagem in-loco. Para usar essas funções de conversão de formato embutido, inclua o arquivo D3DX_DXGIFormatConvert.inl em seu aplicativo.

O cabeçalho D3DX_DXGIFormatConvert.inl é fornecido no SDK herdado do DirectX. Ele também está incluído no pacote NuGet Microsoft.DXSDK.D3DX .

O UAV (Modo de Exibição de Acesso Não Ordenado) do Direct3D 11 de um recurso Texture1D, Texture2D ou Texture3D dá suporte a leituras e gravações de acesso aleatório na memória de um sombreador de computação ou sombreador de pixel. No entanto, o Direct3D 11 dá suporte simultaneamente à leitura e à gravação apenas no formato de textura DXGI_FORMAT_R32_UINT. Por exemplo, o Direct3D 11 não dá suporte simultaneamente à leitura e à gravação em outros formatos mais úteis, como DXGI_FORMAT_R8G8B8A8_UNORM. Você pode usar apenas um UAV para acessar aleatoriamente a gravação em outros formatos ou pode usar apenas uma SRV (Exibição de Recurso de Sombreador) para acessar aleatoriamente a leitura desses outros formatos. O hardware de conversão de formato não está disponível para ler e gravar simultaneamente em outros formatos.

No entanto, você ainda pode ler e gravar simultaneamente em outros formatos convertendo a textura no formato de textura DXGI_FORMAT_R32_UINT ao criar um UAV, desde que o formato original do recurso dê suporte à conversão para DXGI_FORMAT_R32_UINT. A maioria dos formatos de 32 bits por elemento dá suporte à conversão para DXGI_FORMAT_R32_UINT. Ao converter a textura no formato de textura DXGI_FORMAT_R32_UINT ao criar um UAV, você pode executar leituras e gravações simultâneas na textura, desde que o sombreador execute o desempacotar formato manual na leitura e empacotamento na gravação.

O benefício de converter a textura no formato de textura DXGI_FORMAT_R32_UINT é que, posteriormente, você pode usar o formato apropriado (por exemplo, DXGI_FORMAT_R16G16_FLOAT) com outros modos de exibição na mesma textura, como RTVs (Exibições de Destino de Renderização) ou SRVs. Portanto, o hardware pode executar o formato automático típico desempacotar e empacotar, pode executar filtragem de textura e assim por diante, onde não há limitações de hardware.

O cenário a seguir exige que um aplicativo execute a seguinte sequência de ações para executar a edição de imagem in-loco.

Suponha que você queira criar uma textura na qual você pode usar um sombreador de pixel ou sombreador de computação para executar a edição in-loco e deseja que os dados de textura sejam armazenados em um formato descendente de um dos seguintes formatos TYPELESS:

  • DXGI_FORMAT_R10G10B10A2_TYPELESS
  • DXGI_FORMAT_R8G8B8A8_TYPELESS
  • DXGI_FORMAT_B8G8R8A8_TYPELESS
  • DXGI_FORMAT_B8G8R8X8_TYPELESS
  • DXGI_FORMAT_R16G16_TYPELESS

Por exemplo, o formato DXGI_FORMAT_R10G10B10A2_UNORM é um descendente do formato DXGI_FORMAT_R10G10B10A2_TYPELESS. Portanto, DXGI_FORMAT_R10G10B10A2_UNORM dá suporte ao padrão de uso descrito na sequência a seguir. Formatos descendentes de DXGI_FORMAT_R32_TYPELESS, como DXGI_FORMAT_R32_FLOAT, têm suporte trivial sem a necessidade de nenhuma ajuda de conversão de formato descrita na sequência a seguir.

Para executar a edição de imagem in-loco

  1. Crie uma textura com o formato dependente TYPELESS apropriado especificado no cenário anterior junto com os sinalizadores de associação necessários, como D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE.

  2. Para edição de imagem in-loco, crie um UAV com o formato DXGI_FORMAT_R32_UINT. A API do Direct3D 11 normalmente não permite a conversão entre "famílias" de formato diferente. No entanto, a API do Direct3D 11 faz uma exceção com o formato DXGI_FORMAT_R32_UINT.

  3. No sombreador de computação ou sombreador de pixel, use o pacote de formato embutido apropriado e descompacte as funções fornecidas no arquivo D3DX_DXGIFormatConvert.inl. Por exemplo, suponha que o UAV DXGI_FORMAT_R32_UINT da textura realmente contenha DXGI_FORMAT_R10G10B10A2_UNORM dados formatados. Depois que o aplicativo lê uma uint do UAV no sombreador, ele deve chamar a seguinte função para desempacotar o formato de textura:

    XMFLOAT4 D3DX_R10G10B10A2_UNORM_to_FLOAT4(UINT packedInput)
    

    Em seguida, para gravar no UAV no mesmo sombreador, o aplicativo chama a seguinte função para empacotar dados de sombreador em uma uint que o aplicativo pode gravar no UAV:

    UINT D3DX_FLOAT4_to_R10G10B10A2_UNORM(hlsl_precise XMFLOAT4 unpackedInput)
    
  4. Em seguida, o aplicativo pode criar outros modos de exibição, como SRVs, com o formato necessário. Por exemplo, o aplicativo poderá criar um SRV com o formato DXGI_FORMAT_R10G10B10A2_UNORM se o recurso tiver sido criado como DXGI_FORMAT_R10G10B10A2_TYPELESS. Quando um sombreador acessa esse SRV, o hardware pode executar a conversão automática de tipo como de costume.

Observação

Se o sombreador precisar gravar somente em um UAV ou ler como SRV, nenhum desse trabalho de conversão será necessário porque você pode usar UAVs ou SRVs totalmente tipadas. As funções de conversão de formato fornecidas em D3DX_DXGIFormatConvert.inl são potencialmente úteis somente se você quiser executar leitura e gravação simultâneas em um UAV de uma textura.

 

Veja a seguir a lista de funções de conversão de formato incluídas no arquivo D3DX_DXGIFormatConvert.inl. Essas funções são categorizadas pelo DXGI_FORMAT que desempacotam e empacotam. Cada um dos formatos com suporte é descendente de um dos formatos TYPELESS listados no cenário anterior e dá suporte à conversão para DXGI_FORMAT_R32_UINT como um 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)

Observação

A função de tipo _inexact usa instruções de sombreador que não têm precisão alta o suficiente para dar a resposta exata. A função alternativa usa uma tabela de pesquisa armazenada no sombreador para fornecer uma conversão SRGB-float> exata.

 

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)

Observação

A função de tipo _inexact usa instruções de sombreador que não têm precisão alta o suficiente para dar a resposta exata. A função alternativa usa uma tabela de pesquisa armazenada no sombreador para fornecer uma conversão SRGB-float> exata.

 

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)

Observação

A função de tipo _inexact usa instruções de sombreador que não têm precisão alta o suficiente para dar a resposta exata. A função alternativa usa uma tabela de pesquisa armazenada no sombreador para fornecer uma conversão SRGB-float> exata.

 

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)

Guia de programação para HLSL

Guia de programação para HLSL