ID3D12GraphicsCommandList1::SetSamplePositions 方法 (d3d12.h)
此方法會設定後續繪製、複製、解析和類似作業所使用的範例位置。
語法
void SetSamplePositions(
[in] UINT NumSamplesPerPixel,
[in] UINT NumPixels,
[in] D3D12_SAMPLE_POSITION *pSamplePositions
);
參數
[in] NumSamplesPerPixel
類型: UINT
SAL: In
指定每個圖元所要接受的樣本數目。 此值可以是 1、2、4、8 或 16,否則會捨棄 SetSamplePosition 呼叫。 樣本數目必須符合在繪製時間 PSO 中設定的樣本計數,否則行為未定義。
[in] NumPixels
類型: UINT
SAL: In
指定要指定取樣模式的像素數目。 此值可以是 1 或 4,否則會捨棄 SetSamplePosition 呼叫。 值為 1 會設定要用於每個圖元的單一範例模式;值 4 會針對 2x2 圖元方格中的每個像素設定個別的範例模式,該方格會在轉譯目標或檢視區空間上重複,並對齊偶數座標。
請注意,合併樣本數目上限不能超過 16,否則會捨棄呼叫。 如果 NumPixels 設定為 4,NumSamplesPerPixel 可以指定不超過 4 個樣本。
[in] pSamplePositions
SAL: In_reads(NumSamplesPerPixel*NumPixels)
指定D3D12_SAMPLE_POSITION項目的陣列。 陣列的大小為 NumPixels * NumSamplesPerPixel。 如果 NumPixels 設定為 4,則第一組樣本位置會對應至 2x2 像素網格線中的左上方圖元;下一個樣本位置群組會對應至右上方圖元、左下圖元的下一個群組,以及右下圖元的最後一個群組。
如果在轉譯期間使用心心插補點,則每個圖元的位置順序會決定心心取樣優先順序。 也就是說,指定順序中的第一個涵蓋樣本會選擇為心心樣本位置。
傳回值
無
備註
範例位置的作業語意是由各種繪製、複製、解析和其他可能發生的作業所決定。
CommandList: 如果沒有在 CommandList 中呼叫 SetSamplePositions 之前,範例會根據管線狀態物件 (PSO) 來假設預設位置。 如果 PSO 存在,則預設位置取決於 PSO 的SAMPLE_DESC部分,如果 PSO 的RASTERIZER_DESC部分設定為大於 0 的值,則由標準範例位置決定。
呼叫 SetSamplePosition 之後,後續繪製呼叫必須使用 PSO 的 SAMPLE_DESC 部分,或在 PSO 的 RASTERIZER_DESC 部分中使用 ForcedSampleCount 來指定相符的樣本計數。
SetSamplePositions 只能在圖形 CommandList 上呼叫。 無法在套件組合中呼叫它;套件組合會繼承呼叫 CommandList 中的範例位置狀態,且不會修改它。
呼叫 SetSamplePositions (0、0、NULL) 會將範例位置還原為其預設值。
清除 RenderTarget: 清除轉譯目標時,會忽略範例位置。
清除 DepthStencil: 清除深度樣板表面的深度部分或其任何區域時,必須將樣本位置設定為符合未來轉譯到清除表面或區域的深度部分;使用不同樣本位置產生之任何不清楚區域的內容會變成未定義。
清除深度樣板表面或任何區域的樣板部分時,會忽略樣本位置。
繪製至 RenderTarget: 繪製到轉譯目標時,即使繪製到與先前繪製呼叫重疊的區域,每個繪製呼叫仍可變更樣本位置。 目前的範例位置會決定每個繪製呼叫的作業語意,而樣本取自轉譯目標的預存內容,即使內容是使用不同的範例位置產生也一樣。
使用 DepthStencil 繪製: 當繪製至深度樣板表面 (讀取或寫入) 或其任何區域時,必須將範例位置設定為符合先前清除受影響區域的樣板。 若要使用不同的範例位置,必須先清除目標區域。 清除區域以外的圖元不會受到影響。
硬體可能會將深度部分或深度樣板表面儲存為平面方程式,並評估它們以在應用程式發出讀取時產生深度值。 只需要點陣化和輸出合併,才能支援深度樣板表面深度部分的可程式化樣本位置。 已設定樣本位置所呈現之深度部分的任何其他讀取或寫入,可能會忽略它們,而是在標準位置取樣。
解析 RenderTarget: 解析轉譯目標或其任何區域時,會忽略範例位置;這些 API 只會在預存的色彩值上運作。
解析 DepthStencil: 解析深度樣板表面的深度部分或任何區域時,必須將樣本位置設定為符合過去轉譯的介面或區域。 若要使用不同的範例位置,必須先清除目標區域。
解析深度樣板表面或任何區域的樣板部分時,會忽略樣本位置;樣板解析只會在預存樣板值上運作。
複製 RenderTarget: 從轉譯目標複製時,不論其是否為完整或部分複本,都會忽略樣本位置。
複製 DepthStencil (完整子資源) : 從深度樣板表面複製完整的子資源時,必須設定樣本位置,以符合用來產生來源表面的樣本位置。 若要使用不同的範例位置,必須先清除目標區域。
在來源表面的某些硬體屬性上, (例如預存平面方程式,) 傳送至目的地的深度值。 因此,如果後續繪製目的地介面,則原本用來產生來源內容的範例位置必須與目的地介面搭配使用。 API 在所有硬體上都需要此專案才能保持一致性,即使它可能僅適用於某些硬體也一樣。
複製 DepthStencil (部分子資源) : 從深度樣板表面複製部分子資源時,必須將樣本位置設定為符合用來產生來源表面的樣本位置,類似於複製完整的子資源。 不過,如果受影響的目的地子資源的內容只部分涵蓋於複本中,除非所有專案都是使用與複製來源相同的範例位置產生,否則這些子資源內發現部分的內容會變成未定義。 若要使用不同的範例位置,必須先清除目標區域。
從深度樣板表面的樣板部分複製部分子資源時,會忽略範例貼文。 這並不重要,哪些範例位置是用來為複本未涵蓋之目的地緩衝區的任何其他區域產生內容–這些內容仍有效。
著色器範例Pos: HLSL SamplePos 內部功能不知道可程式化的樣本位置,而且傳回給著色器的結果在以可程式化位置轉譯的介面上呼叫這個結果是未定義的。 應用程式必須視需要手動將座標傳遞至著色器。 同樣地,使用可程式化範例位置來評估範例索引的屬性並未定義。
從DEPTH_READ或DEPTH_WRITE狀態轉換: 如果處於DEPTH_READ或DEPTH_WRITE狀態的子資源轉換成任何其他狀態,包括COPY_SOURCE或RESOLVE_SOURCE,某些硬體可能需要解壓縮表面。 因此,必須在命令清單上設定範例位置,以符合用來在來源介面中產生內容的位置。 此外,對於表面的任何後續轉換,相同的深度數據仍保留在其中,樣本位置必須繼續符合命令清單上設定的轉換。 若要使用不同的範例位置,必須先清除目標區域。
如果應用程式想要在只需要使用部分時將解壓縮的區域降到最低,或只是為了保留壓縮,則可以在 DECOMPRESS 模式中呼叫 ResolveSubresourceRegion () 並指定 rect。 這隻會將相關的區域解壓縮成個別資源,讓某些硬體上的來源保持不變,但在其他硬體上,即使來源區域也會解壓縮。 然後,可以將個別明確解壓縮的資源轉換為所需的狀態 (,例如SHADER_RESOURCE) 。
從RENDER_TARGET狀態轉換: 如果處於RENDER_TARGET狀態的子資源轉換成COPY_SOURCE或RESOLVE_SOURCE以外的任何專案,某些實作可能需要解壓縮表面。 這個解壓縮與範例位置無關。
如果應用程式想要在只需要使用部分時將解壓縮的區域降到最低,或只是為了保留壓縮,則可以在 DECOMPRESS 模式中呼叫 ResolveSubresourceRegion () 並指定 rect。 這隻會將相關的區域解壓縮成個別資源,讓某些硬體上的來源保持不變,但在其他硬體上,即使來源區域也會解壓縮。 然後,可以將個別明確解壓縮的資源轉換為所需的狀態 (,例如SHADER_RESOURCE) 。
規格需求
需求 | 值 |
---|---|
目標平台 | Windows |
標頭 | d3d12.h |
程式庫 | D3d12.lib |
Dll | D3d12.dll |