頂點聲明
從概念上講,頂點聲明是對頂點直接內存訪問(DMA)以及圖形流水線的
tessellator
引擎進行編程的一種方法。頂點聲明簡要地表示了數據的布局及
tessellator
操作。為了解決Microsoft? DirectX? 8.x中頂點聲明的復雜性和可擴展性,9.0版引入了用來表示頂點數據流的新格式。
頂點著色器和頂點聲明不再是在CreateVertexShader的時候綁定在一起。對著色器的驗證已經被分成兩部分,一部分在頂點著色器創建時執行,另一部分在DrawPrimitive時執行。頂點著色器和頂點聲明都由相應的對象表示。
Decls
不再用DWORD流表示。它們現在用一個D3DVERTEXELEMENT9結構的數組表示。數組中的每個元素描述一個頂點元素。
另外,為了解決API的可用性問題,9.0版增加了一個與SetVertexDeclaration調用等價的SetFVF調用。這是一個有用的函數,當調用這個函數時,新的FVF會取代當前的頂點聲明,反之亦然。如果驅動程序是DirectX 8.0之前的版本(NumStream為0),那么對于那些不能被轉換成彈性頂點格式(FVF)的頂點聲明,SetVertexDeclaration可能會失敗并返回錯誤碼。SetFVF既能用于固定功能頂點流水線,又能用于可編程頂點流水線。在內部,系統會根據把FVF映射到DirectX 9.0中的Decl中定義的規則,把FVF碼轉換為頂點著色器聲明。在編寫頂點著色器函數中的DCL命令時,應該緊記這一點。因為這個轉換的關系,所有后面的討論將僅限于頂點聲明。
D3DVERTEXELEMENT9結構
以下是D3DVERTEXELEMENT9結構中的域以及說明。
-
Stream(數據流) - 數據流的編號,當前域會從該編號的數據流中讀取。
-
Offset(偏移量) - 偏移量,表示當前域從哪里開始讀取,以字節為單位。
-
Type(類型) - 輸入數據的類型,以及數據在傳入頂點著色器的寄存器時如何轉換格式,也就是,float1,float2,short2n等等。輸出的類型由方法決定,有些方法有隱式的輸入類型。
-
Method(方法) - 將由tessellator(或任何程序化的幾何函數)對指定的輸入執行的任何預定義操作。
-
D3DDECLMETHOD_DEFAULT: 當使用tessellator時,這個元素被插值或復制到頂點處理器的輸入寄存器中。這個操作的輸入可以是任何類型。這個操作的輸出類型與輸入相同。
-
D3DDECLMETHOD_PARTIALU: 計算rectangular patch(R-patch)上某一點在U方向上的正切值。這個操作的輸入類型可以是D3DDECLTYPE_FLOAT[43],D3DDECLTYPE_D3DCOLOR,D3DDECLTYPE_UBYTE4,或D3DDECLTYPE_SHORT4。這個操作的輸出類型總是D3DDECLTYPE_FLOAT3。
-
D3DDECLMETHOD_PARTIALV: 計算R-patch上某一點在V方向上的正切值。這個操作的輸入類型可以是D3DDECLTYPE_FLOAT[43],D3DDECLTYPE_D3DCOLOR,D3DDECLTYPE_UBYTE4,D3DDECLTYPE_SHORT4。這個操作的輸出類型總是D3DDECLTYPE_FLOAT3。
-
D3DDECLMETHOD_CROSSUV: 通過求兩個正切值的叉積計算rect/tri patches(RT-patch)上某一點的法向。這個操作的輸入類型可以是D3DDECLTYPE_FLOAT[43],D3DDECLTYPE_D3DCOLOR,D3DDECLTYPE_UBYTE4,或D3DDECLTYPE_SHORT4。這個操作的輸出類型總是D3DDECLTYPE_FLOAT3。
-
D3DDECLMETHOD_UV: 復制RT-patch上某一點的U,V值,產生一個二維浮點數。這個操作的輸入類型必須被設為D3DDECLTYPE_UNUSED。這個操作的輸出類型總是D3DDECLTYPE_FLOAT2。輸入數據流和偏移量也沒有用到(但必須被設為0)。
-
D3DDECLMETHOD_LOOKUP: 查找一個位移貼圖。輸入類型可以是D3DDECLTYPE_FLOAT[234]。只有.x和.y成員被用于紋理貼圖查找。這個操作的輸出類型總是D3DDECLTYPE_FLOAT4。只有設備支持位移貼圖時才能使用這個方法。這個方法只能和D3DDECLUSAGE_SAMPLE一起使用。
-
D3DDECLMETHOD_LOOKUPPRESAMPLED: 查找一個預取樣的位移貼圖。輸入類型、流索引值和流偏移量都沒有用到(類型必須被設為D3DDECLTYPE_UNUSED,數據流和偏移量必須被設為0)。這個操作的輸出類型總是D3DDECLTYPE_FLOAT4。只有設備支持位移貼圖時才能使用這個方法。這個方法只能和D3DDECLUSAGE_SAMPLE一起使用。
-
Semantic Type(語義類型) - 元素的用途。例如,是否是一個法向量?這對N-patches很有用,并能極大地增強各種數據布局和頂點著色器間的互操作性。TEXCOORDS語義可被用作用戶定義的域(Microsoft? Direct3D?沒有為這些域定義現成的語義)。一般來說語義是一種把頂點聲明和頂點著色器綁定在一起的機制,但是在某種情況下,它們有特殊的解釋。例如,N-patch tessellator用一個含有NORMAL和POSITION語義的元素來設置tessellation。
以下這些都是允許的。
語義,用途索引
|
特殊解釋
|
(D3DDECLUSAGE_POSITION, 0 )
|
固定功能著色器和N-patch中未經變換的位置。
|
(D3DDECLUSAGE_POSITION, 1)
|
固定功能著色器中用于蒙皮的未經變換的位置。
|
(D3DDECLUSAGE_BLENDWEIGHT, 0)
|
在固定功能頂點著色器中的混合加權。
|
(D3DDECLUSAGE_BLENDINDICES, 0)
|
固定功能頂點著色器中indexed paletted skinning的矩陣索引
|
(D3DDECLUSAGE_NORMAL, 0)
|
固定功能頂點著色器和N-patch tessellator中的頂點法向
|
(D3DDECLUSAGE_NORMAL, 1)
|
固定功能頂點著色器中用于蒙皮的頂點法向。
|
(D3DDECLUSAGE_PSIZE, 0)
|
為實現point sprite功能,給光柵化器的設置引擎使用的點的大小屬性,用來把一個點擴展成一個四邊形。
|
(D3DDECLUSAGE_TEXCOORD, n)
|
固定功能頂點著色器和3.0版以前的像素著色器中的紋理坐標??梢杂脕韨鬟f用戶定義的數據。
|
(D3DDECLUSAGE_TANGENT, n)
|
正切值。沒有特別的解釋。
|
(D3DDECLUSAGE_BINORMAL, n)
|
副法線(Binormal)。沒有特別的解釋。
|
(D3DDECLUSAGE_TESSFACTOR, 0)
|
在tessellation單元中使用的tessellation因子,用來控制tessellation比率。
|
(D3DDECLUSAGE_POSITIONT, 0)
|
變換后的位置。當設置了包含該語義的聲明時,頂點處理會被跳過。
|
(D3DDECLUSAGE_COLOR, 0)
|
固定功能頂點著色器和3.0版以前的像素著色器中的漫反射色。
|
(D3DDECLUSAGE_COLOR, 1)
|
固定功能頂點著色器和3.0版以前的像素著色器中的鏡面反射色。
|
(D3DDECLUSAGE_FOG, 0)
|
當設置了3.0版以前的像素著色器時,在像素著色器處理之后使用的霧混合值。
|
(D3DDECLUSAGE_DEPTH, n)
|
深度。沒有特別的解釋。
|
(D3DDECLUSAGE_SAMPLE, n)
|
查找得到的位移值。只能和D3DDECLMETHOD_LOOKUP或D3DDECLMETHOD_LOOKUPPRESAPLED一起使用。
|
有一個特殊的頂點元素值被視為頂點著色器聲明的結束。這個值是#define D3DDECL_END() {0xFF,0,0,0,0,0}。
UsageIndex
與Usage連用用來指定一個頂點元素的語義?,F在用戶可以指定Usage為D3DDECLUSAGE_POSITION以及UsageIndex = 1,而不是像Microsoft DirectX? 8.x中那樣使用D3DVSDE_POSITION2。
一個Decl指定tessellator引擎(或者萬一沒有使用tessellator引擎的話,就直接是頂點處理引擎,)的輸入和輸出,頂點元素中的類型域指定輸入到decl的數據類型。輸出類型由方法隱式決定。
頂點著色器中有如下形式的前綴{semantic, semantic index, register number}。運行庫會把聲明的語義與著色器的語義信息進行匹配,這樣就把輸入寄存器和數據流中的字節偏移量配成一對。
把
FVF
映射到
DirectX 9.0
的
Decl
FVF
|
數據類型
|
用途
|
用途索引
|
D3DFVF_XYZ
|
D3DDECLTYPE_FLOAT3
|
D3DDECLUSAGE_POSITION
|
0
|
D3DFVF_XYZRHW
|
D3DDECLTYPE_FLOAT4
|
D3DDECLUSAGE_POSITIONT
|
0
|
D3DFVF_XYZW
|
D3DDECLTYPE_FLOAT4
|
D3DDECLUSAGE_POSITION
|
0
|
D3DFVF_XYZB5 and D3DFVF_LASTBETA_UBYTE4
|
D3DVSDT_FLOAT3
D3DVSDT_FLOAT4
D3DVSDT_UBYTE4
|
D3DDECLUSAGE_POSITION
D3DDECLUSAGE_BLENDWEIGHT
D3DDECLUSAGE_BLENDINDICES
|
0
|
D3DFVF_XYZB5 and 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) and D3DFVF_LASTBETA_UBYTE4
|
D3DDECLTYPE_FLOAT3
D3DDECLTYPE_FLOAT(n-1)
D3DDECLTYPE_UBYTE4
|
D3DDECLUSAGE_POSITION
D3DDECLUSAGE_BLENDWEIGHT
D3DDECLUSAGE_BLENDINDICES
|
0
|
D3DFVF_XYZBn (n=1..4) and 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)頂點元素的存在用來告訴設備輸入的頂點數據已經經過了頂點處理(和FVF中設置了D3DFVF_XYZRHW位相似)。在繪制時,如果當前設置的頂點聲明中的某一元素具有(D3DUSAGE_POSITIONT, 0)語義,那么整個頂點處理會被略過(就和FVF中設置了D3DFVF_XYZRHW位相似)。
使用(D3DDECLUSAGE_POSITIONT, 0)的頂點聲明有一些限制:
-
此類聲明中只能使用數據流零。
-
頂點元素必須以偏移量遞增的方式存儲。
-
數據流中的偏移量必須對齊到
DWORD
。
-
一對相同的(用途,用途索引)只能出現一次。
-
只能使用D3DDECLMETHOD_DEFAULT方法。
-
其余頂點元素不能具有(D3DDECLUSAGE_POSITION, 0)語義。
此外,此類聲明還有一些與驅動程序版本有關的限制。這些限制的存在是因為Direct3D直接把此類聲明傳送給驅動程序而沒有做任何轉換。
DirectX 9.0
之前的驅動程序
-
輸入的聲明必須可以被翻譯成一個有效的
FVF
(頂點元素及其數據類型具有相同的順序)。
-
紋理坐標間不允許有間隔。這意味著如果有一個
(D3DDECLUSAGE_TEXCOORD, n)
頂點元素,那么同時也應該有一個
(D3DDECLUSAGE_TEXCOORD, n-1)
頂點元素。
不支持
3.0
版本像素著色器的
DirectX 9.0
驅動程序
-
輸入的聲明必須可以被翻譯成一個有效的
FVF
(頂點元素及其數據類型具有相同的順序)。
-
紋理坐標間不允許有間隔。
支持
3.0
版本像素著色器的
DirectX 9.0
驅動程序
允許更通用的聲明。
-
頂點元素的順序可以任意排列,可以使用任何數據類型。
-
如果設備設置了
D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET
能力位,那么多個頂點元素可以在共享相同的數據流偏移量的同時具有不同的類型。
未使用
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-patches
進行。
-
使用了
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
,數據流索引和偏移量必須為
0
。
-
使用了
D3DDECLMETHOD_UV, D3DDECLMETHOD_PARTIALU
和
D3DDECLMETHOD_PARTIALV
方法的聲明只能用于
DrawRectPath
。
-
用途
D3DDECLUSAGE_TESSFACTOR
只能和數據類型
D3DDECLTYPE_FLOAT1
及用途索引
0
一起使用。
-
把一個聲明用于
tessellation
(
DrawRectPatch
, DrawTriPatch, N-patches
)時,數據類型必須小于或等于
D3DDECLTYPE_SHORT4
。
-
如果聲明包含的方法需要特定的設備能力(例如,位移貼圖,
RT-patches
),那么只有當設備支持這些能力時才能創建。
-
用于繪制點和線的頂點聲明,不能使用除了
D3DDECLMETHOD_DEFAULT
之外的方法。
-
可以創建哪些聲明還取決于驅動程序的能力。
用于可編程頂點流水線
-
在繪制時
Direct3D
會在當前頂點聲明和當前頂點著色器函數中查找相同的“用途
–
用途索引”組合。如果找到,那么著色器函數
DCL
中的寄存器會被用作頂點元素的目的寄存器。
-
如果當前頂點聲明中的某個頂點元素的用途未能在當前頂點著色器中找到,那么該頂點元素就被忽略。
-
當使用版本
2.0
以下的頂點著色器時,在著色器代碼中用到的所有語義,必須存在于在繪制時與之綁定的聲明中。當使用版本
2.0
及以上的頂點著色器時,不存在這種限制,這使應用程序可以把同一個頂點著色器和不同的頂點聲明一起使用。當頂點著色器根據靜態條件讀取輸入數據時,這是有用的。因為這個原因而未被初始化的頂點著色器寄存器會包含未定義的值。
當在一個DirectX 8.x驅動程序上使用硬件頂點處理時,還有其它的限制:
-
頂點元素不能重疊或共享相同的偏移量。
-
只能使用
DirectX 8.x
驅動程序能夠理解的數據類型。
如果提供的聲明無法被轉換為DirectX 8.x風格的聲明,那么CreateVertexDeclaration可能會失敗。對混合模式設備來說,這種失敗會發生在Draw*時刻,因為只有這時候才能知道著色器是被用于硬件還是軟件頂點處理。
用于固定功能頂點流水線
只能使用符合以下規則的聲明:
-
頂點元素之間不能有間隔(固定功能流水線使用了
DirectX 8.x
聲明,而
SKIP
在
DirectX 8.x
聲明中是不允許的)
-
必須指定
(D3DDECLUSAGE_POSITION, 0)
語義,并且具有
D3DDECLTYPE_FLOAT3
數據類型。
-
使用了
D3DDECLMETHOD_UV
方法的頂點元素必須指定
D3DDECLUSAGE_TEXCOORD
或
D3DDECLUSAGE_BLENDWEIGHT
用途。
-
使用了
D3DDECLMETHOD_PARTIALU, D3DDECLMETHOD_PARTIALV
或
D3DDECLMETHOD_CROSSUV
的頂點元素只能和這些用途一起使用:
D3DDECLUSAGE_POSITION, D3DDECLUSAGE_NORMAL, D3DDECLUSAGE_BLENDWIEGHT
或
D3DDECLUSAGE_TEXCOORD
,并且輸入類型必須是
D3DDECLTYPE_FLOAT3
。
當聲明和DirectX 8.x驅動程序的硬件頂點處理一起使用時,Direct3D運行庫會根據以下規則把它轉換為DirectX 8.x風格的聲明。
-
頂點元素不能共享數據流中相同的偏移量,并且不能重疊。
-
數據類型必須小于或等于
D3DDECLTYPE_SHORT4
。
-
只允許以下這些方法:
D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_UV
。
-
根據
把DirectX 9.0聲明映射到DirectX 8.x聲明
把
Usage
和
UsageIndex
轉換到寄存器值。
-
把DirectX 9.0聲明映射到DirectX 8.x聲明
列出了哪些
DirectX 9.0
語義可以被轉換到
DirectX 8.x
風格的聲明。
-
如果聲明中有
n
個頂點元素,其中元素
0 - m (m < n)
可以映射到
FVF
(
把DirectX 9.0聲明映射到FVF位
中描述的元素),但元素
m+1
不可以,那么:
-
如果
m+2
到
n-1
之間的任何一個頂點元素可以映射到
FVF/dx8decl
,那么聲明就是無效的。
-
根據
把DirectX 9.0聲明映射到FVF位
,對元素
0
到
m
進行轉換(由
DirectX 8.0
運行庫和舊的驅動程序,以及
DirectX 9.0
驅動程序執行)。
m+1, m+2
直到
n-1
被映射到連續的
texcoord
(k), texcoord(k+1)
,
k
為元素
0 – m
之間的
texcoord
(的數量)。
-
映射后的
texcoord
的數據類型會是
float[1234]
,取代當前元素原來的數據類型(但大小是相同的)。因此即使現有的數據類型沒有被包括在
把DirectX 9.0聲明映射到FVF位
中,也沒有關系。
-
如果
k
到達
8
,那么聲明對
FVF/dx8decl
來說就是無效的。
-
如果存在任何到
texcoord
的映射,那么除了
DEFAULT
方法,整個聲明不能包含使用(紋理)生成方法的元素,否則聲明對
FVF/dx8decl
來說就是無效的。
把
DirectX
9.0
聲明映射到
DirectX 8.x
聲明
DirectX 9.0
用途
|
DirectX 9.0
用途索引
|
DirectX 8.0
|
D3DDECLUSAGE_POSITION
|
0
|
D3DVSDE_POSITION
|
D3DDECLUSAGE_POSITION
|
1
|
D3DVSDE_POSITION2
|
D3DDECLUSAGE_NORMAL
|
0
|
D3DVSDE_NORMAL
|
D3DDECLUSAGE_NORMAL
|
1
|
D3DVSDE_NORMAL2
|
D3DDECLUSAGE_BLENDWEIGHT
|
0
|
D3DVSDE_BLENDWEIGHT
|
D3DDECLUSAGE_BLENDINDICES
|
0
|
D3DVSDE_BLENDINDICES
|
D3DDECLUSAGE_PSIZE
|
0
|
D3DVSDE_PSIZE
|
D3DDECLUSAGE_COLOR
|
0
|
D3DVSDE_DIFFUSE
|
D3DDECLUSAGE_COLOR
|
1
|
D3DVSDE_SPECULAR
|
D3DDECLUSAGE_TEXCOORD
|
n
|
D3DVSDE_TEXCOORDn
|
當聲明和DirectX 7.0驅動程序上的硬件頂點處理一起使用時,Direct3D運行庫會根據以下規則把它轉換為FVF。
-
只能使用數據流
0
(顯然可以從
MaxStreams
設備能力中看出)。
-
頂點元素的順序應該和
FVF
位的順序相同。
-
不允許紋理坐標間有間隔。
-
對所有
DirectX 8.0
之前的驅動程序來說,任何沒有在
把DirectX 9.0聲明映射到FVF位
中描述的頂點元素不能被轉換為有效的
FVF
碼。因此無法在這些驅動程序中使用。
-
如果設備沒有設置以下這些能力位:
D3DPTEXTURECAPS_PROJECTED
或
D3DPTEXTURECAPS_CUBEMAP
,那么使用了
D3DDECLUSAGE_TEXCOORD
的頂點元素只能用
D3DDECLTYPE_FLOAT2
。
把
DirectX 9.0
聲明映射到
FVF
位
數據類型
|
用途
|
用途索引
|
FVF
|
D3DDECLTYPE_FLOAT3
|
D3DDECLUSAGE_POSITION
|
0
|
D3DFVF_XYZ
|
D3DDECLTYPE_FLOAT4
|
D3DDECLUSAGE_POSITIONT
|
0
|
D3DFVF_XYZRHW
|
D3DDECLTYPE_FLOATn
|
D3DDECLUSAGE_BLENDWEIGHT
|
0
|
D3DFVF_XYZBn
|
D3DDECLTYPE_UBYTE4
|
D3DDECLUSAGE_BLENDINDICES
|
0
|
D3DFVF_XYZB (nWeights+1)
|
D3DDECLTYPE_FLOAT3
|
D3DDECLUSAGE_NORMAL
|
0
|
D3DFVF_NORMAL
|
D3DDECLTYPE_FLOAT1
|
D3DDECLUSAGE_PSIZE
|
0
|
D3DFVF_PSIZE
|
D3DDECLTYPE_D3DCOLOR
|
D3DDECLUSAGE_COLOR
|
0
|
D3DFVF_DIFFUSE
|
D3DDECLTYPE_D3DCOLOR
|
D3DDECLUSAGE_COLOR
|
1
|
D3DFVF_SPECULAR
|
D3DDECLTYPE_FLOATm
|
D3DDECLUSAGE_TEXCOORD
|
n
|
D3DFVF_TEXCOORDSIZEm(n)
|
D3DDECLTYPE_FLOAT3
|
D3DDECLUSAGE_POSITION
|
1
|
N/A
|
D3DDECLTYPE_FLOAT3
|
D3DDECLUSAGE_NORMAL
|
1
|
N/A
|
用于
ProcessVertices
的頂點聲明
頂點聲明可以被用來描述ProcessVertices的輸出。此類聲明應該遵循以下規則。
-
只能而且必須使用數據流
0
。
-
頂點元素不能共享相同的偏移量或相互重疊。
-
只允許使用
D3DDECLMETHOD_DEFAULT
方法。
-
只能使用
D3DDECLTYPE_FLOATn
或
D3DDECLTYPE_D3DCOLOR
數據類型。
-
使用
(D3DDECLUSAGE_POSITION, 0)
或
(D3DDECLUSAGE_POSITIONT, 0)
的頂點元素不是必需的。
-
使用
(D3DDECLUSAGE_POSITION, 0)
和
(D3DDECLUSAGE_POSITIONT, 0)
的頂點元素不能在同一個聲明中出現。
-
當使用此類聲明時,當前頂點著色器的必須是
3.0
及以上版本。