VRS(Variable-Rate Shading)

VRS에 대한 동기 부여

성능 제약 조건으로 인해 그래픽 렌더러에서 항상 출력 이미지의 모든 부분에 동일한 수준의 품질을 제공할 수 있는 것은 아닙니다. 가변 속도 음영(또는 거친 픽셀 음영)은 렌더링된 이미지에 따라 다양한 속도로 렌더링 성능/전원을 할당할 수 있는 메커니즘입니다.

경우에 따라 인지할 수 있는 출력 품질을 거의 또는 전혀 낮추지 않고 음영 속도를 줄일 수 있습니다. 이에 따라 기본적으로 추가 비용 없이 성능을 향상시킵니다.

VRS가 없는 경우 - 슈퍼 샘플링을 사용하는 다중 샘플 앤티앨리어싱

가변 속도 음영을 사용하지 않는 경우 음영 속도를 제어하는 유일한 방법은 샘플 기반 실행(슈퍼 샘플링이라고도 함)을 통해 MSAA(다중 샘플 앤티앨리어싱)를 사용하는 것입니다.

MSAA는 MSAA를 사용하지 않는 경우에 비해 기하학적 앨리어싱을 줄이고 이미지의 렌더링 품질을 향상시키는 메커니즘입니다. MSAA 샘플 수는 1배, 2배, 4배, 8배 또는 16배의 수일 수 있으며, 렌더링 대상 픽셀당 할당되는 샘플 수를 제어합니다. MSAA 샘플 수는 대상이 할당되기 전에 미리 알려져 있어야 하며 그 이후에는 변경할 수 없습니다.

슈퍼 샘플링은 픽셀 셰이더를 샘플당 한 번씩 호출하며, 픽셀당 실행에 비해 품질이 높지만 성능 비용도 높습니다.

애플리케이션에서 픽셀 기반 실행 또는 슈퍼 샘플링을 통한 MSAA 중 하나를 선택하여 음영 속도를 제어할 수 있습니다. 이 두 가지 옵션은 매우 세부적인 제어를 제공하지 않습니다. 또한 이미지의 나머지 부분과 비교하여 개체의 특정 클래스에 대한 음영 속도를 낮추는 것이 좋습니다. 이러한 개체에는 HUD 요소 뒤의 개체, 투명도, 흐림 효과(필드 심도, 움직임 등) 또는 VR 광학으로 인한 광학 왜곡이 포함될 수 있습니다. 하지만 이는 음영 품질과 비용이 전체 이미지에 고정되어 있으므로 불가능합니다.

VRS(가변 속도 음영)를 사용하는 경우

VRS(가변 속도 음영) 모델은 거친 음영 개념을 추가하여 MSAA를 통한 슈퍼 샘플링을 반대쪽의 "거친 픽셀" 방향으로 확장합니다. 이 경우 픽셀보다 더 거친 빈도에서 음영을 수행할 수 있습니다. 즉, 픽셀 그룹을 단일 단위로 음영 처리할 수 있으며, 그 결과를 그룹의 모든 샘플에 브로드캐스트합니다.

거친 음영 API를 사용하면 애플리케이션에서 음영 처리된 그룹 또는 거친 픽셀에 속한 픽셀 수를 지정할 수 있습니다. 렌더링 대상이 할당되면 거친 픽셀 크기를 다양하게 지정할 수 있습니다. 따라서 화면의 다른 부분 또는 다른 그리기 패스의 음영 속도가 다를 수 있습니다.

다음은 거친 음영을 지원하는 플랫폼에 대해 어떤 거친 픽셀 크기로 지원되는 MSAA 수준을 설명하는 표입니다.

  • Y로 표시된 셀의 경우 해당 조합이 활성화됩니다.
  • 으로 표시된 셀의 경우 해당 조합은 상한에 따라 조건부로 사용하도록 설정됩니다(AdditionalShadingRatesSupported).
  • 비어 있는 셀의 경우 해당 조합은 지원되지 않습니다.
  • 하프톤 음영이 있는 셀의 경우 해당 조합은 지원되지 않으며 픽셀 셰이더 호출당 16개 이상의 샘플을 추적하는 작업이 포함됩니다. 16개 이상의 샘플을 추적하기 위해 다른 사례에 비해 지원해야 할 추가 하드웨어 맞춤 장벽이 있습니다.

표에는 M S A 수준에 대한 거친 픽셀 크기가 표시됩니다.

기능 계층

VRS 구현에 대한 두 가지 계층과 쿼리할 수 있는 두 가지 기능이 있습니다. 표 아래에서 각 계층에 대해 자세히 설명하고 있습니다.

표에는 계층 1 및 계층 2에서 사용할 수 있는 기능이 표시됩니다.

계층 1

  • 음영 속도는 그리기당 기준으로만 지정할 수 있으며, 이 기준 이상으로 세분화되지 않습니다.
  • 음영 속도는 렌더링 대상 내의 위치와 관계없이 그려지는 항목에 균일하게 적용됩니다.

계층 2

  • 음영 속도는 계층 1과 같이 그리기당 기준으로 지정할 수 있습니다. 또한 그리기당 기준과 다음 항목을 조합하여 지정할 수도 있습니다.
    • 각 유발 꼭짓점의 의미 체계 및
    • 화면 공간 이미지
  • 세 가지 원본의 음영 속도는 결합자 세트를 사용하여 결합됩니다.
  • 화면 공간 이미지 타일 크기는 16x16 이하입니다.
  • 애플리케이션에서 요청한 음영 속도는 정확하게 전달됩니다(시간 필터 및 기타 재구성 필터의 전체 자릿수).
  • SV_ShadingRate PS 입력이 지원됩니다.
  • 하나의 뷰포트가 사용되고 SV_ViewportArrayIndex가 기록되지 않은 경우 유발 꼭짓점별(기본형별이라고도 함) 음영 속도는 유효합니다.
  • SupportsPerVertexShadingRateWithMultipleViewports 기능이 true로 설정된 경우 유발 꼭짓점별 속도는 둘 이상의 뷰포트에서 사용할 수 있습니다. 또한 이 경우 SV_ViewportArrayIndex가 기록될 때 해당 속도를 사용할 수 있습니다.

기능 목록

  • AdditionalShadingRatesSupported
    • 부울 형식입니다.
    • 단일 샘플링 렌더링에 2x4, 4x2 및 4x4 거친 픽셀 크기를 지원하는지 여부 및 2배수 MSAA에 2x4 거친 픽셀 크기를 지원하는지 여부를 나타냅니다.
  • SupportsPerVertexShadingRateWithMultipleViewports
    • 부울 형식입니다.
    • 둘 이상의 뷰포트를 꼭짓점별(기본형별이라고도 함) 음영 속도에서 사용할 수 있는지 여부를 나타냅니다.

음영 속도 지정

애플리케이션의 유연성을 위해 음영 속도를 제어하는 다양한 메커니즘이 제공됩니다. 하드웨어 기능 계층에 따라 다양한 메커니즘을 사용할 수 있습니다.

명령 목록

음영 속도를 설정하는 가장 간단한 메커니즘입니다. 모든 계층에서 사용할 수 있습니다.

애플리케이션에서 ID3D12GraphicsCommandList5::RSSetShadingRate 메서드를 사용하여 거친 픽셀 크기를 지정할 수 있습니다. 이 API는 하나의 열거형 인수를 사용합니다. API는 렌더링 품질 수준에 대한 전반적인 제어를 제공합니다. 그리기별로 음영 속도를 설정하는 기능입니다.

이 상태의 값은 D3D12_SHADING_RATE 열거값을 통해 표현됩니다.

거친 픽셀 크기 지원

음영 속도 1x1, 1x2, 2x1 및 2x2는 모든 계층에서 지원됩니다.

디바이스에서 2x4, 4x2 및 4x4를 지원하는지 여부를 나타내는 AdditionalShadingRatesSupported 기능이 있습니다.

화면 공간 이미지(이미지 기반)

계층 2 이상에서는 화면 공간 이미지를 사용하여 픽셀 음영 속도를 지정할 수 있습니다.

화면 공간 이미지를 사용하면 애플리케이션에서 움직임 흐림, 필드 깊이 흐림, 투명한 개체 또는 HUD UI 요소가 적용되는 영역과 같이 다양한 품질 영역을 나타내는 "LOD(세부 정보 수준) 마스크" 이미지를 만들 수 있습니다. 이미지의 해상도는 렌더링 대상의 해상도가 아니라 매크로 블록에 있습니다. 즉, 음영 속도 데이터는 VRS 타일 크기에서 표시한 대로 8x8 또는 16x16 픽셀 타일의 세분성으로 지정됩니다.

타일 크기

애플리케이션에서 API를 쿼리하여 해당 디바이스에 지원되는 VRS 타일 크기를 검색할 수 있습니다.

타일은 정사각형이며, 크기는 타일의 너비 또는 높이를 텍셀 단위로 나타냅니다.

하드웨어에서 계층 2 가변 속도 음영을 지원하지 않으면 타일 크기에 대한 기능 쿼리에서 0을 반환합니다.

하드웨어에서 계층 2 가변 속도 음영을 지원하면 타일 크기는 다음 값 중 하나입니다.

  • 8
  • 16
  • 32

화면 공간 이미지 크기

크기가 {rtWidth, rtHeight}인 렌더링 대상의 경우 VRSTileSize라는 지정된 타일 크기를 사용하면 이를 적용하는 화면 공간 이미지는 다음과 같습니다.

{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }

화면 공간 이미지의 왼쪽 위(0, 0)는 렌더링 대상의 왼쪽 위(0, 0)에 잠겨 있습니다.

렌더링 대상의 특정 위치에 해당하는 타일의 (x,y) 좌표를 조회하려면 (x, y)의 창 공간 좌표를 타일 크기로 나눕니다(소수 비트 부분 무시).

화면 공간 이미지가 지정된 렌더링 대상에 필요한 것보다 큰 경우 오른쪽 및/또는 아래쪽에 있는 추가 부분은 사용되지 않습니다.

화면 공간 이미지가 지정된 렌더링 대상에 비해 너무 작은 경우 실제 범위를 벗어난 이미지에서 시도되는 읽기는 1x1의 기본 음영 속도를 생성합니다. 이는 화면 공간 이미지의 왼쪽 위(0, 0)가 렌더링 대상의 왼쪽 위(0, 0)에 잠겨 있고 "렌더링 대상 범위를 벗어난 읽기"는 x와 y에 대해 너무 큰 값을 읽는 것을 의미하기 때문입니다.

형식, 레이아웃, 리소스 속성

이 화면의 형식은 단일 채널 8비트 화면(DXGI_FORMAT_R8_UINT)입니다.

리소스는 TEXTURE2D 차원입니다.

배열하거나 mip할 수 없습니다. 명시적으로 하나의 mip 수준이 있어야 합니다.

샘플 수가 1이고 샘플 품질은 0입니다.

UNKNOWN 텍스처 레이아웃이 있습니다. 교차 어댑터가 허용되지 않으므로 암시적으로 행 중심 레이아웃이 될 수 없습니다.

화면 공간 이미지 데이터를 채우는 데 예상되는 방법은 다음 중 하나입니다.

  1. 컴퓨팅 셰이더를 사용하여 데이터를 쓰고 화면 공간 이미지가 UAV로 바인딩됩니다. 또는
  2. 데이터를 화면 공간 이미지에 복사합니다.

화면 공간 이미지를 만들 때 허용되는 플래그는 다음과 같습니다.

  • 없음
  • ALLOW_UNORDERED_ACCESS
  • DENY_SHADER_RESOURCE

허용되지 않는 플래그는 다음과 같습니다.

  • ALLOW_RENDER_TARGET
  • ALLOW_DEPTH_STENCIL
  • ALLOW_CROSS_ADAPTER
  • ALLOW_SIMULTANEOUS_ACCESS
  • VIDEO_DECODE_REFERENCE_ONLY

리소스의 힙 형식은 UPLOAD 또는 READBACK일 수 없습니다.

리소스는 SIMULTANEOUS_ACCESS일 수 없습니다. 리소스는 교차 어댑터가 될 수 없습니다.

데이터

화면 공간 이미지의 각 바이트는 D3D12_SHADING_RATE 열거형의 값에 해당합니다.

리소스 상태

리소스는 화면 공간 이미지로 사용하는 경우 읽기 전용 상태로 전환해야 합니다. 이를 위해 D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE 읽기 전용 상태가 정의되었습니다.

이미지 리소스는 해당 상태에서 쓰기 가능 상태로 다시 전환됩니다.

이미지 설정

셰이더 속도를 지정하기 위한 화면 공간 이미지는 명령 목록에 설정됩니다.

음영 속도 원본으로 설정된 리소스는 셰이더 단계에서 읽거나 쓸 수 없습니다.

셰이더 속도를 지정하기 위해 null 화면 공간 이미지를 설정할 수 있습니다. 이렇게 하면 화면 공간 이미지의 기여로 1x1을 일관되게 사용하는 효과가 있습니다. 화면 공간 이미지는 초기에 null로 설정된 것으로 간주할 수 있습니다.

승격 및 강등

화면 공간 이미지 리소스는 승격 또는 강등과 관련하여 특별한 의미가 없습니다.

기본형별 특성

기본형별 특성은 유발 꼭짓점의 특성으로서 음영 속도 항을 지정하는 기능을 추가합니다. 이 특성은 플랫 셰이드입니다. 즉, 현재 삼각형 또는 선 기본 형식의 모든 픽셀에 전파됩니다. 기본형별 특성을 사용하면 다른 음영 속도 지정자에 비해 이미지 품질을 더 세부적으로 제어할 수 있습니다.

기본형별 특성은 SV_ShadingRate라는 설정 가능한 의미 체계입니다. SV_ShadingRateHLSL 셰이더 모델 6.4의 일부로 존재합니다.

VS 또는 GS에서 SV_ShadingRate를 설정했지만 VRS를 사용하도록 설정하지 않은 경우 의미 체계 설정은 효과가 없습니다. SV_ShadingRate에 대한 값이 기본형별로 지정되지 않은 경우 1x1의 음영 속도 값을 기본형별 기여로 가정합니다.

음영 속도 요소 결합

다음 다이어그램을 사용하여 음영 속도의 다양한 원본이 순서대로 적용됩니다.

다이어그램은 프로보킹 꼭짓점 음영 속도, B 레이블이 B로 지정된 파이프라인 상태, 결합기에서 적용된 다음, 결합자에서 B라는 레이블이 지정된 이미지 기반 음영 속도를 보여 줍니다.

A와 B의 각 쌍은 결합자를 사용하여 결합됩니다.

* 꼭짓점 특성별로 셰이더 속도를 지정할 때

  • 기하 도형 셰이더가 사용되면 이를 통해 음영 속도를 지정할 수 있습니다.
  • 기하 도형 셰이더가 사용되지 않으면 유발 꼭짓점에서 음영 속도를 지정합니다.

결합자 목록

지원되는 결합자는 다음과 같습니다. 결합자(C)와 두 개의 입력(A 및 B)을 사용합니다.

  • 통과. C.xy = A.xy.
  • 재정의. C.xy = B.xy.
  • 더 높은 품질. C.xy = min(A.xy, B.xy).
  • 저품질: C.xy = max(A.xy, B.xy).
  • A를 기준으로 비용 B를 적용합니다. C.xy = min(maxRate, A.xy + B.xy).

여기서 maxRate는 디바이스에서 허용되는 최대 거친 픽셀 크기입니다. 이는 다음과 같을 것입니다.

  • AdditionalShadingRatesSupported가 false인 경우 D3D12_AXIS_SHADING_RATE_2X(즉, 값 1)입니다.
  • AdditionalShadingRatesSupported가 true인 경우 D3D12_AXIS_SHADING_RATE_4X(즉, 값 2)입니다.

가변 속도 음영에 대한 결합자의 선택은 ID3D12GraphicsCommandList5::RSSetShadingRate를 통해 명령 목록에 설정됩니다.

결합자가 설정되지 않으면 기본값인 PASSTHROUGH로 유지됩니다.

결합자의 원본이 지원 테이블에서 허용되지 않는 D3D12_AXIS_SHADING_RATE인 경우 입력은 지원되는 음영 속도로 제거됩니다.

결합자의 출력이 플랫폼에서 지원되는 음영 속도와 일치하지 않는 경우 결과는 지원되는 음영 속도로 삭제됩니다.

기본 상태 및 상태 지우기

모든 음영 속도 원본, 즉

  • 파이프라인 상태 지정 속도(명령 목록에 지정됨),
  • 화면 공간 이미지 지정 속도 및
  • 기본형별 특성의 기본값은

D3D12_SHADING_RATE_1X1입니다. 기본 결합자는 {PASSTHROUGH, PASSTHROUGH}입니다.

화면 공간 이미지가 지정되지 않으면 해당 원본에서 1x1의 음영 속도가 유추됩니다.

기본형별 특성이 지정되지 않으면 해당 원본에서 1x1의 음영 속도가 유추됩니다.

ID3D12CommandList::ClearState는 파이프라인 상태 지정 속도를 기본값으로 다시 설정하고, 화면 공간 이미지의 선택을 기본값인 "화면 공간 이미지 없음"으로 다시 설정합니다.

SV_ShadingRate를 사용하여 음영 속도 쿼리

지정된 픽셀 셰이더 호출 시 하드웨어에서 선택한 음영 속도를 아는 것이 유용합니다. 이를 통해 PS 코드에서 다양한 최적화를 사용하도록 설정할 수 있습니다. SV_ShadingRate PS 전용 시스템 변수는 음영 속도에 대한 정보를 제공합니다.

형식

이 의미 체계의 형식은 uint입니다.

데이터 해석

데이터는 D3D12_SHADING_RATE 열거형의 값으로 해석됩니다.

VRS를 사용하지 않는 경우

거친 픽셀 음영이 사용되지 않으면 SV_ShadingRate를 1x1의 값으로 다시 읽습니다. 이 값은 정밀 픽셀을 나타냅니다.

샘플 기반 실행 시 동작

픽셀 셰이더는 를 입력 SV_ShadingRate 하거나 샘플 보간 키워드(keyword) 사용하는 등 샘플 기반 실행을 입력SV_SampleIndex하고 사용하는 경우 컴파일에 실패합니다.

지연 음영에 대한 설명

지연 음영 애플리케이션의 조명 패스는 화면의 어느 영역에 사용된 음영 속도를 알 필요가 있습니다. 이는 조명 패스 디스패치가 더 거친 속도로 시작할 수 있도록 하기 위한 것입니다. SV_ShadingRate 변수는 gbuffer에 기록되는 경우 이를 수행하는 데 사용할 수 있습니다.

깊이 및 스텐실

거친 픽셀 음영을 사용하는 경우 깊이와 스텐실 및 검사는 항상 계산되고 전체 샘플 해상도로 내보내집니다.

요청한 음영 속도 사용

모든 계층에 대해 음영 속도가 요청되고 디바이스와 MSAA 수준의 조합에서 지원되는 경우 하드웨어에서 제공되는 음영 속도를 예상합니다.

요청한 음영 속도는 결합자의 출력으로 계산되는 음영 속도를 의미합니다(이 문서의 음영 속도 요소 결합 섹션 참조).

샘플 수가 4보다 작거나 같은 렌더링 작업에서 지원되는 음영 속도는 1x1, 1x2, 2x1 또는 2x2입니다. 또한 AdditionalShadingRatesSupported 기능이 true이면 일부 샘플 수에 지원되는 음영 속도는 2x4, 4x2 및 4x4입니다(이 문서의 VRS(가변 속도 음영)를 사용하는 경우 섹션 참조).

화면 공간 파생형

픽셀-인접 픽셀 그라데이션의 계산은 거친 픽셀 음영의 영향을 받습니다. 예를 들어 2x2 거친 픽셀을 사용하면 거친 픽셀을 사용하지 않는 경우에 비해 그라데이션의 크기는 두 배가 됩니다. 애플리케이션은 원하는 기능에 따라 이를 보완하도록 셰이더를 조정할 수 있습니다.

화면 공간 파생형에 따라 mip이 선택되므로 거친 픽셀 음영을 사용하면 mip 선택에 영향을 줍니다. 거친 픽셀 음영을 사용하면 거친 픽셀을 사용하지 않는 경우에 비해 덜 세부적인 mip이 선택됩니다.

특성 보간

픽셀 셰이더에 대한 입력은 해당 원본 꼭짓점에 따라 보간될 수 있습니다. 가변 속도 음영은 픽셀 셰이더의 각 호출에서 작성된 대상 영역에 영향을 주므로 특성 보간과 상호 작용합니다. 보간의 세 가지 유형은 중심, 중점 및 샘플입니다.

Center

거친 픽셀에 대한 중심 보간 위치는 거친 픽셀 전체 영역의 기하학적 중심입니다. SV_Position은 항상 거친 픽셀 영역의 중심에서 보간됩니다.

중점

MSAA에서 거친 픽셀 음영을 사용하는 경우에도 각 정밀 픽셀에 대해 대상의 MSAA 수준에 할당된 전체 샘플 수에 대한 쓰기가 있습니다. 따라서 중점 보간 위치에서는 거친 픽셀 내의 정밀 픽셀에 대한 모든 샘플을 고려합니다. 즉, 중점 보간 위치는 샘플 인덱스의 오름차순에서 검사되는 첫 번째 샘플로 정의됩니다. 샘플의 효과적인 검사는 SampleMask 래스터라이저 상태의 해당 비트와 AND 처리됩니다.

참고

계층 1에서 거친 픽셀 음영을 사용하는 경우 SampleMask는 항상 전체 마스크입니다. SampleMask가 전체 마스크가 아닌 것으로 구성되면 계층 1에서 거친 픽셀 음영이 비활성화됩니다.

샘플 기반 실행

샘플 보간 기능의 사용으로 인해 발생하는 샘플 기반 실행 또는 슈퍼 샘플링은 거친 픽셀 음영과 함께 사용할 수 있으며 샘플당 픽셀 셰이더가 호출됩니다. N개 샘플 수의 대상에 대해 픽셀 셰이더가 정밀 픽셀당 N회 호출됩니다.

EvaluateAttributeSnapped

끌어오기(pull) 모델 내장 함수는 계층 1의 거친 픽셀 음영과 호환되지 않습니다. 계층 1의 거친 픽셀 음영에서 끌어오기 모델 내장 함수를 사용하려고 하면 거친 픽셀 음영이 자동으로 비활성화됩니다.

EvaluateAttributeSnapped 내장 함수는 계층 2의 거친 픽셀 음영에서 사용할 수 있습니다. 구문은 항상 이전과 동일합니다.

numeric EvaluateAttributeSnapped(	
    in attrib numeric value, 
    in int2 offset);

컨텍스트의 경우 EvaluateAttributeSnapped에는 두 필드가 있는 오프셋 매개 변수가 있습니다. 거친 픽셀 음영 없이 사용하는 경우 전체 32개 비트 중 하위 4개만 사용됩니다. 이러한 4개 비트는 [-8, 7] 범위를 나타냅니다. 이 범위는 픽셀 내의 16x16 그리드에 걸쳐 있습니다. 즉, 픽셀의 위쪽 및 왼쪽 가장자리가 포함되고 아래쪽 및 오른쪽 가장자리는 포함되지 않는 범위입니다. (-8, -8) 오프셋은 왼쪽 위 모서리에 있고, (7, 7) 오프셋은 오른쪽 아래 모서리에 있습니다. (0, 0) 오프셋은 픽셀의 중심입니다.

거친 픽셀 음영에서 사용하면 EvaluateAttributeSnapped의 오프셋 매개 변수는 더 넓은 범위의 위치를 지정할 수 있습니다. 오프셋 매개 변수는 각 정밀 픽셀에 대해 16x16 그리드를 선택하고 여기에는 여러 개의 정밀 픽셀이 있습니다. 표현 가능한 범위와 이에 따라 사용되는 비트 수는 거친 픽셀 크기에 따라 달라집니다. 이 범위에는 거친 픽셀의 위쪽 및 왼쪽 가장자리가 포함되며 아래쪽 및 오른쪽 가장자리는 포함되지 않습니다.

아래 표에서는 각 거친 픽셀 크기에 대한 EvaluateAttributeSnapped의 오프셋 매개 변수를 해석하고 있습니다.

EvaluateAttributeSnapped의 오프셋 범위

거친 픽셀 크기 인덱싱 가능한 범위 표현 가능한 범위 크기 필요한 비트 수 {x, y} 사용 가능한 비트 이진 마스크
1x1(정밀) {[-8, 7], [-8, 7]} {16, 16} {4, 4} {000000000000xxxx, 000000000000xxxx}
1x2 {[-8, 7], [-16, 15]} {16, 32} {4, 5} {000000000000xxxx, 00000000000xxxxx}
2x1 {[-16, 15], [-8, 7]} {32, 16} {5, 4} {00000000000xxxxx, 000000000000xxxx}
2x2 {[-16, 15], [-16, 15]} {32, 32} {5, 5} {00000000000xxxxx, 00000000000xxxxx}
2x4 {[-16, 15], [-32, 31]} {32, 64} {5, 6} {00000000000xxxxx, 0000000000xxxxxx}
4x2 {[-32, 31], [-16, 15]} {64, 32} {6, 5} {0000000000xxxxxx, 00000000000xxxxx}
4x4 {[-32, 31], [-32, 31]} {64, 64} {6, 6} {0000000000xxxxxx, 0000000000xxxxxx}

아래 표는 고정 소수점에서 10진 및 소수 표시로 변환하기 위한 지침입니다. 이진 마스크의 첫 번째 사용 가능한 비트는 부호 비트이며, 이진 마스크의 나머지 비트는 숫자 부분으로 구성됩니다.

EvaluateAttributeSnapped에 전달되는 4개 비트 값에 대한 숫자 체계는 가변 속도 음영에 한정되지 않습니다. 여기서는 완성도를 높이기 위해 반복되고 있습니다.

다음은 4개 비트 값의 경우입니다.

이진 값 Decimal 소수 자릿수
1000 -0.5f -8 / 16
1001 -0.4375f -7 / 16
1010 -0.375f -6 / 16
1011 -0.3125f -5 / 16
1100 -0.25f -4 / 16
1101 -0.1875f -3 / 16
1110 -0.125f -2 / 16
1111 -0.0625f -1 /16
0000 0.0f 0 / 16
0001 -0.0625f 1 / 16
0010 -0.125f 2 / 16
0011 -0.1875f 3 / 16
0100 -0.25f 4 / 16
0101 -0.3125f 5 / 16
0110 -0.375f 6 / 16
0111 -0.4375f 7 / 16

다음은 5개 비트 값의 경우입니다.

이진 값 Decimal 소수 자릿수
10000 -1 -16 / 16
10001 -0.9375 -15 / 16
10010 -0.875 -14 / 16
10011 -0.8125 -13 / 16
10100 -0.75 -12 / 16
10101 -0.6875 -11 / 16
10110 -0.625 -10 / 16
10111 -0.5625 -9 / 16
11000 -0.5 -8 / 16
11001 -0.4375 -7 / 16
11010 -0.375 -6 / 16
11011 -0.3125 -5 / 16
11100 -0.25 -4 / 16
11101 -0.1875 -3 / 16
11110 -0.125 -2 / 16
11111 -0.0625 -1 / 16
00000 0 0 / 16
00001 0.0625 1 / 16
00010 0.125 2 / 16
00011 0.1875 3 / 16
00100 0.25 4 / 16
00101 0.3125 5 / 16
00110 0.375 6 / 16
00111 0.4375 7 / 16
01000 0.5 8 / 16
01001 0.5625 9 / 16
01010 0.625 10 / 16
01011 0.6875 11 / 16
01100 0.75 12 / 16
01101 0.8125 13 / 16
01110 0.875 14 / 16
01111 0.9375 15 / 16

다음은 6개 비트 값의 경우입니다.

이진 값 Decimal 소수 자릿수
100000 -2 -32 / 16
100001 -1.9375 -31 / 16
100010 -1.875 -30 / 16
100011 -1.8125 -29 / 16
100100 -1.75 -28 / 16
100101 -1.6875 -27 / 16
100110 -1.625 -26 / 16
100111 -1.5625 -25 / 16
101000 -1.5 -24 / 16
101001 -1.4375 -23 / 16
101010 -1.375 -22 / 16
101011 -1.3125 -21 / 16
101100 -1.25 -20 / 16
101101 -1.1875 -19 / 16
101110 -1.125 -18 / 16
101111 -1.0625 -17 / 16
110000 -1 -16 / 16
110001 -0.9375 -15 / 16
110010 -0.875 -14 / 16
110011 -0.8125 -13 / 16
110100 -0.75 -12 / 16
110101 -0.6875 -11 / 16
110110 -0.625 -10 / 16
110111 -0.5625 -9 / 16
111000 -0.5 -8 / 16
111001 -0.4375 -7 / 16
111010 -0.375 -6 / 16
111011 -0.3125 -5 / 16
111100 -0.25 -4 / 16
111101 -0.1875 -3 / 16
111110 -0.125 -2 / 16
111111 -0.0625 -1 / 16
000000 0 0 / 16
000001 0.0625 1 / 16
000010 0.125 2 / 16
000011 0.1875 3 / 16
000100 0.25 4 / 16
000101 0.3125 5 / 16
000110 0.375 6 / 16
000111 0.4375 7 / 16
001000 0.5 8 / 16
001001 0.5625 9 / 16
001010 0.625 10 / 16
001011 0.6875 11 / 16
001100 0.75 12 / 16
001101 0.8125 13 / 16
001110 0.875 14 / 16
001111 0.9375 15 / 16
010000 1 16 / 16
010001 1.0625 17 / 16
010010 1.125 18 / 16
010011 1.1875 19 / 16
010100 1.25 20 / 16
010101 1.3125 21 / 16
010110 1.375 22 / 16
010111 1.4375 23 / 16
011000 1.5 24 / 16
011001 1.5625 25 / 16
011010 1.625 26 / 16
011011 1.6875 27 / 16
011100 1.75 28 / 16
011101 1.8125 29 / 16
011110 1.875 30 / 16
011111 1.9375 31 / 16

정밀 픽셀과 마찬가지로, 평가 가능한 위치에 대한 EvaluateAttributeSnapped의 그리드는 거친 픽셀 음영을 사용할 때 거친 픽셀 중심에 놓입니다.

SetSamplePositions

거친 음영에서 ID3D12GraphicsCommandList1::SetSamplePositions API를 사용하는 경우 API는 정밀 픽셀에 대한 샘플 위치를 설정합니다.

SV_Coverage

SV_Coverage가 계층 1에서 셰이더 입력 또는 출력으로 선언되면 거친 픽셀 음영이 비활성화됩니다.

계층 2의 거친 픽셀 음영에서 SV_Coverage 의미 체계를 사용할 수 있으며, 쓰고 있는 MSAA 대상의 샘플을 반영합니다.

여러 원본 픽셀이 타일을 구성할 수 있도록 거친 픽셀 음영을 사용하는 경우 검사 마스크는 해당 타일에서 제공되는 모든 샘플을 나타냅니다.

거친 픽셀 음영과 MSAA의 호환성을 고려할 때 지정해야 하는 검사 비트 수가 달라질 수 있습니다. 예를 들어 D3D12_SHADING_RATE_2x2를 사용하는 4배수 MSAA 리소스를 사용하는 경우 각각의 거친 픽셀은 4개의 정밀 픽셀에 쓰고, 각 정밀 픽셀에는 4개의 샘플이 있습니다. 즉, 각 거친 픽셀에서 총 4 * 4 = 16개의 샘플에 씁니다.

필요한 검사 비트 수

다음 표에서는 거친 픽셀 크기와 MSAA 수준의 각 조합에 필요한 검사 비트 수를 나타냅니다.

표에는 거친 픽셀 크기, 미세 픽셀 수 및 M S A 수준이 표시됩니다.

표에서 표시한 대로 Direct3D 12를 통해 공개되는 가변 속도 음영 기능을 사용하여 한 번에 16개가 넘는 샘플에 쓰는 데에는 거친 픽셀을 사용할 수 없습니다. 이 제한은 어떤 거친 픽셀 크기에서 어떤 MSAA 수준이 허용되는지에 대한 Direct3D 12의 제약 조건으로 인해 발생합니다(이 문서의 VRS(가변 속도 음영)를 사용하는 경우 섹션 참조).

검사 마스크의 비트 순서 및 형식

검사 마스크의 비트는 잘 정의된 순서를 따릅니다. 마스크는 왼쪽에서 오른쪽, 위쪽에서 아래쪽(열 중심) 순서의 픽셀 검사로 구성됩니다. 검사 비트는 검사 의미 체계의 하위 비트이며, 모두 조밀하게 채워집니다.

아래 표에는 지원되는 거친 픽셀 크기와 MSAA 수준의 조합에 대한 검사 마스크 형식이 나와 있습니다.

표에는 거친 픽셀 크기, 거친 픽셀 다이어그램 및 1 x M S A 검사 비트가 표시됩니다.

다음 표에서는 2배수 MSAA 픽셀을 보여 주며, 각 픽셀에는 인덱스가 0 및 1인 두 개의 샘플이 있습니다.

픽셀의 샘플에 대한 레이블의 위치는 설명하기 위한 것이며, 특히 샘플 위치를 프로그래밍 방식으로 변경할 수 있는 경우 해당 픽셀에서 샘플의 {X, Y} 공간 위치를 반드시 전달할 필요는 없습니다. 샘플은 0 기반 인덱스를 통해 참조됩니다.

표에는 거친 픽셀 크기, 거친 픽셀 다이어그램 및 2 x M S A 검사 비트가 표시됩니다.

다음 표에서는 4배수 MSAA 픽셀을 보여 주며, 각 픽셀에는 인덱스가 0, 1, 2 및 3인 네 개의 샘플이 있습니다.

표에는 거친 픽셀 크기, 거친 픽셀 다이어그램 및 4 x M S A 검사 비트가 표시됩니다.

취소

discard HLSL 의미 체계를 거친 픽셀 음영에서 사용하면 거친 픽셀이 삭제됩니다.

TIR(대상 독립적 래스터화)

거친 픽셀 음영을 사용하는 경우 TIR이 지원되지 않습니다.

ROV(정렬된 래스터라이저 보기)

ROV 연동은 정밀 픽셀 세분성에서 작동하도록 지정됩니다. 음영 처리가 샘플별로 수행되는 경우 연동은 샘플 세분성에서 작동합니다.

일반 래스터화

일반 래스터화는 가변 속도 음영에서 사용할 수 있습니다. 일반 래스터화를 거친 픽셀 음영에서 사용하면 전체 검사를 제공하여 거친 픽셀 내의 정밀 픽셀이 일반 래스터화됩니다.

적용 범위

일반 래스터화를 사용하는 경우 검사 의미 체계에는 검사되는 정밀 픽셀에 대한 전체 마스크가 포함되고 검사되지 않은 정밀 픽셀에 대해서는 0이 포함됩니다.

번들

번들에서 가변 속도 음영 API를 호출할 수 있습니다.

Render Pass

렌더링 패스에서 가변 속도 음영 API를 호출할 수 있습니다.

VRS API 호출

다음 섹션에서는 Direct3D 12를 통해 애플리케이션에서 가변 속도 음영에 액세스할 수 있는 방법에 대해 설명합니다.

기능 쿼리

어댑터의 가변 속도 음영 기능을 쿼리하려면 D3D12_FEATURE::D3D12_FEATURE_D3D12_OPTIONS6을 사용하여 ID3D12Device::CheckFeatureSupport를 호출하고, 사용자를 대신하여 입력할 함수에 대한 D3D12_FEATURE_DATA_D3D12_OPTIONS6 구조체를 제공합니다. D3D12_FEATURE_DATA_D3D12_OPTIONS6 구조체에는 D3D12_VARIABLE_SHADING_RATE_TIER 열거형인 멤버(D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier)와 백그라운드 처리를 지원하는지 여부를 나타내는 멤버(D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported)를 포함하여 여러 개의 멤버가 있습니다.

예를 들어 계층 1 기능을 쿼리하려면 다음을 수행할 수 있습니다.

D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return 
    SUCCEEDED(m_device->CheckFeatureSupport(
        D3D12_FEATURE_D3D12_OPTIONS6, 
        &options, 
        sizeof(options))) && 
    options.ShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_1;

음영 속도

D3D12_SHADING_RATE 열거형의 값은 음영 속도를 두 축으로 쉽게 분해할 수 있도록 구성됩니다. 여기서 각 축의 값은 D3D12_AXIS_SHADING_RATE 열거형에 따라 로그 공간에 조밀하게 표시됩니다.

매크로를 작성하여 두 축 음영 속도를 다음과 같은 음영 속도로 구성할 수 있습니다.

#define D3D12_MAKE_COARSE_SHADING_RATE(x,y) ((x) << 2 | (y))
D3D12_MAKE_COARSE_SHADING_RATE(
    D3D12_AXIS_SHADING_RATE_2X, 
    D3D12_AXIS_SHADING_RATE_1X)

또한 플랫폼은 d3d12.h에 정의된 다음과 같은 매크로도 제공합니다.

#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )

이러한 매크로는 SV_ShaderRate를 분석하고 이해하는 데 사용할 수 있습니다.

참고

이 데이터 해석은 셰이더에서 조작할 수 있는 화면 공간 이미지를 설명하기 위한 것입니다. 이에 대해 위의 섹션에서 자세히 설명했습니다. 그러나 명령 수준 음영 속도를 설정하는 경우를 포함하여 모든 곳에서 사용되는 거친 픽셀 크기에 대해 일관되게 정의할 필요가 없습니다.

명령 수준 음영 속도 및 결합자 설정

음영 속도 및 필요에 따라 결합자는 ID3D12GraphicsCommandList5::RSSetShadingRate 메서드를 통해 지정됩니다. 기본 음영 속도에 대한 D3D12_SHADING_RATE 값을 전달하고, D3D12_SHADING_RATE_COMBINER 값의 선택적 배열을 전달합니다.

화면 공간 이미지 준비

사용 가능한 음영 속도 이미지를 지정하는 읽기 전용 리소스 상태는 D3D12_RESOURCE_STATES::D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE로 정의됩니다.

화면 공간 이미지 설정

화면 공간 이미지는 ID3D12GraphicsCommandList5::RSSetShadingRateImage 메서드를 통해 지정합니다.

m_commandList->RSSetShadingRateImage(screenSpaceImage);

타일 크기 쿼리

타일 크기는 D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize 멤버에서 쿼리할 수 있습니다. 위의 기능 쿼리를 참조하세요.

가로 및 세로 크기는 항상 동일하므로 하나의 크기가 검색됩니다. 시스템의 기능이 D3D12_SHADING_RATE_TIER_NOT_SUPPORTED이면 반환되는 타일 크기는 0입니다.