將 FVF 程式碼對應至 Direct3D 9 宣告 (Direct3D 9)
下表會將 FVF 程式碼對應至 D3DVERTEXELEMENT9 結構。
FVF | 資料類型 | 使用方式 | 使用量索引 |
---|---|---|---|
D3DFVF_XYZ | D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_POSITION | 0 |
D3DFVF_XYZRHW | D3DDECLTYPE_FLOAT4 | D3DDECLUSAGE_POSITIONT | 0 |
D3DFVF_XYZW | D3DDECLTYPE_FLOAT4 | D3DDECLUSAGE_POSITION | 0 |
D3DFVF_XYZB5和D3DFVF_LASTBETA_UBYTE4 | D3DVSDT_FLOAT3、D3DVSDT_FLOAT4、D3DVSDT_UBYTE4 | D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_XYZB5和D3DFVF_LASTBETA_D3DCOLOR | D3DVSDT_FLOAT3、D3DVSDT_FLOAT4、D3DVSDT_D3DCOLOR | D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_XYZB5 | D3DDECLTYPE_FLOAT3、D3DDECLTYPE_FLOAT4、D3DDECLTYPE_FLOAT1 | D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_XYZBn (n=1..4) | D3DDECLTYPE_FLOAT3,D3DDECLTYPE_FLOATn | D3DDECLUSAGE_POSITION,D3DDECLUSAGE_BLENDWEIGHT | 0 |
D3DFVF_XYZBn (n=1..4) 和 D3DFVF_LASTBETA_UBYTE4 | D3DDECLTYPE_FLOAT3,D3DDECLTYPE_FLOAT (n-1) ,D3DDECLTYPE_UBYTE4 | D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_XYZBn (n=1..4) 和 D3DFVF_LASTBETA_D3DCOLOR | D3DDECLTYPE_FLOAT3,D3DDECLTYPE_FLOAT (n-1) ,D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_NORMAL | D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_NORMAL | 0 |
D3DFVF_PSIZE | D3DDECLTYPE_FLOAT1 | D3DDECLUSAGE_PSIZE | 0 |
D3DFVF_DIFFUSE | D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_COLOR | 0 |
D3DFVF_SPECULAR | D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_COLOR | 1 |
D3DFVF_TEXCOORDSIZEm (n) | D3DDECLTYPE_FLOATm | D3DDECLUSAGE_TEXCOORD | n |
具有 D3DDECLUSAGE_POSITIONT 的頂點宣告
具有 (D3DUSAGE_POSITIONT、0) 的頂點元素存在,可用來向裝置指出傳入的頂點資料已經通過頂點處理 (,例如已設定D3DFVF_XYZRHW位的 FVF) 。 在繪製階段,如果目前 set 宣告有具有 (D3DUSAGE_POSITIONT、0) 語意的專案,則會略過整個頂點處理 (就像已設定具有 D3DFVF_XYZRHW 位的 FVF) 一樣。
頂點宣告有一些限制, (D3DDECLUSAGE_POSITIONT,0) :
- 這類宣告中只能使用資料流程零。
- 頂點元素必須藉由增加資料流程位移來排序。
- 資料流程位移必須對齊 DWORD。
- 相同的 (使用量、使用量索引) 組應該只列出一次。
- 只能使用D3DDECLMETHOD_DEFAULT方法。
- 其他頂點元素不能有 (D3DDECLUSAGE_POSITION,0) 語意。
此外,與設備磁碟機版本相關的這類宣告有一些限制。 這些限制生效,因為 Direct3D 會將這類宣告直接傳送至驅動程式,而不需要進行任何轉換。
不含D3DDECLUSAGE_POSITIONT的頂點宣告
執行時間會驗證宣告的建立。 以下是什麼是合法宣告的一般規則。
- 資料流程的所有頂點元素都必須是連續的,並依位移排序。
- 資料流程位移必須對齊 DWORD。
- 相同的 (使用量、使用量索引) 組應該只列出一次。
- 如果已設定D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET,則
- 多個頂點元素可以在資料流程中共用相同的位移。
- 頂點元素可以是不同大小的不同類型。
- 頂點元素可以任意重迭。 例如,某個元素可以同時在另一個專案中間的資料流程位置開始。
- 頂點元素可以任意順序具有資料流程位移。
- 頂點元素的數目不能大於 64。
- UsageIndex 應位於 [0-15] 範圍內。
- 搭配 DrawPrimitive API 使用的宣告不應該有D3DDECLMETHOD_DEFAULT、D3DDECLMETHOD_LOOKUPPRESAMPLED或D3DDECLMETHOD_LOOKUP以外的頂點元素。
- 包含D3DDECLMETHOD_LOOKUP或 LOOKUPPRESAMPLED 的宣告應該只與可程式化的頂點管線搭配使用。
- 搭配 DrawRectPatch/DrawTriPatch API 使用的宣告不能有具有D3DDECLMETHOD_LOOKUPPRESAMPLED或D3DDECLMETHOD_LOOKUP的頂點元素。
- 宣告應該只有一個具有 D3DDECLMETHOD_LOOKUP 或 D3DDECLMETHOD_LOOKUPPRESAMPLED 方法的專案。
- 具有D3DDECLMETHOD_LOOKUP或D3DDECLMETHOD_LOOKUPPRESAMPLED的宣告不應該有D3DDECLMETHOD_DEFAULT以外的元素,因為位移對應只會針對 N 修補程式完成。
- 具有D3DDECLMETHOD_LOOKUP或D3DDECLMETHOD_LOOKUPPRESAMPLED的頂點元素只能與 (D3DDECLUSAGE_SAMPLE搭配使用,n) 語意,反之亦然。
- 如果具有 D3DDECLMETHOD_LOOKUP 方法的頂點元素具有已經存在頂點元素的資料流程索引和位移,這個頂點元素應該具有相同的資料類型。
- 具有 D3DDECLMETHOD_LOOKUP 方法的頂點元素應該具有 D3DDECLTYPE_FLOAT2/3/4 資料類型
- 具有類型D3DDECLMETHOD_CROSSUV、D3DDECLMETHOD_PARTIALU和D3DDECLMETHOD_PARTIALV的頂點元素應該具有相容資料類型的頂點元素位移。
- 具有 方法的頂點元素D3DDECLMETHOD_UV或D3DDECLMETHOD_LOOKUPPRESAMPLED必須具有類型D3DDECLTYPE_UNUSED、資料流程索引零和資料流程位移零。
- 具有方法的宣告D3DDECLMETHOD_UV、D3DDECLMETHOD_PARTIALU和D3DDECLMETHOD_PARTIALV只能搭配 DrawRectPatch 使用。
- 使用方式D3DDECLUSAGE_TESSFACTOR應該只搭配資料類型使用D3DDECLTYPE_FLOAT1和使用方式索引 0。
- 當宣告用於鑲嵌式 (DrawRectPatch、DrawTriPatch、N 修補程式) 時,資料類型必須小於或等於D3DDECLTYPE_SHORT4。
- 包含需要特定裝置功能之方法的宣告 (,例如,位移對應、RT 修補程式) 只能在裝置支援時建立。
- 用來繪製點和線條的頂點宣告不能有D3DDECLMETHOD_DEFAULT以外的方法。
- 可以建立的宣告也取決於驅動程式功能。
驅動程式考慮
Direct3D 9 驅動程式
- 輸入宣告必須可轉譯為有效的 FVF (具有相同的頂點元素順序及其資料類型) 。
- 不允許紋理座標中的間距。 這表示如果有具有 (D3DDECLUSAGE_TEXCOORD 的頂點元素,n) 則也應該有具有 (D3DDECLUSAGE_TEXCOORD 的頂點元素,n-1) 。
沒有圖元著色器第 3 版支援的 Direct3D 9 驅動程式
- 輸入宣告必須可轉譯為有效的 FVF (具有相同的頂點元素順序及其資料類型) 。
- 允許紋理座標中的間距。
具有圖元著色器第 3 版支援的 Direct3D 9 驅動程式
允許更一般宣告。
- 頂點元素可以任意順序,而且可以有任何資料類型。
- 如果裝置設定了D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET,多個頂點元素可以共用相同的資料流程位移,而且在同一時間是不同類型的。
具有可程式化頂點管線的頂點宣告使用方式
- 在繪製時,Direct3D 會在目前的頂點宣告和目前的頂點著色器函式中尋找相同的「使用量 - 使用量索引」組合。 找到組合時,會使用著色器函式 DCL 的暫存器作為頂點元素的目的地。
- 當目前頂點宣告中的頂點專案具有目前頂點著色器中找不到的用法時,則會忽略該頂點元素。
- 使用小於 2.0 的頂點著色器版本時,著色器程式碼中提及的所有語意都必須出現在繪製時間系結的宣告中。 使用頂點著色器 2.0 和更新版本時,此限制可讓應用程式使用相同的頂點著色器使用不同的頂點宣告不存在。 當頂點著色器根據靜態條件讀取輸入資料時,這會很有用。 頂點著色器暫存器未初始化,因為這樣會有未定義的值。
在 DirectX 8 驅動程式上搭配硬體頂點處理時,還有其他限制:
- 頂點元素無法重迭或共用相同的位移。
- 資料類型僅限於 DirectX 8 驅動程式可以瞭解的內容。
如果提供的宣告無法轉換成 DirectX 8 樣式宣告,CreateVertexDeclaration 可能會失敗。 針對混合模式裝置,此失敗會在 Draw* 時間發生,因為這是唯一的時間,知道此著色器是否與硬體或軟體頂點處理搭配使用。
具有固定函式管線的頂點宣告使用方式
只能使用符合下列規則的宣告:
- DirectX 8 宣告中不應有頂點元素之間的間距 (SKIP,此宣告用於固定函式管線) 。
- 必須指定語意 (D3DDECLUSAGE_POSITION、0) ,而且應該具有D3DDECLTYPE_FLOAT3資料類型。
- 具有方法D3DDECLMETHOD_UV的頂點元素必須指定使用方式D3DDECLUSAGE_TEXCOORD或D3DDECLUSAGE_BLENDWEIGHT。
- 具有方法D3DDECLMETHOD_PARTIALU、_PARTIALV或_CROSSUV的頂點元素只能與D3DDECLUSAGE_POSITION、_NORMAL、_BLENDWEIGHT或_TEXCOORD搭配使用,而且必須使用輸入類型D3DDECLTYPE_FLOAT3。
當宣告搭配 DirectX 8 驅動程式上的硬體頂點處理使用時,Direct3D 執行時間會以下列規則將它轉換成 DirectX 8 樣式宣告:
- 頂點元素無法在資料流程中共用相同的位移,而且不能重迭。
- 資料類型必須小於或等於D3DDECLTYPE_SHORT4。
- 只允許下列方法:D3DDECLMETHOD_DEFAULT、D3DDECLMETHOD_CROSSUV和D3DDECLMETHOD_UV
- Direct3D 9 宣告與 Direct3D 8 宣告之間的對應 (Direct3D 9) 顯示可轉換成 DirectX 8 樣式宣告的 Direct3D 9 語意。 Usage 和 UsageIndex 會轉換成暫存器值。
- 如果宣告中有 n 個頂點元素,且 0 - m (m < n) 對應至 Direct3D 宣告與 FVF 程式碼 (Direct3D 9) ) 中所述的 FVF (元素,則 m + 1 不會執行下列作業:
- 如果 m + 2 的任何一個直到 n - 1 個頂點元素對應至 FVF/dx8decl,則宣告無效。
- DirectX 8 和較舊驅動程式的執行時間會將 0 到 m 的專案 (轉換, 和 由 Direct3D 9 驅動程式) 使用 Direct3D 宣告與 FVF 代碼之間的對應 (Direct3D 9) 、m + 1、m + 2 直到 n - 1 會對應至連續的 texcoord (k) ,texcoord (k+1) , 從元素 0 - m 中的任何texcoord 開始。
- 對應 texcoord 上的資料類型假設為 float[1234],取代目前元素包含的任何資料類型 (,但大小相同) 。 因此,現有的資料類型可以是不在 Direct3D 宣告與 FVF 程式碼之間的對應中, (Direct3D 9) 。
- 如果 k 達到 8,則 FVF/dx8decl 的宣告無效。
- 如果發生任何與texcoord 的對應,則整個宣告都必須沒有具有 DEFAULT 以外的產生方法的專案,或宣告對 FVF/dx8decl 無效。
搭配 ProcessVertices 使用頂點宣告
頂點宣告可用來描述 ProcessVertices 的輸出。 這類宣告應遵守下列規則:
- 只能使用資料流程 0。
- 只允許D3DDECLMETHOD_DEFAULT方法。
- 只能使用D3DDECLTYPE_FLOATn或D3DDECLTYPE_D3DCOLOR資料類型。
- 頂點元素無法共用相同的位移或彼此重迭。
- 不需要具有 (D3DDECLUSAGE_POSITION、0) 或 (D3DDECLUSAGE_POSITIONT,0) 的頂點元素。
- 具有 (D3DDECLUSAGE_POSITION、0) 和 (D3DDECLUSAGE_POSITIONT,0) 的頂點元素不能出現在相同的宣告中。
- 使用這類宣告時,目前的頂點著色器必須是 3.0 版或更新版本。
相關主題