Direct3D 12 보수적 래스터화

일반 래스터화는 픽셀 렌더링에 몇 가지 확신도를 추가하며, 특히 충돌 감지 알고리즘에 유용합니다.

개요

일반 래스터화는 렌더링된 기본형에서 최소한 부분적으로 검사되는 모든 픽셀이 래스터화된다는 것을 의미합니다. 즉 픽셀 셰이더가 호출됩니다. 일반적인 동작은 일반 래스터화가 활성화되면 사용되지 않는 샘플링입니다.

일반 래스터화는 충돌 감지, 폐색 선별 및 타일식 렌더링의 확신도에 대한 경우를 포함하여 다양한 상황에서 유용합니다.

예를 들어 다음 그림에서는 일반 래스터화를 사용하여 렌더링된 녹색 삼각형을 보여 줍니다(즉, 16.8 고정 소수점 꼭짓점 좌표 사용). 밤색 영역은 "불확실 영역"으로 알려져 있습니다. 이 영역은 삼각형의 확장된 경계를 나타내는 개념적 영역이며, 래스터라이저의 기본형이 원래 부동 소수점 꼭짓점 좌표와 관련하여 일반적이도록 보장하는 데 필요합니다. 스윕된 정사각형인 각 꼭짓점의 빨간색 정사각형은 불확실성 영역을 계산하는 방법을 보여 줍니다.

큰 회색 정사각형은 렌더링될 픽셀을 보여 줍니다. 분홍색 정사각형은 삼각형의 가장자리가 픽셀 가장자리와 교차할 때 나타나는 "왼쪽 위 규칙(Top-Left Rule)"을 사용하여 렌더링된 픽셀을 보여 줍니다. 시스템에서 항상은 아니지만 정상적으로 선별하는 거짓 긍정(존재하지 않았어야 하는 픽셀 세트)이 있을 수 있습니다.

왼쪽 위 규칙

파이프라인과 상호 작용

래스터화 규칙 상호 작용

일반 래스터화 모드에서 래스터화 규칙은 위에서 설명한 왼쪽 위 규칙 및 픽셀 검사를 제외하고는 일반 래스터화 모드가 활성화되지 않는 경우와 동일한 방식으로 적용됩니다. 16.8 고정 소수점 래스터라이저 전체 자릿수를 사용해야 합니다.

하드웨어에서 부동 소수점 꼭짓점 좌표 전체를 사용하는 경우 검사되지 않는 픽셀은 고정 소수점 정의역의 절반 픽셀보다 큰 불확실성 영역 내에 있는 경우에만 포함될 수 있습니다. 미래의 하드웨어에서는 계층 2에서 지정한 강화된 불확실성 영역에 도달할 것입니다. 이 요구 사항은 조각난 삼각형이 필요한 것 이상으로 확장되지 않도록 합니다.

비슷한 유효 불확실성 영역도 InnerCoverage에 적용되지만, 이 경우에는 더 큰 불확실성 영역을 요구하는 구현이 없으므로 더 엄격합니다. 자세한 내용은 InnerCoverage 상호 작용을 참조하세요.

내부 및 외부 불확실성 영역은 고정 소수점 정의역에서 하위 픽셀 그리드의 절반 또는 픽셀의 1/512 크기보다 크거나 같아야 합니다. 이는 최소 유효 불확실성 영역입니다. 1/512는 16.8 고정 소수점 래스터라이저 좌표 표현 및 부동 소수점 꼭짓점 좌표를 16.8 고정 소수점 좌표로 변환할 때 적용되는 가장 근접한 값으로 반올림 규칙에서 제공됩니다. 래스터라이저 전체 자릿수가 변경되면 1/512도 변경될 수 있습니다. 구현에서 이 최소 불확실성 영역을 구현하는 경우 불확실성 영역의 가장자리 또는 모서리가 픽셀의 가장자리 또는 모서리를 따라 떨어지면 왼쪽 위 규칙을 따라야 합니다. 불확실성 영역의 클리핑된 가장자리는 가장 가까운 꼭짓점으로 처리해야 합니다. 즉 연결된 꼭짓점에 조인되는 두 가장자리로 계산됩니다. 최소 불확실성 영역을 사용하지 않을 경우 일반 래스터화 모드가 비활성화되었을 때 일반 래스터화 구현에서 검사될 수 있는 픽셀을 래스터화할 수 없으므로 최소 불확실성 영역이 사용되는 경우에는 왼쪽 위 규칙이 필요합니다.

다음 다이어그램에서는 고정 소수점 정의역에서 기본형의 가장자리 주위에 정사각형을 스윕하여 생성된 유효한 외부 불확실성 영역을 보여 줍니다(즉, 꼭짓점이 16.8 고정 소수점 표현으로 정량화되었음). 이 정사각형의 크기는 유효한 외부 불확실성 영역 크기를 기반으로 합니다. 픽셀의 1/2의 경우 정사각형의 너비와 높이는 1픽셀이고, 픽셀의 1/512의 경우 정사각형의 너비와 높이는 픽셀의 1/256입니다. 녹색 삼각형은 지정된 기본형을 나타내고, 빨간색 점선은 과대 평가된 일반 래스터화에 대한 경계를 나타내며, 검은색 실선 정사각형은 기본형 가장자리를 따라 스윕된 정사각형을 나타내고, 파란색 체크 무늬 영역은 외부 불확실성 영역입니다.

외부 불확실성 영역

다중 샘플링 상호 작용

RenderTarget/DepthStencil 표면의 샘플 수(또는 ForcedSampleCount가 사용 중인지 여부)에 관계없이 모든 샘플은 보수적 래스터화로 래스터화된 픽셀에 대해 다룹니다. 개별 샘플 위치는 기본형에 포함되는지 여부에 대해 테스트되지 않습니다.

SampleMask 상호 작용

SampleMask 래스터라이저 상태는 InputCoverage에 일반 래스터화를 사용하도록 설정하지 않은 경우와 동일한 방식으로 적용되지만 InnerCoverage에는 영향을 주지 않습니다(즉, InnerCoverage로 선언된 입력에 AND 처리되지 않음). 이는 MSAA 샘플이 마스킹되는지 여부와 관련이 없기 때문 InnerCoverage 입니다. 0 InnerCoverage 은 픽셀이 완전히 덮여 있다고 보장되지 않고 샘플이 업데이트되지 않음을 의미합니다.

깊이/스텐실 테스트 상호 작용

일반 래스터화가 활성화되지 않는 경우 모든 샘플이 검사되는 것과 동일한 방식으로 깊이/스텐실 테스트가 일반 래스터화된 픽셀에 대해 진행됩니다.

검사되는 모든 샘플을 계속 진행하면 깊이 외삽이 발생할 수 있으며, 이는 유효하며 일반 래스터화가 활성화되지 않는 경우 지정한 대로 뷰포트에 고정되어야 합니다. 이는 샘플 수가 1보다 큰 RenderTarget에서 픽셀-빈도 보간 모드를 사용하는 경우와 비슷하지만, 일반 래스터화의 경우 외삽할 수 있는 고정 함수 깊이 테스트에 들어가는 깊이 값입니다.

깊이 외삽을 사용하는 초기 깊이 선별 동작은 정의되지 않습니다. 이는 일부 초기 깊이 선별 하드웨어에서 외삽된 깊이 값을 제대로 지원할 수 없기 때문입니다. 그러나 깊이 외삽이 있는 경우 초기 깊이 선별 동작은 외삽된 깊이 값을 지원할 수 있는 하드웨어에서도 문제가 됩니다. 이 문제는 픽셀 셰이더 입력 깊이를 래스터화되는 기본형의 최소 및 최대 깊이 값으로 고정하고, 해당 값을 oDepth(픽셀 셰이더 출력 깊이 레지스터)에 씀으로써 해결할 수 있습니다. oDepth 쓰기로 인해 구현에서 초기 깊이 선별을 사용하지 않도록 설정해야 합니다.

도우미 픽셀 상호 작용

도우미 픽셀 규칙은 일반 래스터화를 활성화하지 않는 경우와 동일한 방식으로 적용됩니다. 이 규칙의 일부로, 도우미 픽셀을 포함한 모든 픽셀에서 InputCoverage 상호 작용 섹션에서 지정한 대로 InputCoverage를 정확하게 보고해야 합니다. 따라서 완전히 적용되지 않은 픽셀은 0 검사 내에서 보고됩니다.

출력 검사 상호 작용

출력 검사(oMask)는 검사되는 모든 샘플에서 일반 래스터화를 활성화하지 않는 경우에 수행하는 것처럼 일반 래스터화된 픽셀에 대해 작동합니다.

InputCoverage 상호 작용

일반 래스터화 모드에서 지정된 일반 래스터화된 픽셀에 대해 일반 래스터화를 활성화하지 않는 경우 모든 샘플이 검사된 것처럼 이 입력 레지스터가 채워집니다. 즉, 모든 기존 상호 작용이 적용되고(예: SampleMask가 적용됨), LSB의 첫 번째 n비트는 InputCoverage 보수적으로 래스터화된 픽셀에 대해 1로 설정되며, 출력 병합기에서 바인딩된 픽셀당 n개의 샘플 RenderTarget 및/또는 DepthStencil 버퍼 또는 n 샘플 ForcedSampleCount가 있습니다. 나머지 비트는 0입니다.

이 입력은 일반 래스터화의 사용 여부와 관계없이 셰이더에서 사용할 수 있지만, 일반 래스터화는 검사된 모든 샘플만 표시하도록 해당 동작을 변경합니다(또는 도우미 픽셀의 경우 표시하지 않음).

InnerCoverage 상호 작용

이 기능은 필요하며, 계층 3에서만 사용할 수 있습니다. 구현에서 계층 3 미만의 계층을 지원하는 경우 이 모드를 사용하는 셰이더에 대한 런타임에서 셰이더를 만드는 데 실패합니다.

픽셀 셰이더에는 32비트 스칼라 정수 시스템 생성 값(InnerCoverage)이 있습니다. 이는 LSB의 0 비트가 지정된 일반 래스터화된 픽셀에 대해 1로 설정된 비트 필드이며, 해당 픽셀이 현재 기본형 내에 완전히 있다고 보장되는 경우에만 사용할 수 있습니다. 0 비트가 설정되지 않으면 다른 모든 입력 레지스터 비트가 0으로 설정되어야 하지만, 0 비트가 1로 설정되면 정의되지 않습니다(기본적으로 이 비트 필드는 부울 값을 나타내며, false이면 정확히 0이어야 하지만, true이면 0 값이 아닌 홀수(즉 0 비트 세트)일 수 있음). 이 입력은 과소 평가된 일반 래스터화 정보에 사용됩니다. 픽셀 셰이더에 현재 픽셀이 기하 도형 내에 완전히 있는지 여부를 알려줍니다.

이 경우 현재 그리기가 작동하는 해상도보다 크거나 같은 해상도에서의 스냅 오류를 설명해야 합니다. 거짓 긍정(현재 그리기가 작동하는 해상도보다 크거나 같은 해상도에서 스냅 오류에 대해 픽셀이 완전히 검사되지 않는 경우 InnerCoverage 비트 설정)일 수는 없지만, 거짓 부정은 허용됩니다. 요약하면, 구현에서 부동 소수점 꼭짓점 좌표 전체가 없는 픽셀을 래스터라이저에서 완전히 검사하는 것으로 잘못 식별하지 않아야 합니다.

하드웨어에서 부동 소수점 꼭짓점 좌표 전체를 사용하는 경우 완전히 검사되는 픽셀은 고정 소수점 정의역에서 하위 픽셀 그리드 크기 또는 픽셀의 1/256보다 크지 않아야 하는 내부 불확실성 영역을 교차하는 경우에만 생략할 수 있습니다. 또 다른 방법으로, 내부 불확실성 영역의 내부 경계 내에 있는 픽셀은 완전히 검사되는 것으로 표시해야 합니다. 불확실성 영역의 내부 경계는 아래 다이어그램에서 굵은 검은색 점선으로 표시되어 있습니다. 1/256은 래스터라이저 전체 자릿수가 변경되면 변경할 수 있는 16.8 고정 소수점 래스터라이저 좌표 표현에서 제공됩니다. 이 불확실성 영역은 래스터라이저에서 부동 소수점 꼭짓점 좌표를 고정 소수점 꼭짓점 좌표로 변환하여 발생하는 스냅 오류를 설명하기에 충분합니다.

래스터화 규칙 상호 작용에 정의된 것과 동일한 1/512 최소 불확실성 영역 요구 사항도 여기에 적용됩니다.

다음 다이어그램에서는 고정 소수점 정의역에서 기본형의 가장자리 주위에 정사각형을 스윕하여 생성된 유효한 내부 불확실성 영역을 보여 줍니다(즉, 꼭짓점이 16.8 고정 소수점 표현으로 정량화되었음). 이 정사각형의 크기는 유효한 내부 불확실성 영역 크기를 기반으로 합니다. 픽셀의 1/256의 경우 정사각형의 너비와 높이는 픽셀의 1/128입니다. 녹색 삼각형은 지정된 기본형을 나타내고, 굵은 검정색 점선은 내부 불확실성 영역의 경계를 나타내며, 검은색 실선 정사각형은 기본형 가장자리를 따라 스윕된 정사각형을 나타내며, 주황색 체크 무늬 영역은 내부 불확실성 영역입니다.

내부 불확실성 지역

InnerCoverage의 사용은 픽셀이 일반 래스터화되는지 여부에 영향을 주지 않습니다. 즉, 이러한 InputCoverage 모드 중 하나를 사용하면 일반 래스터화 모드가 활성화될 때 래스터화되는 픽셀에 영향을 주지 않습니다. 따라서 InnerCoverage가 사용되고 픽셀 셰이더에서 기하 도형을 통해 완전히 검사되지 않는 픽셀을 처리하는 경우 해당 값은 0이지만 픽셀 셰이더를 호출하면 샘플이 업데이트됩니다. 이는 InputCoverage가 0인 경우와 다릅니다. 즉, 샘플이 업데이트되지 않습니다.

이 입력은 InputCoverage와 상호 배타적이며, 둘 모두를 사용할 수 없습니다.

InnerCoverage에 액세스하려면 픽셀 셰이더 입력 레지스터 중 하나에서 이를 단일 구성 요소로 선언해야 합니다. 선언의 보간 모드는 일정해야 합니다(보간이 적용되지 않음).

InnerCoverage 비트 필드는 깊이/스텐실 테스트의 영향을 받지 않으며 SampleMask 래스터라이저 상태와 AND 처리도 되지 않습니다.

이 입력은 일반 래스터화 모드에서만 유효합니다. 일반 래스터화가 활성화되지 않으면 InnerCoverage에서 정의되지 않은 값을 생성합니다.

도우미 픽셀이 필요하지만 그렇지 않으면 기본형에서 검사하지 않는 픽셀 셰이더 호출에는 InnerCoverage 레지스터가 0으로 설정되어야 합니다.

특성 보간 상호 작용

특성 보간 모드는 변경되지 않으며, 뷰포트 크기 조정 및 고정 소수점 변환 꼭짓점이 사용되는 일반 래스터화가 활성화되지 않는 경우와 동일한 방식으로 진행합니다. 일반 래스터화된 픽셀의 모든 샘플이 검사된 것으로 간주되므로 샘플 수가 1보다 큰 RenderTarget에서 픽셀-빈도 보간 모드를 사용하는 경우와 비슷하게 값을 외삽하는 것이 유효합니다. 중점 보간 모드는 해당하는 비중점 보간 모드와 동일한 결과를 생성합니다. 샘플 검사가 전체 또는 0인 이 시나리오에서 중점의 개념은 의미가 없습니다.

일반 래스터화를 사용하면 퇴화 삼각형에서 픽셀 셰이더 호출을 생성할 수 있으므로 퇴화 삼각형은 모든 보간된 값에 대해 0 꼭짓점에 할당된 값을 사용해야 합니다.

클리핑 상호 작용

일반 래스터화 모드를 사용하도록 설정하고 깊이 클립을 사용하지 않도록 설정한 경우( DepthClipEnable Rasterizer 상태가 FALSE로 설정된 경우) 구현에 따라 0 <= z <= w 범위를 벗어나는 기본 형식 세그먼트에 대한 특성 보간에 차이가 있을 수 있습니다. 기본 형식이 관련 평면(근거리 또는 멀리)과 교차하는 지점에서 상수 값이 사용됩니다. 또는 특성 보간은 일반 래스터화 모드가 비활성화된 경우처럼 동작합니다. 그러나 깊이 값 동작은 일반 래스터화 모드와 관계없이 동일합니다. 즉, 깊이 범위를 벗어나는 기본형에는 여전히 뷰포트 깊이 범위의 가장 가까운 제한 값이 지정되어야 합니다. 0 <= z <= w 범위 내의 특성 보간 동작은 변경되지 않은 상태로 유지되어야 합니다.

클립 거리 상호 작용

클립 거리는 일반 래스터화 모드를 활성화한 경우에 유효하며, 검사되는 모든 샘플에서 일반 래스터화를 활성화하지 않는 경우에 수행하는 것처럼 일반 래스터화된 픽셀에 대해 작동합니다.

일반 래스터화는 W 꼭짓점 좌표의 추정을 일으킬 수 있으며, 이로 인해 W <= 0이 발생할 수 있습니다. 이로 인해 픽셀당 클립 거리 구현이 잘못된 W 값으로 원근감을 나눈 클립 거리에서 작동할 수 있습니다. 클립 거리 구현은 꼭짓점 좌표가 W <= 0인 픽셀에 대한 래스터화를 호출하지 않도록 보호해야 합니다(예: 보수적 래스터화 모드의 경우 외삽으로 인해).

대상 독립적 래스터화 상호 작용

일반 래스터화 모드는 TIR(대상 독립적 래스터화)과 호환됩니다. TIR 규칙 및 제한 사항이 적용되어 모든 샘플이 검사된 것처럼 일반 래스터화된 픽셀에 대해 작동합니다.

IA 기본 토폴로지 상호 작용

일반 래스터화는 선 또는 점 기본형에 대해 정의되지 않습니다. 따라서 점 또는 선을 지정하는 기본 토폴로지는 일반 래스터화를 활성화할 때 래스터라이저 장치에 공급되는 경우 정의되지 않은 동작을 생성합니다.

디버그 계층 유효성 검사는 애플리케이션에서 이러한 기본 토폴로지를 사용하지 않는지 확인합니다.

쿼리 상호 작용

일반 래스터화된 픽셀의 경우 쿼리는 모든 샘플이 검사될 때 일반 래스터화를 활성화하지 않는 경우에 수행하는 것처럼 작동합니다. 예를 들어 보수적으로 래스터화된 픽셀의 경우 D3D12_QUERY_TYPE_OCCLUSION 및 D3D12_QUERY_TYPE_PIPELINE_STATISTICS( D3D12_QUERY_TYPE)은 모든 샘플이 적용될 때 보수적 래스터화를 사용하도록 설정하지 않을 때와 마찬가지로 동작해야 합니다.

픽셀 셰이더 호출은 일반 래스터화 모드에서 일반 래스터화된 모든 픽셀에 대해 증분해야 합니다.

선별 상태 상호 작용

모든 선별 상태는 일반 래스터화 모드에서 유효하며, 일반 래스터화를 활성화하지 않는 경우와 동일한 규칙을 따릅니다.

일반 래스터화를 해상도 전체에 걸쳐 자체적으로 비교하거나 일반 래스터화를 활성화하지 않은 상태에서 비교할 때 일부 기본형에는 일치하지 않는 양면성(즉, 하나는 뒷면, 다른 하나는 앞면)이 있을 가능성이 있습니다. 애플리케이션은 시스템 생성 값을 사용하지 않고 D3D12_CULL_MODE D3D12_CULL_MODE_NONE 사용하여 이러한 불확실성을 IsFrontFace 방지할 수 있습니다.

IsFrontFace 상호 작용

IsFrontFace 시스템 생성 값은 일반 래스터화 모드에서 사용하는 데 유효하며, 일반 래스터화가 활성화되지 않는 경우 정의된 동작을 따릅니다.

채우기 모드 상호 작용

보수적 래스터화에 유효한 유일한 D3D12_FILL_MODE D3D12_FILL_SOLID 다른 채우기 모드는 래스터라이저 상태에 대한 잘못된 매개 변수입니다.

이는 D3D12 기능 사양에서 와이어프레임 채우기 모드가 삼각형 가장자리를 선으로 변환하고 선 래스터화 규칙을 따라야 하며, 일반 선 래스터화 동작이 정의되지 않았음을 지정하기 때문입니다.

구현 세부 정보

Direct3D 12에서 지원되는 래스터화 유형을 "과대 평가된 일반 래스터화"라고도 합니다. 또한 "과소 평가된 일반 래스터화"라는 개념도 있습니다. 즉 렌더링된 기본형에서 완전히 검사되는 픽셀만 래스터화됩니다. 과소 평가된 일반 래스터화 정보는 입력 검사 데이터를 사용하여 픽셀 셰이더를 통해 사용할 수 있으며, 과대 평가된 일반 래스터화만 래스터화 모드로 사용할 수 있습니다.

기본형의 일부가 픽셀과 겹치면 해당 픽셀이 검사되는 것으로 간주되어 래스터화됩니다. 기본형의 가장자리 또는 모서리가 픽셀의 가장자리 또는 모서리를 따라 떨어지면 구현에 따라 "왼쪽 위 규칙"이 다르게 적용됩니다. 그러나 퇴화 삼각형을 지원하는 구현의 경우 가장자리 또는 모서리를 따르는 퇴화 삼각형은 하나 이상의 픽셀을 검사해야 합니다.

일반 래스터화 구현은 하드웨어에 따라 달라질 수 있으며, 픽셀이 검사되었다고 잘못 판단할 수 있음을 의미하는 거짓 긍정을 생성할 수 있습니다. 이는 래스터화에 사용되는 고정 소수점 꼭짓점 좌표에 내재된 기본형 증가 또는 스냅 오류와 같은 구현별 세부 정보로 인해 발생할 수 있습니다. 고정 소수점 꼭짓점 좌표와 관련하여 거짓 긍정이 유효한 이유는 구현에서 스냅 후 꼭짓점(즉, 부동 소수점에서 래스터라이저에 사용되는 16.8 고정 소수점으로 변환된 꼭짓점 좌표)에 대한 검사 평가를 수행하지만 원래의 부동 소수점 꼭짓점 좌표에서 생성된 검사를 사용할 수 있도록 허용하는 데 약간의 거짓 긍정이 필요하기 때문입니다.

일반 래스터화 구현은 비퇴화 스냅 후 기본형에 대한 부동 소수점 꼭짓점 좌표와 관련하여 거짓 부정을 생성하지 않습니다. 즉 기본형의 일부가 픽셀의 일부와 겹치면 해당 픽셀이 래스터화됩니다.

퇴화 삼각형(인덱스 버퍼의 인덱스 중복 또는 3D의 공선형) 또는 고정 소수점 변환 이후의 퇴화 삼각형(래스터라이저의 공선형 꼭짓점)은 선별되거나 선별되지 않을 수 있으며, 둘 다 유효한 동작입니다. 퇴화 삼각형은 뒷면으로 간주해야 하므로 애플리케이션에 특정 동작이 필요한 경우 뒷면 선별을 사용하거나 앞면을 테스트할 수 있습니다. 퇴화 삼각형은 모든 보간 값에 대해 0 꼭짓점에 할당된 값을 사용합니다.

하드웨어에서 이 기능을 지원하지 않을 가능성 외에도 세 가지 계층의 하드웨어 지원이 있습니다.

  • 계층 1은 최대 1/2 픽셀의 불확실성 영역을 적용하고 스냅 후 퇴화를 지원하지 않습니다. 타일식 렌더링, 텍스처 아틀라스, 조명 맵 생성 및 하위 픽셀 섀도 맵에 적합합니다.
  • 계층 2는 최대 불확실성 영역을 1/256로 줄이며, 스냅 후 퇴화를 선별하지 않아야 합니다. 이 계층은 CPU 기반 알고리즘 가속(예: 복셀화)에 유용합니다.
  • 계층 3은 최대 1/256 불확실성 영역을 유지하고, 내부 입력 검사에 대한 지원을 추가합니다. 내부 입력 검사는 새 SV_InnerCoverage 값을 HLSL(High Level Shading Language)에 추가합니다. 이 값은 픽셀 셰이더에 대한 입력에 지정할 수 있는 32비트 스칼라 정수이며, 과소 평가된 일반 래스터화 정보(즉, 픽셀이 완전히 검사되도록 보장하는지 여부)를 나타냅니다. 이 계층은 폐색 선별에 유용합니다.

API 요약

일반 래스터화를 참조하는 메서드, 구조체, 열거형 및 도우미 클래스는 다음과 같습니다.

DirectX 고급 학습 비디오 자습서: 일반 래스터화

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

렌더링