다음을 통해 공유


형식화된 UAV(순서가 지정되지 않은 액세스 뷰) 로드

UAV(순서가 지정되지 않은 액세스 뷰) 형식화된 로드는 셰이더가 특정 DXGI_FORMAT있는 UAV에서 읽을 수 있는 기능입니다.

  • 개요
  • 지원되는 형식 및 API 호출
  • HLSL 형식화된 UAV 로드 사용
  • HLSL UNORM 및 SNORM 형식의 UAV 로드 사용
  • 관련 항목

개요

UAV(순서가 지정되지 않은 액세스 뷰)는 순서가 지정되지 않은 액세스 리소스의 보기입니다(다중 샘플링 없이 버퍼, 텍스처 및 텍스처 배열을 포함할 수 있습니다). UAV를 사용하면 여러 스레드에서 임시로 순서가 지정되지 않은 읽기/쓰기 액세스를 허용합니다. 즉, 메모리 충돌을 생성하지 않고 여러 스레드에서 이 리소스 유형을 동시에 읽거나 쓸 수 있습니다. 이 동시 액세스는 Atomic Functions사용하여 처리됩니다.

D3D12(및 D3D11.3)는 형식화된 UAV 로드와 함께 사용할 수 있는 형식 목록에서 확장됩니다.

지원되는 형식 및 API 호출

이전에는 다음 세 가지 형식이 형식화된 UAV 로드를 지원했으며 D3D11.0 하드웨어에 필요했습니다. 모든 D3D11.3 및 D3D12 하드웨어에 대해 지원됩니다.

  • R32_FLOAT
  • R32_UINT
  • R32_SINT

다음 형식은 D3D12 또는 D3D11.3 하드웨어에서 집합으로 지원되므로 지원되는 형식이 있으면 모두 지원됩니다.

  • R32G32B32A32_FLOAT
  • R32G32B32A32_UINT
  • R32G32B32A32_SINT
  • R16G16B16A16_FLOAT
  • R16G16B16A16_UINT
  • R16G16B16A16_SINT
  • R8G8B8A8_UNORM
  • R8G8B8A8_UINT
  • R8G8B8A8_SINT
  • R16_FLOAT
  • R16_UINT
  • R16_SINT
  • R8_UNORM
  • R8_UINT
  • R8_SINT

다음 형식은 필요에 따라 D3D12 및 D3D11.3 하드웨어에서 개별적으로 지원되므로 지원을 테스트하려면 각 형식에 대해 단일 쿼리를 만들어야 합니다.

  • R16G16B16A16_UNORM
  • R16G16B16A16_SNORM
  • R32G32_FLOAT
  • R32G32_UINT
  • R32G32_SINT
  • R10G10B10A2_UNORM
  • R10G10B10A2_UINT
  • R11G11B10_FLOAT
  • R8G8B8A8_SNORM
  • R16G16_FLOAT
  • R16G16_UNORM
  • R16G16_UINT
  • R16G16_SNORM
  • R16G16_SINT
  • R8G8_UNORM
  • R8G8_UINT
  • R8G8_SNORM
  • R8G8_SINT
  • R16_UNORM
  • R16_SNORM
  • R8_SNORM
  • A8_UNORM
  • B5G6R5_UNORM
  • B5G5R5A1_UNORM
  • B4G4R4A4_UNORM

추가 형식에 대한 지원을 확인하려면 D3D12_FEATURE_DATA_D3D12_OPTIONS 구조를 첫 번째 매개 변수로 사용하여 CheckFeatureSupport 호출합니다(기능 쿼리참조). 위의 "집합으로 지원되는" 목록이 지원되면 TypedUAVLoadAdditionalFormats 필드가 설정됩니다. D3D12_FEATURE_DATA_FORMAT_SUPPORT 구조체(D3D12_FORMAT_SUPPORT2 열거형의 D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD 멤버에 대해 반환된 구조체 확인)를 사용하여 CheckFeatureSupport두 번째 호출을 수행하여 위에 나열된 선택적으로 지원되는 형식 목록에서 지원을 확인합니다. 예를 들면 다음과 같습니다.

D3D12_FEATURE_DATA_D3D12_OPTIONS FeatureData;
ZeroMemory(&FeatureData, sizeof(FeatureData));
HRESULT hr = pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &FeatureData, sizeof(FeatureData));
if (SUCCEEDED(hr))
{
    // TypedUAVLoadAdditionalFormats contains a Boolean that tells you whether the feature is supported or not
    if (FeatureData.TypedUAVLoadAdditionalFormats)
    {
        // Can assume “all-or-nothing” subset is supported (e.g. R32G32B32A32_FLOAT)
        // Cannot assume other formats are supported, so we check:
        D3D12_FEATURE_DATA_FORMAT_SUPPORT FormatSupport = {DXGI_FORMAT_R32G32_FLOAT, D3D12_FORMAT_SUPPORT1_NONE, D3D12_FORMAT_SUPPORT2_NONE};
        hr = pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_SUPPORT, &FormatSupport, sizeof(FormatSupport));
        if (SUCCEEDED(hr) && (FormatSupport.Support2 & D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD) != 0)
        {
            // DXGI_FORMAT_R32G32_FLOAT supports UAV Typed Load!
        }
    }
}

HLSL에서 형식화된 UAV 로드 사용

형식화된 UAV의 경우 HLSL 플래그가 D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.

다음은 형식화된 UAV 로드를 처리하는 예제 셰이더 코드입니다.

RWTexture2D<float4> uav1;
uint2 coord;
float4 main() : SV_Target
{
  return uav1.Load(coord);
}

HLSL에서 UNORM 및 SNORM 형식 UAV 로드 사용

형식화된 UAV 로드를 사용하여 UNORM 또는 SNORM 리소스에서 읽을 때 HLSL 개체의 요소 형식을 unorm 또는 snorm올바르게 선언해야 합니다. HLSL에 선언된 요소 형식과 기본 리소스 데이터 형식의 불일치를 위해 정의되지 않은 동작으로 지정됩니다. 예를 들어 R8_UNORM 데이터가 있는 버퍼 리소스에 형식화된 UAV 로드를 사용하는 경우 요소 형식을 unorm float선언해야 합니다.

RWBuffer<unorm float> uav;

렌더링

리소스 바인딩

HLSL 리소스 바인딩

셰이더 모델 5.1

HLSL 루트 서명 지정