共用方式為


固定函式頂點處理 (Direct3D 9)

在固定函式頂點管線中,處理頂點緩衝區中的頂點會套用裝置目前的轉換矩陣。 您也可以選擇性地套用頂點作業,例如光源、產生裁剪旗標和更新範圍。 使用固定函式頂點處理時,修改目的地頂點緩衝區中的專案是由 D3DPV_DONOTCOPYDATA 旗標所控制。 此旗標僅適用於固定函式頂點處理。 IDirect3DDevice9 介面會公開 IDirect3DDevice9::P rocessVertices 方法來處理頂點。 您可以藉由呼叫 IDirect3DDevice9::P rocessVertices 方法,將頂點著色器中的頂點從頂點著色器處理到輸入數據流集,以產生單一交錯頂點數據到目的地頂點緩衝區的數據流。 方法接受五個參數,描述方法目標的位置和頂點數量、目的地頂點緩衝區和處理選項。 呼叫之後,目的地緩衝區會包含已處理的頂點數據。

第一個、第二個和第三個參數 SrcStartIndex、DestIndex 和 VertexCount 會反映要載入之第一個頂點的索引、要放置頂點的目的地緩衝區內的索引,以及要分別在目的地緩衝區中處理和放置的頂點總數。 第四個參數 pDestBuffer 應設定為接收來源頂點之頂點緩衝區物件的 IDirect3DVertexBuffer9 介面位址。 SrcStartIndex 參數會指定方法應該開始處理頂點的索引。

最後一個參數 Flags 會決定 方法的特殊處理選項。 您可以針對預設頂點處理將此參數設定為 0,或設定為 D3DPV_DONOTCOPYDATA 在某些情況下將處理優化。 您也可以將D3DPV_DONOTCOPYDATA值與適用於目的地緩衝區的一或多個 D3DLOCK 值結合。 當您將 Flags 設定為 0 時,目的地頂點緩衝區頂點格式的頂點元件仍會從頂點著色器複製,或設定為 0。 不過,使用D3DPV_DONOTCOPYDATA時,除非 Direct3D 產生此數據,否則 IDirect3DDevice9::P rocessVertices 不會覆寫目的地緩衝區中的色彩和紋理座標資訊。 啟用光源時會產生擴散色彩,也就是說,D3DRS_LIGHTING設為 true 。 啟用光源並啟用反射時會產生反射色彩,也就是說,D3DRS_SPECULARENABLE和D3DRS_LIGHTING會設定為 true 。 啟用霧時,也會產生反射色彩。 啟用紋理轉換或紋理產生時,會產生紋理座標。 IDirect3DDevice9::P rocessVertices 會使用目前的轉譯狀態來判斷應該執行的頂點處理。

目的地頂點緩衝區的 FVF 使用量設定

IDirect3DDevice9::P rocessVertices 方法需要目的地頂點緩衝區 D3DFVF 的特定設定。 FVF 使用方式設定必須與頂點處理的目前設定相容。

針對固定函式頂點處理,IDirect3DDevice9::P rocessVertices 需要下列 FVF 設定:

  • 位置類型一律 D3DFVF_XYZRHW ;因此,透過 D3DFVF_XYZB5 D3DFVF_XYZ和 D3DFVF_XYZB1 無效。
  • 不得設定 D3DFVF_NORMAL、D3DFVF_RESERVED0和D3DFVF_RESERVED2旗標。
  • 如果下列條件的 OR 作業傳回 true,則必須設定 D3DFVF_DIFFUSE 旗標:
    • 已啟用光源;也就是說,D3DRS_LIGHTING TRUE
    • 光源已停用,擴散色彩會出現在輸入頂點數據流中,且未設定 D3DPV_DONOTCOPYDATA
  • 如果下列條件的 OR 作業傳回 true,則必須設定 D3DFVF_SPECULAR 旗標:
    • 已啟用光源,並啟用反射色彩;也就是說,D3DRS_SPECULARENABLE TRUE
    • 光源已停用,輸入頂點數據流中會出現反射色彩,且未設定 D3DPV_DONOTCOPYDATA
    • 已啟用頂點霧;也就是說,D3DRS_FOGVERTEXMODE未設定為 D3DFOG_NONE。

此外,紋理座標計數必須以下列方式設定:

  • 如果所有使用中紋理階段的紋理轉換和紋理產生都停用,且未設定 D3DPV_DONOTCOPYDATA,則需要輸出紋理座標的數目和類型,才能符合輸入頂點紋理坐標的數目和類型。 如果已設定D3DPV_DONOTCOPYDATA且紋理轉換和紋理產生已停用,則會忽略輸出紋理座標。
  • 如果啟用任何使用中紋理階段的紋理轉換或紋理產生,輸出頂點可能需要包含比輸入頂點更多的紋理座標集。 這是因為紋理座標從紋理產生或紋理轉換衍生所產生的座標擴散。 請注意,在 IDirect3DDevice9::D rawPrimitive 呼叫期間,紋理座標的類似激增,但應用程式程式設計人員看不到。 在此情況下,Direct3D 會產生一組新的紋理座標。 新的紋理座標集是透過逐步執行紋理階段,並分析紋理產生、紋理轉換和紋理座標索引的設定,以判斷該階段是否需要一組唯一的紋理座標來衍生。 每次需要新的集合時,都會依遞增順序進行配置。 請注意,每個階段的最大值和一般需求是一個設定,不過這可能是因為透過D3DTSS_TEXCOORDINDEX共用非轉譯紋理座標而減少。

因此,對於每個紋理階段,如果紋理系結至該階段,且下列任何一個條件都成立,就會產生一組新的紋理座標:

  • 已針對該階段啟用紋理產生。
  • 已針對該階段啟用紋理轉換。
  • 第一次透過D3DTSS_TEXCOORDINDEX參考非轉譯的輸入紋理座標。

當 Direct3D 產生紋理座標時,應用程式必須執行下列動作:

  1. 使用目的地頂點緩衝區搭配適當的 FVF 使用方式。
  2. 根據處理後紋理座標的位置,重新程式設計紋理階段的D3DTSS_TEXCOORDINDEX。 請注意,在後續 IDirect3DDevice9::D rawPrimitiveIDirect3DDevice9::D rawIndexedPrimitive 呼叫時,會發生D3DTSS_TEXCOORDINDEX設定的重新程式化。

最後,紋理座標維度(D3DFVF_TEX0 到D3DFVF_TEX8)必須以下列方式設定:

  • 針對每個紋理座標集,如果已停用紋理轉換和紋理產生,則輸出紋理座標維度必須符合輸入。 如果啟用紋理轉換,則輸出維度必須符合D3DTTFF_COUNT1、D3DTTFF_COUNT2、D3DTTFF_COUNT3或D3DTTFF_COUNT4設定所定義的計數。 如果已停用紋理轉換並啟用紋理產生,則輸出維度必須符合紋理產生模式的設定:目前所有模式都會產生三個浮點數值。

IDirect3DDevice9::P rocessVertices 因為目的地頂點緩衝區 FVF 程式代碼不相容而失敗時,預期的程式代碼會列印到偵錯輸出(僅限偵錯組建)。

頂點緩衝區