串流資源紋理取樣功能
串流資源紋理取樣功能涵蓋取得有關對應區域的著色器狀態意見反應、檢查正在存取的所有資料是否已於資源中對應、透過限縮來協助著色器避免已進行 Mipmap 之串流資源中已知的未對應區域,以及探索整個紋理篩選量完全對應的最小 LOD 為何。
串流資源紋理取樣功能的需求
此處所述的紋理取樣功能需要第 2 層的串流資源支援。
有關對應區域的著色器狀態意見反應
凡是讀取和/或寫入串流資源的任何著色器指示,都會啟用狀態資訊記錄。 這個狀態會以選擇性額外項目傳回值的方式,在每個傳送至 32 位元暫存器的資源存取指示上公開。 傳回值的內容會呈現不透明。 這表示,著色器程式不得直接讀取。 不過,您可以使用 CheckAccessFullyMapped 函式來擷取狀態資訊。
完整對應檢查
CheckAccessFullyMapped 函式會解譯叢記憶體存取傳回的狀態,並指出目前存取的所有資料是否都已在資源中對應。 如果資料已對應,CheckAccessFullyMapped 會傳回 true (0xFFFFFFFF),如果資料未對應,則會傳回 false (0x00000000)。
在篩選作業期間,指定紋理像素的加權有時會是 0.0。 其中一個範例,就是使用直接位於紋理像素中央的紋理座標進行線性取樣:有 3 個其他紋理像素 (至於這些紋理像素為何,則需視硬體而定) 會影響篩選,但其加權為 0。 這些 0 加權紋理像素完全不會影響篩選結果,因此,如果他們正好位於 NULL 並排,就不會視為未對應的存取。 請注意,相同的保證也適用於包含多個 Mipmap 的紋理篩選器;如果其中一個 Mip 對應上的紋理像素並未對應,但這些紋理像素的加權為 0,這些紋理像素就不會視為未對應的存取。
從少於 4 個元件的格式取樣時(例如DXGI_FORMAT_R8_UNORM),任何落在 NULL 圖格上的紋素都會報告 NULL 對應的存取權,而不論著色器實際查看結果中的元件為何。 舉例來說,從 R8_UNORM 進行讀取,並在使用 .gba/.yzw 的著色器中遮罩讀取結果,就完全不需要讀取紋理。 不過,如果紋理像素位址為 NULL 對應的並排,作業仍會視為 NULL 對應存取。
著色器可以檢查狀態,並於未通過時執行任何所需動作。 舉例來說,動作可包含記錄「遺失」(例如透過 UAV 寫入) 和/或發出另一個限縮在已知對應之廣泛 LOD 的讀取作業。 應用程式可能也想追蹤成功的存取,以便掌握已對應之一組並排中的哪個部分遭到存取。
記錄的其中一個複雜之處,在於沒有任何現存機制可回報遭到存取的確切並排組。 應用程式可根據用於存取的座標,並使用 LOD 指示來進行保守的猜測;舉例來說,tex2Dlod 就會傳回硬體 LOD 計算。
另一個複雜之處,在於許多存取都與相同的並排相關,因此,勢必會發生大量的冗餘記錄,且有可能造成記憶體爭用。 如果當並排已在其他地方回報存取時,硬體能選擇無需回報並排存取,一定會相當方便。 此類追蹤的狀態或許可透過 API (可能在框架界限) 加以重設。
每個樣本的 MinLOD 限縮
為了協助著色器避免已進行 Mipmap 之串流資源中已知的未對應區域,涉及使用取樣器 (篩選) 的多數著色器指示,都設有相關模式,能允許著色器將額外的 float32 MinLOD 限縮參數傳遞至紋理取樣。 與基礎資源不同的是,這個值會位於檢視的 Mipmap 數字空間中。
硬體會在發生每一資源 MinLOD 限縮之 LOD 計算中的相同位置 (這也會是 max()) 執行 max(fShaderMinLODClamp,fComputedLOD)
。
如果套用每一取樣 LOD 限縮和取樣器中所定義之其他任何 LOD 限縮的結果為空集合,則針對位於表面格式中的元件,結果就是與每一資源 minLOD clamp: 0 相同的超出範圍存取結果,而遺失的元件則為預設值。
早於此處所述之每一取樣 minLOD 限縮的 LOD 指示 (例如 tex2Dlod),會傳回限縮和未限縮的 LOD。 從這個 LOD 指示傳回的限縮 LOD,會反映所有限縮情況,當中包括每一資源限縮,但不包括每一取樣限縮。 無論如何,著色器都會控制並掌握每一取樣限縮,因此如有需要,著色器作者可將該限縮手動套用至 LOD 指示回傳的值。
最小值/最大值縮減篩選
應用程式可選擇管理自身的資料結構,以告知它們串流資源的對應會呈現何種樣貌。 包含紋理像素,以在串流資源中保留每個並排之資訊的表面,就是其中一例。 有些人可能會儲存在指定並排位置對應的 LOD。 只要使用與取樣串流資源相似的方式來謹慎取樣這個資料結構,即可探索整個紋理篩選量完全對應的最小 LOD 為何。 為了協助簡化這個過程,Direct3D 11.2 導入了新的一般用途取樣模式,名為「最小值/最大值篩選」。
適用於 LOD 追蹤的最小值/最大值篩選公用程式也有可能適用於其他用途,例如刪選深度表面。
最小值/最大值縮減篩選為取樣器上的其中一個模式,可擷取正常紋理篩選會擷取的同一組紋理像素。 不過,相較於混合值以產生解答,它會透過以元件為基礎的方式,傳回已擷取紋理像素的 min() 或 max() (例如在所有 G 值的最小值之外,另外傳回所有 R 值的最小值)。
最小值/最大值運算會遵循 Direct3D 的算數精確度規則。 比較的順序並不重要。
未進行最小值/最大值篩選時,指定紋理像素的加權有時會是 0.0。 其中一個範例,就是使用直接位於紋理像素中央的紋理座標進行線性取樣;在這個情況下,有 3 個其他紋理像素 (至於這些紋理像素為何,則需視硬體而定) 會影響篩選,但其加權為 0。 針對非最小值/最大值篩選上的任何 0 加權紋理像素,如果篩選為最小值/最大值,這些紋理像素仍舊不會影響結果 (而加權也不會對最小值/最大值篩選作業造成影響)。
這項功能的相關支援需仰賴串流資源的第 2 層支援。
相關主題