> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 取樣器意見反應 Direct3D 12 API 概觀

> 取樣器意見反應 Direct3D 12 API 概觀

支援取樣器意見反應的 API 集在 XBOX 與 PC Direct3D 12 上具有相同的 API，並針對任何超出標準功能或未在 PC 上採用的 XBOX Series X|S 硬體功能提供 XBOX 延伸模組。特別是，自訂的 MinMip 對應篩選器不會在 PC Direct3D 12 中實作。

取樣器意見反應 API 集提供下列功能。

1. 建立意見反應對應資源，可以是 MinMip 意見反應或 MipRegionUsed 意見反應配置。
2. 為意見反應對應資源建立無序存取檢視 (UAV) 描述元。
3. 將資料從意見反應對應資源複製到標準 UAV (反之亦然)，以便 CPU/GPU 讀回取樣器意見反應資料。

XBOX 延伸模組 API 提供下列功能。

1. 為 MinMip 對應建立著色器資源檢視 (SRV) 描述元。
2. 為 MinMip 對應篩選建立取樣器描述元。
3. 使用額外的檢視參數，為意見反應對應資源建立 UAV 描述元。
4. 允許建立意見反應對應資源，以及直接以 CPU/GPU 存取意見反應對應資源，而不需使用標準 API 集中的意見反應資源格式與配置抽象。

### 適用於意見反應對應資源與檢視的新 ID3D12Device8 方法

使用標準 Direct3D 12 API 時，意見反應對應是透過抽象方式建立的。遊戲知道資源的邏輯維度與意見反應對應類型，但只有驅動程式知道實體維度與硬體格式。此抽象可支援各種硬體專屬的意見反應對應編碼。不過，在 XBOX Series X|S GPU 上，意見反應對應在內部一律使用 R8\_UINT 格式，而意見反應對應的實體維度只需將圖格紋理維度除以取樣器意見反應 mip 區域維度即可輕鬆計算。

```cpp theme={null}
typedef struct D3D12_MIP_REGION
{
    UINT Width;
    UINT Height;
    UINT Depth;
} D3D12_MIP_REGION;

typedef struct D3D12_RESOURCE_DESC1
{
    D3D12_RESOURCE_DIMENSION Dimension;
    UINT64 Alignment;
    UINT64 Width;
    UINT Height;
    UINT16 DepthOrArraySize;
    UINT16 MipLevels;
    DXGI_FORMAT Format;
    DXGI_SAMPLE_DESC SampleDesc;
    D3D12_TEXTURE_LAYOUT Layout;
    D3D12_RESOURCE_FLAGS Flags;
    D3D12_MIP_REGION SamplerFeedbackMipRegion;
} D3D12_RESOURCE_DESC1;

D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device8::GetResourceAllocationInfo2(
    UINT visibleMask,
    UINT numResourceDescs,
    _In_reads_(numResourceDescs) const D3D12_RESOURCE_DESC1* pResourceDescs,
    _Out_writes_opt_(numResourceDescs) D3D12_RESOURCE_ALLOCATION_INFO1* pResourceAllocationInfo1);

HRESULT ID3D12Device8::CreateCommittedResource2(
    _In_ const D3D12_HEAP_PROPERTIES* pHeapProperties,
    D3D12_HEAP_FLAGS HeapFlags,
    _In_ const D3D12_RESOURCE_DESC1* pDesc,
    D3D12_RESOURCE_STATES InitialResourceState,
    _In_opt_ const D3D12_CLEAR_VALUE* pOptimizedClearValue,
    _In_opt_ ID3D12ProtectedResourceSession* pProtectedSession,
    _In_ REFIID riidResource, // Expected: ID3D12Resource1*
    _COM_Outptr_ void** ppvResource);

HRESULT ID3D12Device8::CreatePlacedResource1(
    _In_ ID3D12Heap* pHeap,
    UINT64 HeapOffset,
    _In_ const D3D12_RESOURCE_DESC1* pDesc,
    D3D12_RESOURCE_STATES InitialState,
    _In_opt_ const D3D12_CLEAR_VALUE* pOptimizedClearValue,
    _In_ REFIID riid, // Expected: ID3D12Resource*
    _COM_Outptr_ void** ppvResource);

typedef enum DXGI_FORMAT
{
    ...
    DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE = 187,
    DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE  = 188,
    ...
} DXGI_FORMAT;
```

`CreateCommittedResource2` 與 `CreatePlacedResource1` 建立 Direct3D 12 資源的方式與現有的 `CreateCommittedResource` 和 `CreatePlacedResource` API 類似，但額外也能建立意見反應對應資源。用來建立意見反應對應資源的 D3D12\_RESOURCE\_DESC1 結構，必須將格式指定為 DXGI\_FORMAT\_SAMPLER\_FEEDBACK\_MIN\_MIP\_OPAQUE 或 DXGI\_FORMAT\_SAMPLER\_FEEDBACK\_MIP\_REGION\_USED\_OPAQUE，並將配置指定為 D3D12\_TEXTURE\_LAYOUT\_UNKNOWN。Width、Height、DepthOrArraySize 與 MipLevel 欄位必須與目標圖格紋理的值相符。SamplerFeedbackMipRegion 的每個維度都必須是 2 的乘冪值。

例如，若要為具有 mipmap 的 4096 × 4096 BC1\_UNORM 紋理建立 MinMip 意見反應對應，並使用 512 × 256 的 mip 區域 (讓一個意見反應紋素涵蓋 mip 0 中的一個 64 KB 圖格)，資源描述的設定方式如下。

```cpp theme={null}
D3D12_RESOURCE_DESC1 MinMipFeedbackDesc = 
{
    D3D12_RESOURCE_DIMENSION_TEXTURE2D,          // Dimension.
    0,                                           // Alignment.
    4096,                                        // Width (of paired tiled texture).
    4096,                                        // Height (of paired tiled texture).
    1,                                           // DepthOrArraySize (of the MinMip feedback map).
    12,                                          // MipLevels (of paired tiled texture).
    DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE, // Format (of MinMip feedback map).
    { 1, 0 },                                    // SampleDesc.
    D3D12_TEXTURE_LAYOUT_UNKNOWN,                // Layout.
    D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS,  // Flags.
    { 512, 256, 1 }                              // SamplerFeedbackMipRegion (to define the size of the feedback map).
};
```

產生的 MinMip 意見反應對應實體維度為 8 × 16，具有一個 mip 層級，格式為 R8\_UINT，紋理配置為 D3D12XBOX\_TEXTURE\_LAYOUT\_SWIZZLE\_MODE\_256B\_S。

`GetResourceAllocationInfo2` 會根據輸入的 D3D12\_RESOURCE\_DESC1 資源描述，傳回資源的大小與對齊方式。若要建立放置於 ID3D12Heap 上的意見反應對應，需要此資訊。

```cpp theme={null}
void ID3D12Device8::CreateSamplerFeedbackUnorderedAccessView(
    _In_opt_ ID3D12Resource* pTargetedResource,
    _In_opt_ ID3D12Resource* pFeedbackResource,
    _In_ D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);

void ID3D12Device8::CreateSamplerFeedbackUnorderedAccessViewX(
    _In_opt_ ID3D12Resource* pTargetedResource,
    _In_opt_ ID3D12Resource* pFeedbackResource,
    _In_opt_ const D3D12_UNORDERED_ACCESS_VIEW_DESC* pDesc,
    _In_ D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);
```

`CreateSamplerFeedbackUnorderedAccessView` 與 `CreateSamplerFeedbackUnorderedAccessViewX` 會根據目標資源與意見反應資源，建立取樣器意見反應的 UAV 描述元。延伸模組 API 也可接受選用的 UAV 描述，以支援意見反應陣列紋理資源的子資源檢視。此 API 可確保意見反應對應的維度符合針對目標資源收集取樣器意見反應時，2 的乘冪分數的硬體需求。

### 適用於 MinMip 對應檢視與取樣器的新 ID3D12Device8 延伸方法

```cpp theme={null}
void ID3D12Device8::CreateMinMipShaderResourceViewX(
    _In_opt_ ID3D12Resource* pTargetedResource,
    _In_opt_ const D3D12_RESOURCE_DESC* pTargetedResourceDesc,
    _In_opt_ ID3D12Resource* pMinMipResource,
    _In_opt_ const D3D12_SHADER_RESOURCE_VIEW_DESC* pDesc,
    _In_ D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);
```

`CreateMinMipShaderResourceViewX` 是一個 XBOX 延伸模組 API，可根據目標資源 (或描述) 結合 MinMip 資源，建立 MinMip 對應著色器資源檢視。與建立意見反應對應 UAV 類似，此 API 會將目標資源的屬性 (寬度、高度、mip 層級) 與 MinMip 對應資源的屬性 (寬度、高度、格式) 結合，以產生連結的資源描述元。

MinMip 對應資源必須具備下列條件：

1. 維度為目標資源維度的 2 的乘冪分數
2. 格式為 R8\_UINT
3. MipLevels 計數為 1

由於 MinMip 對應資源預期很小，建議其 swizzle 模式使用 D3D12XBOX\_TEXTURE\_LAYOUT\_SWIZZLE\_MODE\_256B\_S。

```cpp theme={null}
typedef enum D3D12XBOX_SAMPLER_FLAGS : UINT
{
    ...
    D3D12XBOX_SAMPLER_FLAG_ENABLE_MINMIP_FILTER = 0x0100
} D3D12XBOX_SAMPLER_FLAGS;

typedef enum D3D12XBOX_MINMIP_FILTER_SLOPE : UINT
{
    D3D12XBOX_MINMIP_FILTER_SLOPE_2_5 = 0,
    D3D12XBOX_MINMIP_FILTER_SLOPE_3   = 1,
    D3D12XBOX_MINMIP_FILTER_SLOPE_4   = 2,
    D3D12XBOX_MINMIP_FILTER_SLOPE_5   = 3,
    D3D12XBOX_MINMIP_FILTER_SLOPE_8   = 4,
    D3D12XBOX_MINMIP_FILTER_SLOPE_16  = 5,
    D3D12XBOX_MINMIP_FILTER_SLOPE_32  = 6,
    D3D12XBOX_MINMIP_FILTER_SLOPE_64  = 7
} D3D12XBOX_MINMIP_FILTER_SLOPE;

typedef enum D3D12XBOX_MINMIP_FILTER_OFFSET : UINT
{
    D3D12XBOX_MINMIP_FILTER_OFFSET_1_4    = 0,
    D3D12XBOX_MINMIP_FILTER_OFFSET_1_8    = 1,
    D3D12XBOX_MINMIP_FILTER_OFFSET_1_16   = 2,
    D3D12XBOX_MINMIP_FILTER_OFFSET_1_32   = 3,
    D3D12XBOX_MINMIP_FILTER_OFFSET_1_64   = 4,
    D3D12XBOX_MINMIP_FILTER_OFFSET_1_128  = 5
} D3D12XBOX_MINMIP_FILTER_OFFSET;

typedef struct D3D12XBOX_SAMPLER_DESC
{
    D3D12XBOX_SAMPLER_FLAGS Flags;

    ...

    D3D12XBOX_MINMIP_FILTER_SLOPE MinMipSlopeU;
    D3D12XBOX_MINMIP_FILTER_OFFSET MinMipOffsetU;
    D3D12XBOX_MINMIP_FILTER_SLOPE MinMipSlopeVOrW;
    D3D12XBOX_MINMIP_FILTER_OFFSET MinMipOffsetVOrW;
} D3D12XBOX_SAMPLER_DESC;
```

若要建立從 MinMip 對應取樣的取樣器描述元，請使用現有的 `ID3D12Device::CreateSamplerX` XBOX 延伸模組 API，並填入 D3D12XBOX\_SAMPLER\_DESC 結構中的新欄位與旗標。篩選器斜率與位移可使用 D3D12XBOX\_MINMIP\_FILTER\_SLOPE 與 D3D12XBOX\_MINMIP\_FILTER\_OFFSET 列舉中的值來指定。

### 新的 ID3D12GraphicsCommandList1::ResolveSubresourceRegion 方法行為

```cpp theme={null}
typedef enum D3D12_RESOLVE_MODE
{
    ...
    D3D12_RESOLVE_MODE_ENCODE_SAMPLER_FEEDBACK = 4,
    D3D12_RESOLVE_MODE_DECODE_SAMPLER_FEEDBACK = 5
} D3D12_RESOLVE_MODE;

void ID3D12GraphicsCommandList1::ResolveSubresourceRegion( 
    _In_ ID3D12Resource* pDstResource,
    _In_ UINT DstSubresource,
    _In_ UINT DstX,
    _In_ UINT DstY,
    _In_ ID3D12Resource* pSrcResource,
    _In_ UINT SrcSubresource,
    _In_opt_ D3D12_RECT* pSrcRect,
    _In_ DXGI_FORMAT Format,
    _In_ D3D12_RESOLVE_MODE ResolveMode);
```

`ResolveSubresourceRegion` 方法已增強，可將資料複製到意見反應資源或從意見反應資源複製資料，並分別以標準 R8\_UINT 紋理資源作為來源或目的地。

### 新的高階著色器語言 (HLSL) 物件與方法

HLSL 著色器模型 6.5 引進了意見反應對應的新 API 物件：FeedbackTexture2D 與 FeedbackTexture2DArray。

這些是在 HLSL 中繫結至 UAV (u#) 暫存器的唯寫資源。這些新物件可在所有著色器階段中使用，但某些方法將僅限於像素著色器使用，類似於部分 Texture2D 與 Texture2DArray 方法的現有限制。

這些新物件上的方法包括 `WriteSamplerFeedback*`、`WriteSamplerFeedbackBias*`、`WriteSamplerFeedbackLevelZero`、`WriteSamplerFeedbackGrad*` 與 `WriteSamplerFeedbackLevel`。

`FeedbackTexture2D::WriteSamplerFeedback` 其中一個變體的函式原型類似下列程式碼範例。

```cpp theme={null}
void FeedbackTexture2D::WriteSamplerFeedback(
    in Texture2D SampledTexture,
    in SamplerState S,
    in float2 Location);
```

*SampledTexture* 參數表示要為哪個紋理產生意見反應。如果 *SampledTexture* 參數與建立意見反應 UAV 時使用的資源不相符，則在某些平台上的行為未定義。在 XBOX Series X|S GPU 上，*SampledTexture* 參數必須存在，但會被忽略。意見反應對應的連結資源 UAV 描述元包含執行取樣器意見反應所需的所有資訊。

## 另請參閱

[取樣器意見反應 GPU 硬體設計](/zh-TW/build/core-features/graphics/newfeatures/sfs/sf-gpu-design)

[取樣器意見反應概觀 (預覽)](/zh-TW/build/core-features/graphics/newfeatures/sfs/sf-overview)


## Related topics

- [XBOX Series X|S 上的取樣器意見反應與 SFS](/zh-TW/build/core-features/graphics/newfeatures/sfs/index.md)
- [D3D12_MIP_REGION](/zh-TW/reference/graphics/d3d12/structs/d3d12_mip_region_public.md)
- [信譽概觀](/zh-TW/services/xbox-services/community/reputation/live-reputation-overview.md)
- [從遊戲傳送信譽意見反應](/zh-TW/services/xbox-services/community/reputation/concepts/live-sending-reputation-feedback.md)
- [提交信譽意見反應](/zh-TW/services/xbox-services/community/reputation/how-to/live-submitting-reputation-feedback.md)
