固定函式頂點處理 (Direct3D 9)
在固定函式頂點管線中,處理頂點緩衝區中的頂點會套用裝置目前的轉換矩陣。 您也可以選擇性地套用頂點作業,例如光源、產生剪輯旗標和更新範圍。 使用固定函式頂點處理時,修改目的地頂點緩衝區中的專案是由 D3DPV_DONOTCOPYDATA 旗標所控制。 此旗標僅適用于固定函式頂點處理。 IDirect3DDevice9介面會公開IDirect3DDevice9::P rocessVertices方法來處理頂點。 您可以呼叫 IDirect3DDevice9::P rocessVertices 方法,將頂點著色器中的頂點從頂點著色器處理到一組輸入資料流程,產生交錯頂點資料到目的地頂點緩衝區的單一資料流程。 方法接受五個參數,描述方法目標、目的地頂點緩衝區和處理選項的位置和數量。 呼叫之後,目的地緩衝區會包含已處理的頂點資料。
第一個、第二和第三個參數 SrcStartIndex、DestIndex 和 VertexCount 會分別反映要載入之第一個頂點的索引、將放置頂點之目的地緩衝區內的索引,以及要分別處理和放置於目的地緩衝區中的頂點總數。 第四個參數 pDestBuffer 應該設定為將接收來源頂點之頂點緩衝區物件的 IDirect3DVertexBuffer9 介面位址。 SrcStartIndex 參數會指定方法應該開始處理頂點的索引。
最後一個參數 Flags 會決定 方法的特殊處理選項。 您可以針對預設頂點處理將此參數設定為 0,或 D3DPV_DONOTCOPYDATA 在某些情況下將處理優化。 您也可以將D3DPV_DONOTCOPYDATA值與適用于目的地緩衝區的一或多個 D3DLOCK 值結合。 當您將旗標設定為 0 時,目的地頂點緩衝區頂點格式的頂點元件仍會從頂點著色器複製,或設定為 0。 不過,使用 D3DPV_DONOTCOPYDATA 時,除非 Direct3D 產生此資料, 否則 IDirect3DDevice9::P rocessVerticesVertices 不會覆寫目的地緩衝區中的色彩和紋理座標資訊。 啟用光源時會產生擴散色彩,也就是D3DRS_LIGHTING設為 TRUE。 啟用光源並啟用反射時,會產生反射色彩,也就是D3DRS_SPECULARENABLE和D3DRS_LIGHTING設定為 TRUE。 啟用模糊時,也會產生反射色彩。 啟用紋理轉換或紋理產生時,會產生紋理座標。 IDirect3DDevice9::P rocessVertices 會使用目前的轉譯狀態來判斷應該執行的頂點處理。
目的地頂點緩衝區的 FVF 使用量設定
IDirect3DDevice9::P rocessVertices方法需要目的地頂點緩衝區D3DFVF的特定設定。 FVF 使用方式設定必須與頂點處理的目前設定相容。
針對固定函式頂點處理, IDirect3DDevice9::P rocessVertices 需要 下列 FVF 設定:
- 位置類型一律 D3DFVF_XYZRHW ;因此,D3DFVF_XYZ 透過 D3DFVF_XYZB5 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 產生紋理座標時,應用程式必須執行下列動作:
- 使用目的地頂點緩衝區搭配適當的 FVF 使用方式。
- 根據後置處理紋理座標的位置,重新建構紋理階段的D3DTSS_TEXCOORDINDEX。 請注意,在後續 的 IDirect3DDDevice9::D rawPrimitive 和 IDirect3DDevice9::D rawIndexedPrimitive 呼叫中使用處理頂點緩衝區時,就會重新編譯D3DTSS_TEXCOORDINDEX設定。
最後,必須以下列方式設定紋理座標座標維度 (透過D3DFVF_TEX8 ) D3DFVF_TEX0 :
- 針對每個紋理座標集,如果停用紋理轉換和紋理產生,則輸出紋理座標維度必須符合輸入。 如果啟用紋理轉換,則輸出維度必須符合D3DTTFF_COUNT1、D3DTTFF_COUNT2、D3DTTFF_COUNT3或D3DTTFF_COUNT4設定所定義的計數。 如果已停用紋理轉換並啟用紋理產生,則輸出維度必須符合紋理產生模式的設定;目前所有模式都會產生三個浮點數。
IDirect3DDevice9::P rocessVertices失敗時,因為目的地頂點緩衝區 FVF 程式碼不相容,預期的程式碼只會列印到偵錯輸出 (偵錯組建) 。
相關主題