共用方式為


ps_1_1__ps_1_2__ps_1_3__ps_1_4緩存器

圖元著色器相依於緩存器來取得頂點數據、輸出圖元數據、在計算期間保存暫存結果,以及識別紋理取樣階段。 有數種類型的緩存器,每個緩存器都有獨特的功能。 本節包含圖元著色器版本所實作之輸入和輸出緩存器的參考資訊,1_X。

註冊數據以供圖元著色器使用。 下列各節會完整說明緩存器。

  • 緩存器類型描述可用的四種緩存器類型及其用途。
  • 讀取埠限制詳細說明在單一指令中使用多個緩存器的限制。
  • 唯讀讀寫描述哪些緩存器可用於讀取、寫入或兩者。
  • 範圍會詳細說明元件數據的範圍。

緩存器類型

名字 類型 版本 1_1 版本 1_2 版本 1_3 版本 1_4
c# 常數快取器 8 8 8 8
r# 暫存緩存器 2 2 2 6
t# 紋理快取器 4 4 4 6
v# 色彩快取器 2 2 2 階段 2 中的 2

 

  • 常數快取器包含常數數據。 數據可以使用 SetPixelShaderConstantF 載入常數緩存器,也可以使用 def - ps 定義。 常數快取器無法透過紋理位址指示使用。 唯一的例外是 texm3x3spec - ps 指令,它會使用常數緩存器來提供眼光向量。

  • 暫存快取器可用來儲存中繼結果。 r0 也做為圖元著色器輸出。 著色器結尾的 r0 值是著色器的像素色彩。

    在嘗試從先前指令尚未撰寫之暫存緩存器讀取的任何著色器上,著色器驗證會失敗 CreatePixelShader D3DXAssembleShader 同樣會失敗,假設已啟用驗證(請勿使用 D3DXSHADER_SKIPVALIDATION)。

  • 紋理快取器

    針對圖元著色器 1_1 到 1_3 版,紋理緩存器包含紋理數據或紋理座標。 取樣紋理時,紋理數據會載入紋理緩存器。 紋理取樣會使用紋理座標來查閱或取樣指定的 (u,v,w,q) 座標的色彩值,同時考慮紋理階段狀態屬性。 紋理座標數據會從頂點紋理座標數據插補,並與特定紋理階段相關聯。 紋理階段編號與紋理座標宣告順序之間有預設的一對一關聯。 根據預設,以頂點格式定義的第一組紋理座標會與紋理階段 0 相關聯。

    針對這些圖元著色器版本,紋理緩存器的行為就像算術指令使用時的暫存緩存器一樣。

    針對圖元著色器 1_4 版,紋理緩存器 (t#) 包含唯讀紋理座標數據。 這表示紋理座標集和紋理階段編號彼此獨立。 紋理階段編號(從中取樣紋理)是由目的地緩存器號碼(r0 到 r5) 決定。 針對 texld 指令,紋理座標集是由來源緩存器 (t0 到 t5) 決定,因此紋理座標集可以對應至任何紋理階段。 此外,texld 的來源緩存器(指定紋理座標)也可以是暫存緩存器(r#),在此情況下,暫存緩存器的內容會當做紋理座標使用。

  • 色彩快取器包含每個圖元的色彩值。 這些值是透過頂點數據中擴散和反射色彩值的個別圖元反覆運算來取得。 針對圖元著色器 1_4 版著色器,只有在第二個階段才可使用色彩緩存器。

    如果陰影模式設定為D3DSHADE_FLAT,則會停用兩個頂點色彩的反覆專案(擴散和反射)。 不論陰影模式為何,如果已啟用圖元霧,管線仍會逐一查看霧。 請記住,管線中稍後會套用霧,而不是圖元陰影器。

    通常會使用頂點擴散色彩數據載入 v0 快取器。 使用頂點反射色彩數據載入 v1 緩存器也是常見的。

    輸入色彩數據值會限制為範圍0到1,因為這是像素著色器中色彩快取器的有效輸入範圍。

    圖元著色器具有色彩緩存器的唯讀存取權。 這些緩存器的內容會逐一查看值,但反覆專案可能會以比紋理座標低得多的精確度執行。

讀取埠限制

讀取埠限制會指定每個緩存器類型的不同緩存器數目,這些緩存器可在單一指令中當做來源緩存器使用。

名字 類型 版本 1_1 版本 1_2 版本 1_3 版本 1_4
c# 常數快取器 2 2 2 2
r# 暫存緩存器 2 2 2 3
t# 紋理快取器 2 3 3 1
v# 色彩快取器 2 2 2 階段 2 中的 2

 

例如,幾乎所有版本的色彩緩存器都有兩個讀取埠限制。 這表示單一指令最多可以使用兩個不同的色彩快取器(例如 v0 和 v1)作為來源緩存器。 這個範例顯示相同指令中使用的兩個色彩快取器:

mad r0, v1, c2, v0

唯讀、讀取/寫入

緩存器類型會根據下表中的唯讀 (RO) 功能或讀取/寫入功能來識別。 唯讀快取器只能當做指令中的來源緩存器使用;它們永遠不能當做目的地緩存器使用。

名字 類型 版本 1_1 版本 1_2 版本 1_3 版本 1_4
名字 類型 1_1 1_2 1_3 1_4
c# 常數快取器 RO RO RO RO
r# 暫存緩存器 烏爾曼 烏爾曼 烏爾曼 烏爾曼
t# 紋理快取器 烏爾曼 烏爾曼 烏爾曼 請參閱下列注意事項
v# 色彩快取器 RO RO RO RO

 

支援 RW 的緩存器可用來儲存中繼結果。 這包括某些著色器版本的暫存緩存器和紋理緩存器。

注意

  • 針對圖元著色器 1_4 版,紋理緩存器是用於紋理尋址指令的 RO,而且紋理緩存器既無法讀取,也不能由算術指令寫入。 此外,由於紋理緩存器已變成紋理座標緩存器,因此具有 RO 存取不是先前功能的回歸。

 

範圍

範圍是最大和最小緩存器數據值。 範圍會根據緩存器的類型而有所不同。 您可以使用 getDeviceCaps ,從裝置上限查詢部分緩存器的範圍。

名字 類型 範圍 版本
c# 常數快取器 -1 到 +1 所有版本
r# 暫存緩存器 - PixelShader1xMaxValue 至 + PixelShader1xMaxValue 所有版本
t# 紋理快取器 - MaxTextureRepeat 至 + MaxTextureRepeat 所有版本
v# 色彩快取器 0 到 1 所有版本

 

早期圖元著色器硬體代表使用固定點數位的緩存器中的數據。 這會將數位小數部分的精確度限制在大約8位。 設計著色器時請記住這點。

針對圖元著色器 1_1 到 1_3 版,MaxTextureRepeat 必須至少為一個。 針對 1_4,MaxTextureRepeat 必須至少為 8。

如需 PixelShader1xMaxValue 的詳細資訊,請參閱 D3DCAPS9

快取器