Compartir a través de


Desempaquetar y empaquetar DXGI_FORMAT para la edición de imágenes de In-Place

El archivo D3DX_DXGIFormatConvert.inl contiene funciones de conversión de formato insertado que puedes usar en el sombreador de proceso o sombreador de píxeles en el hardware de Direct3D 11. Puede usar estas funciones en la aplicación para leer y escribir simultáneamente en una textura. Es decir, puede realizar la edición de imágenes en contexto. Para usar estas funciones de conversión en formato insertado, incluya el archivo D3DX_DXGIFormatConvert.inl en la aplicación.

El encabezado D3DX_DXGIFormatConvert.inl se incluye en el SDK de DirectX heredado. También se incluye en el paquete NuGet Microsoft.DXSDK.D3DX .

La vista de acceso desordenado (UAV) de direct3D 11 de un recurso Texture1D, Texture2D o Texture3D admite lecturas y escrituras de acceso aleatorio en la memoria desde un sombreador de proceso o sombreador de píxeles. Sin embargo, Direct3D 11 admite simultáneamente tanto la lectura desde como la escritura en solo el formato de textura DXGI_FORMAT_R32_UINT. Por ejemplo, Direct3D 11 no admite la lectura simultánea de y la escritura en otros formatos más útiles, como DXGI_FORMAT_R8G8B8A8_UNORM. Solo puede usar un UAV para tener acceso aleatorio a escritura en otros formatos, o puede usar solo una vista de recursos del sombreador (SRV) para obtener acceso aleatorio de lectura desde estos otros formatos. El hardware de conversión de formato no está disponible para leer y escribir simultáneamente en otros formatos.

Sin embargo, puede seguir leyendo y escribiendo simultáneamente en otros formatos mediante la conversión de la textura al formato de textura DXGI_FORMAT_R32_UINT al crear un UAV, siempre y cuando el formato original del recurso admita la conversión a DXGI_FORMAT_R32_UINT. La mayoría de los formatos de 32 bits por elemento admiten la conversión a DXGI_FORMAT_R32_UINT. Al convertir la textura en el formato de textura DXGI_FORMAT_R32_UINT al crear un UAV, puede realizar lecturas y escrituras simultáneas en la textura siempre y cuando el sombreador realice el desempaquetado manual en lectura y empaquetado en escritura.

La ventaja de convertir la textura al formato de textura DXGI_FORMAT_R32_UINT es que más adelante puede usar el formato adecuado (por ejemplo, DXGI_FORMAT_R16G16_FLOAT) con otras vistas en la misma textura, como Vistas de destino de representación (RTV) o SRV. Por lo tanto, el hardware puede realizar el desempaquetado y el paquete de formato automático típicos, puede realizar el filtrado de texturas, etc., donde no hay limitaciones de hardware.

El escenario siguiente requiere que una aplicación realice la siguiente secuencia de acciones para realizar la edición de imágenes en contexto.

Supongamos que desea crear una textura en la que puede usar un sombreador de píxeles o un sombreador de proceso para realizar la edición en contexto y desea que los datos de textura se almacenen en un formato que sea descendiente de uno de los siguientes formatos SIN TIPO:

  • DXGI_FORMAT_R10G10B10A2_TYPELESS
  • DXGI_FORMAT_R8G8B8A8_TYPELESS
  • DXGI_FORMAT_B8G8R8A8_TYPELESS
  • DXGI_FORMAT_B8G8R8X8_TYPELESS
  • DXGI_FORMAT_R16G16_TYPELESS

Por ejemplo, el formato DXGI_FORMAT_R10G10B10A2_UNORM es un descendiente del formato DXGI_FORMAT_R10G10B10A2_TYPELESS. Por lo tanto, DXGI_FORMAT_R10G10B10A2_UNORM admite el patrón de uso que se describe en la secuencia siguiente. Los formatos que descienden de DXGI_FORMAT_R32_TYPELESS, como DXGI_FORMAT_R32_FLOAT, se admiten trivialmente sin necesidad de ninguna de las ayudas de conversión de formato que se describen en la siguiente secuencia.

Para realizar la edición de imágenes en contexto

  1. Cree una textura con el formato dependiente de TYPELESS adecuado especificado en el escenario anterior junto con las marcas de enlace necesarias, como D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE.

  2. Para la edición de imágenes en contexto, cree un UAV con el formato DXGI_FORMAT_R32_UINT. La API de Direct3D 11 normalmente no permite la conversión entre diferentes "familias" de formato. Sin embargo, la API de Direct3D 11 realiza una excepción con el formato DXGI_FORMAT_R32_UINT.

  3. En el sombreador de proceso o el sombreador de píxeles, use el paquete de formato insertado adecuado y desempaquetar las funciones que se proporcionan en el archivo D3DX_DXGIFormatConvert.inl. Por ejemplo, supongamos que la DXGI_FORMAT_R32_UINT UAV de la textura contiene realmente datos con formato DXGI_FORMAT_R10G10B10A2_UNORM. Después de que la aplicación lea un uint del UAV en el sombreador, debe llamar a la siguiente función para desempaquetar el formato de textura:

    XMFLOAT4 D3DX_R10G10B10A2_UNORM_to_FLOAT4(UINT packedInput)
    

    A continuación, para escribir en el UAV en el mismo sombreador, la aplicación llama a la siguiente función para empaquetar los datos del sombreador en un uint que la aplicación puede escribir en el UAV:

    UINT D3DX_FLOAT4_to_R10G10B10A2_UNORM(hlsl_precise XMFLOAT4 unpackedInput)
    
  4. Después, la aplicación puede crear otras vistas, como SRV, con el formato necesario. Por ejemplo, la aplicación puede crear un SRV con el formato DXGI_FORMAT_R10G10B10A2_UNORM si el recurso se creó como DXGI_FORMAT_R10G10B10A2_TYPELESS. Cuando un sombreador accede a ese SRV, el hardware puede realizar la conversión automática de tipos como de costumbre.

Nota

Si el sombreador solo debe escribir en un UAV o leer como SRV, no se necesita ningún trabajo de conversión porque puede usar uaV o SRV totalmente tipados. Las funciones de conversión de formato proporcionadas en D3DX_DXGIFormatConvert.inl son potencialmente útiles solo si desea realizar lecturas simultáneas desde y escritura en un UAV de una textura.

 

A continuación se muestra la lista de funciones de conversión de formato que se incluyen en el archivo D3DX_DXGIFormatConvert.inl. Estas funciones se clasifican por el DXGI_FORMAT que desempaquetan y empaquetan. Cada uno de los formatos admitidos desciende de uno de los formatos TYPELESS enumerados en el escenario anterior y admite la conversión a DXGI_FORMAT_R32_UINT como un 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)

Nota

La función de tipo _inexact usa instrucciones de sombreador que no tienen una precisión lo suficientemente alta como para dar la respuesta exacta. La función alternativa usa una tabla de búsqueda almacenada en el sombreador para proporcionar una conversión exacta 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)

Nota

La función de tipo _inexact usa instrucciones de sombreador que no tienen una precisión lo suficientemente alta como para dar la respuesta exacta. La función alternativa usa una tabla de búsqueda almacenada en el sombreador para proporcionar una conversión exacta 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)

Nota

La función de tipo _inexact usa instrucciones de sombreador que no tienen una precisión lo suficientemente alta como para dar la respuesta exacta. La función alternativa usa una tabla de búsqueda almacenada en el sombreador para proporcionar una conversión exacta 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)

Guía de programación para HLSL

Guía de programación para HLSL