共用方式為


使用 HLSL 最小精確度

從 Windows 8 開始,圖形驅動程式可以透過使用不低於其指定位元精確度的方式,實作最小精確度 HLSL 純量數據類型。 當您的 HLSL 最小精確度著色器程式代碼用於實作 HLSL 最小精確度的硬體時,您會使用較少的記憶體頻寬,因此您也會使用較少的系統電源。

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

宣告使用最低所需精度的數據類型的變數

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

您不需要撰寫多個有或沒有使用最小精確度的著色器。 相反地,如果圖形驅動程序報告它不支援任何最小有效位數,請改為建立具有最小精確度的著色器,且最小有效位數變數會以完整的 32 位有效位數運作。 HLSL 最小精確度著色器無法在 Windows 8 之前的操作系統上運作,因此如果您計畫針對較舊版本的作業系統,則需要撰寫多個著色器,其中一部分使用最小精確度,另一部分則不使用。

注意

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

 

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

HLSL 的最小精確度規則類似於 C/C++,在這裡,運算式中的型別決定了作業的精確度,而不是最終將要寫入的型別。

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

參考光柵化器(D3D_DRIVER_TYPE_REFERENCE)可幫助您瞭解在 HLSL 著色器程式代碼中,當每個 HLSL 指令量化至指定精確度時,最低精準度的行為方式。 這有助於您發現可能不小心依賴於比最低精確度更高精確度的程式代碼。 當您的 HLSL 著色器程式代碼使用最小精確度時,參考轉譯器不會執行得更快,但您可以使用它來驗證程式碼的正確性。 WARPD3D_DRIVER_TYPE_WARP) 不支援在 HLSL 著色器程式代碼中使用最小精確度;WARP 只會以完整的 32 位精確度執行。

HLSL 程序設計指南