다음을 통해 공유


타일식 리소스 텍스처 샘플링 기능

이 섹션에서는 타일식 리소스 텍스처 샘플링 기능에 대해 설명합니다.

타일식 리소스 텍스처 샘플링 기능의 요구 사항

여기에 설명된 텍스처 샘플링 기능을 사용하려면 계층 2 수준의 타일식 리소스 지원이 필요합니다.

매핑된 영역에 대한 셰이더 피드백

타일식 리소스를 읽고/또는 쓰는 셰이더 명령으로 인해 상태 정보가 기록됩니다. 이 상태는 32비트 임시 레지스터로 가는 모든 리소스 액세스 명령에서 선택적 추가 반환 값으로 노출됩니다. 반환 값의 콘텐츠는 불투명합니다. 즉, 셰이더 프로그램의 직접 읽기가 허용되지 않습니다. 하지만 CheckAccessFullyMapped 함수를 사용하여 상태 정보를 추출할 수 있습니다.

완전 매핑 검사

CheckAccessFullyMapped 함수는 메모리 액세스에서 반환된 상태를 해석하고 액세스되는 모든 데이터가 리소스에서 매핑되었는지 여부를 나타냅니다. CheckAccessFullyMapped는 데이터가 매핑된 경우 true(0xFFFFFFFF), 매핑되지 않은 경우 false(0x00000000)를 반환합니다.

필터 작업 도중, 지정된 텍셀의 가중치가 0.0이 되는 경우가 가끔 있습니다. 텍스처 좌표가 텍셀 중앙 바로 위에 오는 선형 샘플이 한 예입니다. 다른 세 텍셀(어느 텍셀인지는 하드웨어에 따라 달라질 수 있음)이 필터에 기여하지만 가중치는 0입니다. 이러한 가중치 0 텍셀은 필터 결과에 전혀 기여하지 않습니다. 따라서 이들 텍셀이 NULL 타일 위에 오는 경우 매핑되지 않은 액세스로 계산되지 않습니다. 여러 밉 수준을 포함하는 텍스처 필터에도 동일한 규칙이 적용됩니다. 밉맵 중 하나에서 텍셀이 매핑되지 않았지만 이러한 텍셀의 가중치가 0일 경우 해당 텍셀은 매핑되지 않은 액세스로 계산되지 않습니다.

구성 요소가 4개 미만인 형식(예: DXGI_FORMAT_R8_UNORM)에서 샘플링하는 경우 NULL 타일에 속하는 모든 텍셀은 셰이더가 실제로 결과를 보는 구성 요소에 관계없이 NULL 매핑 액세스가 보고됩니다. 예를 들어 R8_UNORM에서 읽고 .gba/.yzw를 포함한 셰이더에서 읽기 결과를 마스킹하면 텍스처를 읽을 필요가 전혀 없어집니다. 하지만 텍셀 주소가 NULL 매핑된 타일이라면 작업은 여전히 NULL 맵 액세스로 계산됩니다.

셰이더는 상태를 확인하고 실패 시 원하는 조치를 사용할 수 있습니다. 예를 들어, 조치는 로깅 ‘누락’(예를 들어 UAV 쓰기를 통해) 및/또는 매핑된 것으로 알려진 정교하지 않은 LOD로 고정된 다른 읽기 발급이 될 수 있습니다. 애플리케이션은 매핑된 타일 중 얼마나 액세스되었는지 파악하기 위해 성공한 액세스도 추적하기를 원할 수 있습니다.

로깅에서 한 가지 문제는 액세스되었을 타일의 집합을 정확하게 보고하는 메커니즘이 존재하지 않는다는 것입니다. 애플리케이션은 액세스에 사용된 좌표를 알고 하드웨어 LOD 계산을 반환하는 LOD 명령(예: tex2Dlod)을 사용하여 보수적인 추측을 수행할 수 있습니다.

또 하나의 문제는 많은 액세스가 동일한 타일로 이루어진다는 것이고, 따라서 상당한 중복 로깅이 불가피하여 메모리 경합이 발생할 가능성이 있다는 점입니다. 이미 다른 곳에 보고된 타일 액세스는 보고하지 않도록 하는 옵션이 하드웨어에 제공된다면 편리할 것입니다. 아마도 이러한 추적의 상태는 API에서 재설정할 수 있을 것입니다(예를 들어 프레임 경계에서).

샘플당 MinLOD 클램프

셰이더가 매핑되지 않은 것으로 알려진 mipmapped 타일식 리소스의 영역을 방지할 수 있도록 샘플러(필터링)를 사용하는 대부분의 셰이더 지침에는 셰이더가 추가 float32 MinLOD 클램프 매개 변수를 텍스처 샘플에 전달할 수 있는 새 모드가 있습니다. 이 값은 기본 리소스와는 달리 뷰의 밉맵 번호 공간에 위치합니다.

하드웨어는 리소스당 MinLOD 클램프가 발생하는 LOD 계산의 동일한 위치에서 max(fShaderMinLODClamp,fComputedLOD)를 수행하며 max()이기도 합니다.

샘플당 LOD 클램프와 샘플러에 정의된 다른 LOD 클램프를 적용한 결과가 빈 집합일 경우 이는 리소스당 minLOD 클램프와 동일한 범위를 벗어난 액세스 결과입니다. 화면 형식의 구성 요소 및 누락된 구성 요소의 기본값은 0입니다.

여기에 설명된 샘플별 minLOD 클램프보다 앞서는 LOD 명령(예: tex2Dlod)은 클램프 및 래핑되지 않은 LOD를 모두 반환합니다. 이 LOD 명령에서 반환되어 고정된 LOD는 리소스당 클램프를 포함한 모든 클램프를 반영하지만 샘플당 클램프는 반영하지 않습니다. 샘플당 클램프는 항상 셰이더에 의해 제어 및 인지되므로 셰이더 작성자는 필요한 경우 수동으로 해당 클램프를 LOD 명령의 반환 값에 적용할 수 있습니다.

최소/최대 축소 필터링

애플리케이션은 타일형 리소스에 대한 매핑의 모양을 알려주는 자체 데이터 구조를 관리하도록 선택할 수 있습니다. 예를 들어 타일식 리소스의 모든 타일에 대한 정보를 저장할 텍셀이 들어 있는 표면이 있습니다. 지정된 타일 위치에서 매핑된 첫 번째 LOD를 저장할 수 있을 것입니다. 타일식 리소스가 샘플링되는 것과 비슷한 방식으로 이 데이터 구조를 신중하게 샘플링하면 전체 텍스처 필터 공간으로 완전히 매핑되는 최소 LOD가 무엇인지 발견할 수 있습니다. 이 프로세스를 용이하게 만들기 위해 Direct3D 11.2는 새로운 범용 샘플러 모드인 최소/최대 필터링을 도입했습니다.

LOD 추적에 대한 최소/최대 필터링 유틸리티는 아마도 깊이 화면의 필터링과 같은 다른 용도에 유용할 것입니다.

최소/최대 감소 필터링은 일반 텍스처 필터가 가져오는 것과 동일한 텍셀 집합을 가져오는 하나의 샘플러 모드입니다. 하지만 값을 혼합하여 답변을 생성하는 대신, 구성 요소별로 가져온 텍셀의 min() 또는 max()를 반환합니다(예를 들어 모든 G 값의 최소와 별도로 모든 R 값의 최소 등).

최소/최대 연산은 Direct3D 연산 정밀도 규칙을 따릅니다. 비교 순서는 중요하지 않습니다.

최소/최대가 아닌 필터 작업 도중, 지정된 텍셀의 가중치가 0.0이 되는 경우가 가끔 있습니다. 예를 들어 텍셀 중앙에 직접 떨어지는 텍스처 좌표가 있는 선형 샘플입니다. 3개의 다른 텍셀(하드웨어에 따라 다를 수 있음)이 필터에 영향을 주지만 무게는 0입니다. 비 최소/최대 필터에서 가중치가 0이 되는 이러한 텍셀은 필터가 최소/최대라도 결과에 기여하지 않습니다. 또한 가중치는 최소/최대 필터 작업에 달리 영향을 미치지 않습니다.

필터 모드의 전체 목록은 열거형 값의 MINIMUM 및 MAXIMUM가 있는 D3D11_FILTER 열거형에 표시됩니다.

이 기능에 대한 지원은 타일형 리소스에 대한 계층 2 지원에 따라 달라집니다.

타일형 리소스에 대한 파이프라인 액세스