使用 HLSL 最小有效位數

從Windows 8開始,圖形驅動程式可以使用大於或等於其指定位精確度的任何有效位數,實作最小有效位數HLSL 純量資料類型。 當您的 HLSL 最小精確度著色器程式碼用於實作 HLSL 最小精確度的硬體上時,您會使用較少的記憶體頻寬,因此您也會使用較少的系統電源。

您可以使用D3D11_FEATURE_SHADER_MIN_PRECISION_SUPPORT值呼叫ID3D11Device::CheckFeatureSupport,以查詢圖形驅動程式所提供的最小精確度支援。 如需詳細資訊,請參閱 HLSL 最小有效位數支援

宣告具有最小有效位數資料類型的變數

若要在 HLSL 著色器程式碼中使用最小精確度,請宣告具有 min16float (min16float4 等類型的個別變數,以取得向量) 、 min16intmin10float等等。 使用這些變數時,您的著色器程式碼表示它不需要比變數所指出的精確度還要高。 但硬體可以忽略最小精確度指標,並以完整的 32 位有效位數執行。 當您在利用最小精確度的硬體上使用著色器程式碼時,您會使用較少的記憶體頻寬,因此,只要著色器程式碼不預期比指定的精確度還要高,您也會使用較少的系統電源。

您不需要撰寫多個執行且不使用最小精確度的著色器。 相反地,如果圖形驅動程式報告它不支援任何最小精確度,則建立具有最小精確度的著色器,而最小有效位數變數的行為會是完整的 32 位有效位數。 HLSL 最小有效位數著色器無法在早于Windows 8的作業系統上運作,因此如果您打算以較早的作業系統為目標,則必須撰寫多個著色器,其中有些是這麼做,有些則不使用最小精確度。

注意

請勿在著色器內的不同有效位數層級之間切換資料,因為這些轉換類型很浪費且可降低效能。 例外狀況是著色器常數仍然一律為 32 位,但廠商可以設計圖形硬體,以自由地轉換成 HLSL 指令讀取可能使用的任何較低精確度。

 

藉由使用最小精確度,您可以在著色器程式碼的各個部分控制計算的精確度。

HLSL 最小有效位數的規則類似于 C/C++,其中運算式中的類型會決定作業的有效位數,而不是最終寫入的類型。

測試最小精確度著色器程式碼

參考轉譯器 (D3D_DRIVER_TYPE_REFERENCE) 可讓您大致瞭解 HLSL 著色器程式碼中最小精確度的行為,方法是將每個 HLSL 指令量化為指定的精確度。 這可協助您探索不小心依賴低於最小精確度的程式碼。 當您的 HLSL 著色器程式碼使用最小精確度時,參考轉譯器不會執行更快,但您可以使用它來驗證程式代碼的正確性。 WARP (D3D_DRIVER_TYPE_WARP) 不支援在 HLSL 著色器程式碼中使用最小精確度;WARP 只會以完整的 32 位精確度執行。

HLSL 的程式設計指南