현재 위치 이미지 편집을 위한 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_TYPELESS의 하위 형식(예: DXGI_FORMAT_R32_FLOAT)은 다음 시퀀스에서 설명하는 형식 변환의 도움 없이 간단하게 지원됩니다.

내부 이미지 편집을 수행하려면

  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에서 셰이더로 유닛을 읽은 후 텍스처 형식의 압축을 풀려면 다음 함수를 호출해야 합니다.

    XMFLOAT4 D3DX_R10G10B10A2_UNORM_to_FLOAT4(UINT packedInput)
    

    그런 다음, 동일한 셰이더에서 UAV에 쓰기 위해 애플리케이션은 다음 함수를 호출하여 애플리케이션이 UAV에 쓸 수 있는 셰이더 데이터를 유닛으로 압축합니다.

    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 형식 중 하나의 하위 형식이며, 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에 대한 프로그래밍 지침