• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            李錦俊(mybios)的blog

            游戲開發(fā) C++ Cocos2d-x OpenGL DirectX 數(shù)學(xué) 計(jì)算機(jī)圖形學(xué) SQL Server

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              86 Posts :: 0 Stories :: 370 Comments :: 0 Trackbacks

            公告

            QQ:30743734
            EMain:mybios@qq.com

            常用鏈接

            留言簿(16)

            我參與的團(tuán)隊(duì)

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 371288
            • 排名 - 67

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            頂點(diǎn)聲明


            從概念上講,頂點(diǎn)聲明是對(duì)頂點(diǎn)直接內(nèi)存訪問(DMA)以及圖形流水線的 tessellator 引擎進(jìn)行編程的一種方法。頂點(diǎn)聲明簡要地表示了數(shù)據(jù)的布局及 tessellator 操作。為了解決Microsoft? DirectX? 8.x中頂點(diǎn)聲明的復(fù)雜性和可擴(kuò)展性,9.0版引入了用來表示頂點(diǎn)數(shù)據(jù)流的新格式。

            頂點(diǎn)著色器和頂點(diǎn)聲明不再是在CreateVertexShader的時(shí)候綁定在一起。對(duì)著色器的驗(yàn)證已經(jīng)被分成兩部分,一部分在頂點(diǎn)著色器創(chuàng)建時(shí)執(zhí)行,另一部分在DrawPrimitive時(shí)執(zhí)行。頂點(diǎn)著色器和頂點(diǎn)聲明都由相應(yīng)的對(duì)象表示。

            Decls 不再用DWORD流表示。它們現(xiàn)在用一個(gè)D3DVERTEXELEMENT9結(jié)構(gòu)的數(shù)組表示。數(shù)組中的每個(gè)元素描述一個(gè)頂點(diǎn)元素。

            另外,為了解決API的可用性問題,9.0版增加了一個(gè)與SetVertexDeclaration調(diào)用等價(jià)的SetFVF調(diào)用。這是一個(gè)有用的函數(shù),當(dāng)調(diào)用這個(gè)函數(shù)時(shí),新的FVF會(huì)取代當(dāng)前的頂點(diǎn)聲明,反之亦然。如果驅(qū)動(dòng)程序是DirectX 8.0之前的版本(NumStream為0),那么對(duì)于那些不能被轉(zhuǎn)換成彈性頂點(diǎn)格式(FVF)的頂點(diǎn)聲明,SetVertexDeclaration可能會(huì)失敗并返回錯(cuò)誤碼。SetFVF既能用于固定功能頂點(diǎn)流水線,又能用于可編程頂點(diǎn)流水線。在內(nèi)部,系統(tǒng)會(huì)根據(jù)把FVF映射到DirectX 9.0中的Decl中定義的規(guī)則,把FVF碼轉(zhuǎn)換為頂點(diǎn)著色器聲明。在編寫頂點(diǎn)著色器函數(shù)中的DCL命令時(shí),應(yīng)該緊記這一點(diǎn)。因?yàn)檫@個(gè)轉(zhuǎn)換的關(guān)系,所有后面的討論將僅限于頂點(diǎn)聲明。

            D3DVERTEXELEMENT9結(jié)構(gòu)

            以下是D3DVERTEXELEMENT9結(jié)構(gòu)中的域以及說明。

            • Stream(數(shù)據(jù)流) - 數(shù)據(jù)流的編號(hào),當(dāng)前域會(huì)從該編號(hào)的數(shù)據(jù)流中讀取。
            • Offset(偏移量) - 偏移量,表示當(dāng)前域從哪里開始讀取,以字節(jié)為單位。
            • Type(類型) - 輸入數(shù)據(jù)的類型,以及數(shù)據(jù)在傳入頂點(diǎn)著色器的寄存器時(shí)如何轉(zhuǎn)換格式,也就是,float1,float2,short2n等等。輸出的類型由方法決定,有些方法有隱式的輸入類型。
            • Method(方法) - 將由tessellator(或任何程序化的幾何函數(shù))對(duì)指定的輸入執(zhí)行的任何預(yù)定義操作。
              • D3DDECLMETHOD_DEFAULT: 當(dāng)使用tessellator時(shí),這個(gè)元素被插值或復(fù)制到頂點(diǎn)處理器的輸入寄存器中。這個(gè)操作的輸入可以是任何類型。這個(gè)操作的輸出類型與輸入相同。
              • D3DDECLMETHOD_PARTIALU: 計(jì)算rectangular patch(R-patch)上某一點(diǎn)在U方向上的正切值。這個(gè)操作的輸入類型可以是D3DDECLTYPE_FLOAT[43],D3DDECLTYPE_D3DCOLOR,D3DDECLTYPE_UBYTE4,或D3DDECLTYPE_SHORT4。這個(gè)操作的輸出類型總是D3DDECLTYPE_FLOAT3。
              • D3DDECLMETHOD_PARTIALV: 計(jì)算R-patch上某一點(diǎn)在V方向上的正切值。這個(gè)操作的輸入類型可以是D3DDECLTYPE_FLOAT[43],D3DDECLTYPE_D3DCOLOR,D3DDECLTYPE_UBYTE4,D3DDECLTYPE_SHORT4。這個(gè)操作的輸出類型總是D3DDECLTYPE_FLOAT3。
              • D3DDECLMETHOD_CROSSUV: 通過求兩個(gè)正切值的叉積計(jì)算rect/tri patches(RT-patch)上某一點(diǎn)的法向。這個(gè)操作的輸入類型可以是D3DDECLTYPE_FLOAT[43],D3DDECLTYPE_D3DCOLOR,D3DDECLTYPE_UBYTE4,或D3DDECLTYPE_SHORT4。這個(gè)操作的輸出類型總是D3DDECLTYPE_FLOAT3。
              • D3DDECLMETHOD_UV: 復(fù)制RT-patch上某一點(diǎn)的U,V值,產(chǎn)生一個(gè)二維浮點(diǎn)數(shù)。這個(gè)操作的輸入類型必須被設(shè)為D3DDECLTYPE_UNUSED。這個(gè)操作的輸出類型總是D3DDECLTYPE_FLOAT2。輸入數(shù)據(jù)流和偏移量也沒有用到(但必須被設(shè)為0)。
              • D3DDECLMETHOD_LOOKUP: 查找一個(gè)位移貼圖。輸入類型可以是D3DDECLTYPE_FLOAT[234]。只有.x和.y成員被用于紋理貼圖查找。這個(gè)操作的輸出類型總是D3DDECLTYPE_FLOAT4。只有設(shè)備支持位移貼圖時(shí)才能使用這個(gè)方法。這個(gè)方法只能和D3DDECLUSAGE_SAMPLE一起使用。
              • D3DDECLMETHOD_LOOKUPPRESAMPLED: 查找一個(gè)預(yù)取樣的位移貼圖。輸入類型、流索引值和流偏移量都沒有用到(類型必須被設(shè)為D3DDECLTYPE_UNUSED,數(shù)據(jù)流和偏移量必須被設(shè)為0)。這個(gè)操作的輸出類型總是D3DDECLTYPE_FLOAT4。只有設(shè)備支持位移貼圖時(shí)才能使用這個(gè)方法。這個(gè)方法只能和D3DDECLUSAGE_SAMPLE一起使用。
            • Semantic Type(語義類型) - 元素的用途。例如,是否是一個(gè)法向量?這對(duì)N-patches很有用,并能極大地增強(qiáng)各種數(shù)據(jù)布局和頂點(diǎn)著色器間的互操作性。TEXCOORDS語義可被用作用戶定義的域(Microsoft? Direct3D?沒有為這些域定義現(xiàn)成的語義)。一般來說語義是一種把頂點(diǎn)聲明和頂點(diǎn)著色器綁定在一起的機(jī)制,但是在某種情況下,它們有特殊的解釋。例如,N-patch tessellator用一個(gè)含有NORMAL和POSITION語義的元素來設(shè)置tessellation。

            以下這些都是允許的。

            語義,用途索引

            特殊解釋

            (D3DDECLUSAGE_POSITION, 0 )

            固定功能著色器和N-patch中未經(jīng)變換的位置。

            (D3DDECLUSAGE_POSITION, 1)

            固定功能著色器中用于蒙皮的未經(jīng)變換的位置。

            (D3DDECLUSAGE_BLENDWEIGHT, 0)

            在固定功能頂點(diǎn)著色器中的混合加權(quán)。

            (D3DDECLUSAGE_BLENDINDICES, 0)

            固定功能頂點(diǎn)著色器中indexed paletted skinning的矩陣索引

            (D3DDECLUSAGE_NORMAL, 0)

            固定功能頂點(diǎn)著色器和N-patch tessellator中的頂點(diǎn)法向

            (D3DDECLUSAGE_NORMAL, 1)

            固定功能頂點(diǎn)著色器中用于蒙皮的頂點(diǎn)法向。

            (D3DDECLUSAGE_PSIZE, 0)

            為實(shí)現(xiàn)point sprite功能,給光柵化器的設(shè)置引擎使用的點(diǎn)的大小屬性,用來把一個(gè)點(diǎn)擴(kuò)展成一個(gè)四邊形。

            (D3DDECLUSAGE_TEXCOORD, n)

            固定功能頂點(diǎn)著色器和3.0版以前的像素著色器中的紋理坐標(biāo)。可以用來傳遞用戶定義的數(shù)據(jù)。

            (D3DDECLUSAGE_TANGENT, n)

            正切值。沒有特別的解釋。

            (D3DDECLUSAGE_BINORMAL, n)

            副法線(Binormal)。沒有特別的解釋。

            (D3DDECLUSAGE_TESSFACTOR, 0)

            tessellation單元中使用的tessellation因子,用來控制tessellation比率。

            (D3DDECLUSAGE_POSITIONT, 0)

            變換后的位置。當(dāng)設(shè)置了包含該語義的聲明時(shí),頂點(diǎn)處理會(huì)被跳過。

            (D3DDECLUSAGE_COLOR, 0)

            固定功能頂點(diǎn)著色器和3.0版以前的像素著色器中的漫反射色。

            (D3DDECLUSAGE_COLOR, 1)

            固定功能頂點(diǎn)著色器和3.0版以前的像素著色器中的鏡面反射色。

            (D3DDECLUSAGE_FOG, 0)

            當(dāng)設(shè)置了3.0版以前的像素著色器時(shí),在像素著色器處理之后使用的霧混合值。

            (D3DDECLUSAGE_DEPTH, n)

            深度。沒有特別的解釋。

            (D3DDECLUSAGE_SAMPLE, n)

            查找得到的位移值。只能和D3DDECLMETHOD_LOOKUP或D3DDECLMETHOD_LOOKUPPRESAPLED一起使用。

            有一個(gè)特殊的頂點(diǎn)元素值被視為頂點(diǎn)著色器聲明的結(jié)束。這個(gè)值是#define D3DDECL_END() {0xFF,0,0,0,0,0}。

            UsageIndex Usage連用用來指定一個(gè)頂點(diǎn)元素的語義。現(xiàn)在用戶可以指定Usage為D3DDECLUSAGE_POSITION以及UsageIndex = 1,而不是像Microsoft DirectX? 8.x中那樣使用D3DVSDE_POSITION2。

            一個(gè)Decl指定tessellator引擎(或者萬一沒有使用tessellator引擎的話,就直接是頂點(diǎn)處理引擎,)的輸入和輸出,頂點(diǎn)元素中的類型域指定輸入到decl的數(shù)據(jù)類型。輸出類型由方法隱式?jīng)Q定。

            頂點(diǎn)著色器中有如下形式的前綴{semantic, semantic index, register number}。運(yùn)行庫會(huì)把聲明的語義與著色器的語義信息進(jìn)行匹配,這樣就把輸入寄存器和數(shù)據(jù)流中的字節(jié)偏移量配成一對(duì)。

            FVF 映射到 DirectX 9.0 Decl

            FVF

            數(shù)據(jù)類型

            用途

            用途索引

            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 的頂點(diǎn)聲明

            ?(D3DUSAGE_POSITIONT, 0)頂點(diǎn)元素的存在用來告訴設(shè)備輸入的頂點(diǎn)數(shù)據(jù)已經(jīng)經(jīng)過了頂點(diǎn)處理(和FVF中設(shè)置了D3DFVF_XYZRHW位相似)。在繪制時(shí),如果當(dāng)前設(shè)置的頂點(diǎn)聲明中的某一元素具有(D3DUSAGE_POSITIONT, 0)語義,那么整個(gè)頂點(diǎn)處理會(huì)被略過(就和FVF中設(shè)置了D3DFVF_XYZRHW位相似)。

            使用(D3DDECLUSAGE_POSITIONT, 0)的頂點(diǎn)聲明有一些限制:

            • 此類聲明中只能使用數(shù)據(jù)流零。
            • 頂點(diǎn)元素必須以偏移量遞增的方式存儲(chǔ)。
            • 數(shù)據(jù)流中的偏移量必須對(duì)齊到 DWORD
            • 一對(duì)相同的(用途,用途索引)只能出現(xiàn)一次。
            • 只能使用D3DDECLMETHOD_DEFAULT方法。
            • 其余頂點(diǎn)元素不能具有(D3DDECLUSAGE_POSITION, 0)語義。

            此外,此類聲明還有一些與驅(qū)動(dòng)程序版本有關(guān)的限制。這些限制的存在是因?yàn)?span lang="EN-US">Direct3D直接把此類聲明傳送給驅(qū)動(dòng)程序而沒有做任何轉(zhuǎn)換。

            DirectX 9.0 之前的驅(qū)動(dòng)程序

            • 輸入的聲明必須可以被翻譯成一個(gè)有效的 FVF (頂點(diǎn)元素及其數(shù)據(jù)類型具有相同的順序)。
            • 紋理坐標(biāo)間不允許有間隔。這意味著如果有一個(gè) (D3DDECLUSAGE_TEXCOORD, n) 頂點(diǎn)元素,那么同時(shí)也應(yīng)該有一個(gè) (D3DDECLUSAGE_TEXCOORD, n-1) 頂點(diǎn)元素。

            不支持 3.0 版本像素著色器的 DirectX 9.0 驅(qū)動(dòng)程序

            • 輸入的聲明必須可以被翻譯成一個(gè)有效的 FVF (頂點(diǎn)元素及其數(shù)據(jù)類型具有相同的順序)。
            • 紋理坐標(biāo)間不允許有間隔。

            支持 3.0 版本像素著色器的 DirectX 9.0 驅(qū)動(dòng)程序

            允許更通用的聲明。

            • 頂點(diǎn)元素的順序可以任意排列,可以使用任何數(shù)據(jù)類型。
            • 如果設(shè)備設(shè)置了 D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET 能力位,那么多個(gè)頂點(diǎn)元素可以在共享相同的數(shù)據(jù)流偏移量的同時(shí)具有不同的類型。

            未使用 D3DDECLUSAGE_POSITIONT 的頂點(diǎn)聲明

            運(yùn)行庫會(huì)在創(chuàng)建聲明時(shí)進(jìn)行驗(yàn)證。以下是一些通用的規(guī)則,用來判斷聲明的合法性。

            • 數(shù)據(jù)流中所有的頂點(diǎn)元素必須是連續(xù)的,并按偏移量排序。
            • 數(shù)據(jù)流偏移量必須對(duì)齊到 DWORD
            • 一對(duì)相同的(用途,用途索引)只能出現(xiàn)一次。
            • 如果設(shè)置了 D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET 能力位,那么頂點(diǎn)元素可以:
              • 多個(gè)頂點(diǎn)元素可以共享數(shù)據(jù)流中相同的偏移量。
              • 它們可以是不同的類型,從而有不同的大小。
              • 它們可以任意地重疊。例如,一個(gè)元素在數(shù)據(jù)流中的起始位置可以同時(shí)位于另一個(gè)元素的中間。
              • 頂點(diǎn)元素的數(shù)據(jù)流偏移量的順序可以是任意的。
            • 頂點(diǎn)元素的數(shù)量不能大于 64
            • UsageIndex 應(yīng)該在 [0-15] 范圍內(nèi)。
            • 用于 DrawPrimitive API 的聲明,不應(yīng)該包含除了 D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_LOOKUPPRESAMPLED D3DDECLMETHOD_LOOKUP 之外的頂點(diǎn)元素。
            • 包含 D3DDECLMETHOD_LOOKUP LOOKUPPRESAMPLED 的頂點(diǎn)聲明,應(yīng)該只用于可編程頂點(diǎn)流水線。
            • 用于 DrawRectPatch/DrawTriPatch API 的聲明,不能包含 D3DDECLMETHOD_LOOKUPPRESAMPLED D3DDECLMETHOD_LOOKUP 頂點(diǎn)元素。
            • 聲明只能有一個(gè)使用 D3DDECLMETHOD_LOOKUP D3DDECLMETHOD_LOOKUPPRESAMPLED 方法的元素。
            • 使用了 D3DDECLMETHOD_LOOKUP D3DDECLMETHOD_LOOKUPPRESAMPLED 的聲明不應(yīng)該使用 D3DDECLMETHOD_DEFAULT 之外的元素,因?yàn)槲灰瀑N圖只對(duì) N-patches 進(jìn)行。
            • 使用了 D3DDECLMETHOD_LOOKUP D3DDECLMETHOD_LOOKUPPRESAMPLED 的頂點(diǎn)元素只能和 (D3DDECLUSAGE_SAMPLE, n) 一起使用,反之亦然。
            • 如果一個(gè)使用了 D3DDECLMETHOD_LOOKUP 方法的頂點(diǎn)元素的數(shù)據(jù)流索引和偏移量與現(xiàn)有的頂點(diǎn)元素相同,那么該頂點(diǎn)元素也應(yīng)該具有相同的數(shù)據(jù)類型。
            • 使用了 D3DDECLMETHOD_LOOKUP 方法的頂點(diǎn)元素應(yīng)該具有 D3DDECLTYPE_FLOAT2/3/4 數(shù)據(jù)類型。
            • 使用了 D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_PARTIALU D3DDECLMETHOD_PARTIALV 的頂點(diǎn)元素應(yīng)該具有兼容的數(shù)據(jù)類型。
            • 使用了 D3DDECLMETHOD_UV D3DDECLMETHOD_LOOKUPPRESAMPLED 的頂點(diǎn)元素的類型必須是 D3DDECLTYPE_UNUSED ,數(shù)據(jù)流索引和偏移量必須為 0
            • 使用了 D3DDECLMETHOD_UV, D3DDECLMETHOD_PARTIALU D3DDECLMETHOD_PARTIALV 方法的聲明只能用于 DrawRectPath
            • 用途 D3DDECLUSAGE_TESSFACTOR 只能和數(shù)據(jù)類型 D3DDECLTYPE_FLOAT1 及用途索引 0 一起使用。
            • 把一個(gè)聲明用于 tessellation DrawRectPatch , DrawTriPatch, N-patches )時(shí),數(shù)據(jù)類型必須小于或等于 D3DDECLTYPE_SHORT4
            • 如果聲明包含的方法需要特定的設(shè)備能力(例如,位移貼圖, RT-patches ),那么只有當(dāng)設(shè)備支持這些能力時(shí)才能創(chuàng)建。
            • 用于繪制點(diǎn)和線的頂點(diǎn)聲明,不能使用除了 D3DDECLMETHOD_DEFAULT 之外的方法。
            • 可以創(chuàng)建哪些聲明還取決于驅(qū)動(dòng)程序的能力。

            用于可編程頂點(diǎn)流水線

            • 在繪制時(shí) Direct3D 會(huì)在當(dāng)前頂點(diǎn)聲明和當(dāng)前頂點(diǎn)著色器函數(shù)中查找相同的“用途 用途索引”組合。如果找到,那么著色器函數(shù) DCL 中的寄存器會(huì)被用作頂點(diǎn)元素的目的寄存器。
            • 如果當(dāng)前頂點(diǎn)聲明中的某個(gè)頂點(diǎn)元素的用途未能在當(dāng)前頂點(diǎn)著色器中找到,那么該頂點(diǎn)元素就被忽略。
            • 當(dāng)使用版本 2.0 以下的頂點(diǎn)著色器時(shí),在著色器代碼中用到的所有語義,必須存在于在繪制時(shí)與之綁定的聲明中。當(dāng)使用版本 2.0 及以上的頂點(diǎn)著色器時(shí),不存在這種限制,這使應(yīng)用程序可以把同一個(gè)頂點(diǎn)著色器和不同的頂點(diǎn)聲明一起使用。當(dāng)頂點(diǎn)著色器根據(jù)靜態(tài)條件讀取輸入數(shù)據(jù)時(shí),這是有用的。因?yàn)檫@個(gè)原因而未被初始化的頂點(diǎn)著色器寄存器會(huì)包含未定義的值。

            當(dāng)在一個(gè)DirectX 8.x驅(qū)動(dòng)程序上使用硬件頂點(diǎn)處理時(shí),還有其它的限制:

            • 頂點(diǎn)元素不能重疊或共享相同的偏移量。
            • 只能使用 DirectX 8.x 驅(qū)動(dòng)程序能夠理解的數(shù)據(jù)類型。

            如果提供的聲明無法被轉(zhuǎn)換為DirectX 8.x風(fēng)格的聲明,那么CreateVertexDeclaration可能會(huì)失敗。對(duì)混合模式設(shè)備來說,這種失敗會(huì)發(fā)生在Draw*時(shí)刻,因?yàn)橹挥羞@時(shí)候才能知道著色器是被用于硬件還是軟件頂點(diǎn)處理。

            用于固定功能頂點(diǎn)流水線

            只能使用符合以下規(guī)則的聲明:

            • 頂點(diǎn)元素之間不能有間隔(固定功能流水線使用了 DirectX 8.x 聲明,而 SKIP DirectX 8.x 聲明中是不允許的)
            • 必須指定 (D3DDECLUSAGE_POSITION, 0) 語義,并且具有 D3DDECLTYPE_FLOAT3 數(shù)據(jù)類型。
            • 使用了 D3DDECLMETHOD_UV 方法的頂點(diǎn)元素必須指定 D3DDECLUSAGE_TEXCOORD D3DDECLUSAGE_BLENDWEIGHT 用途。
            • 使用了 D3DDECLMETHOD_PARTIALU, D3DDECLMETHOD_PARTIALV D3DDECLMETHOD_CROSSUV 的頂點(diǎn)元素只能和這些用途一起使用: D3DDECLUSAGE_POSITION, D3DDECLUSAGE_NORMAL, D3DDECLUSAGE_BLENDWIEGHT D3DDECLUSAGE_TEXCOORD ,并且輸入類型必須是 D3DDECLTYPE_FLOAT3

            當(dāng)聲明和DirectX 8.x驅(qū)動(dòng)程序的硬件頂點(diǎn)處理一起使用時(shí),Direct3D運(yùn)行庫會(huì)根據(jù)以下規(guī)則把它轉(zhuǎn)換為DirectX 8.x風(fēng)格的聲明。

            • 頂點(diǎn)元素不能共享數(shù)據(jù)流中相同的偏移量,并且不能重疊。
            • 數(shù)據(jù)類型必須小于或等于 D3DDECLTYPE_SHORT4
            • 只允許以下這些方法: D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_UV
            • 根據(jù) DirectX 9.0聲明映射到DirectX 8.x聲明 Usage UsageIndex 轉(zhuǎn)換到寄存器值。
            • DirectX 9.0聲明映射到DirectX 8.x聲明 列出了哪些 DirectX 9.0 語義可以被轉(zhuǎn)換到 DirectX 8.x 風(fēng)格的聲明。
            • 如果聲明中有 n 個(gè)頂點(diǎn)元素,其中元素 0 - m (m < n) 可以映射到 FVF DirectX 9.0聲明映射到FVF 中描述的元素),但元素 m+1 不可以,那么:
              • 如果 m+2 n-1 之間的任何一個(gè)頂點(diǎn)元素可以映射到 FVF/dx8decl ,那么聲明就是無效的。
              • 根據(jù) DirectX 9.0聲明映射到FVF ,對(duì)元素 0 m 進(jìn)行轉(zhuǎn)換(由 DirectX 8.0 運(yùn)行庫和舊的驅(qū)動(dòng)程序,以及 DirectX 9.0 驅(qū)動(dòng)程序執(zhí)行)。 m+1, m+2 直到 n-1 被映射到連續(xù)的 texcoord (k), texcoord(k+1) k 為元素 0 – m 之間的 texcoord (的數(shù)量)。
              • 映射后的 texcoord 的數(shù)據(jù)類型會(huì)是 float[1234] ,取代當(dāng)前元素原來的數(shù)據(jù)類型(但大小是相同的)。因此即使現(xiàn)有的數(shù)據(jù)類型沒有被包括在 DirectX 9.0聲明映射到FVF 中,也沒有關(guān)系。
              • 如果 k 到達(dá) 8 ,那么聲明對(duì) FVF/dx8decl 來說就是無效的。
              • 如果存在任何到 texcoord 的映射,那么除了 DEFAULT 方法,整個(gè)聲明不能包含使用(紋理)生成方法的元素,否則聲明對(duì) 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

            當(dāng)聲明和DirectX 7.0驅(qū)動(dòng)程序上的硬件頂點(diǎn)處理一起使用時(shí),Direct3D運(yùn)行庫會(huì)根據(jù)以下規(guī)則把它轉(zhuǎn)換為FVF。

            • 只能使用數(shù)據(jù)流 0 (顯然可以從 MaxStreams 設(shè)備能力中看出)。
            • 頂點(diǎn)元素的順序應(yīng)該和 FVF 位的順序相同。
            • 不允許紋理坐標(biāo)間有間隔。
            • 對(duì)所有 DirectX 8.0 之前的驅(qū)動(dòng)程序來說,任何沒有在 DirectX 9.0聲明映射到FVF 中描述的頂點(diǎn)元素不能被轉(zhuǎn)換為有效的 FVF 碼。因此無法在這些驅(qū)動(dòng)程序中使用。
            • 如果設(shè)備沒有設(shè)置以下這些能力位: D3DPTEXTURECAPS_PROJECTED D3DPTEXTURECAPS_CUBEMAP ,那么使用了 D3DDECLUSAGE_TEXCOORD 的頂點(diǎn)元素只能用 D3DDECLTYPE_FLOAT2

            DirectX 9.0 聲明映射到 FVF

            數(shù)據(jù)類型

            用途

            用途索引

            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 的頂點(diǎn)聲明

            頂點(diǎn)聲明可以被用來描述ProcessVertices的輸出。此類聲明應(yīng)該遵循以下規(guī)則。

            • 只能而且必須使用數(shù)據(jù)流 0
            • 頂點(diǎn)元素不能共享相同的偏移量或相互重疊。
            • 只允許使用 D3DDECLMETHOD_DEFAULT 方法。
            • 只能使用 D3DDECLTYPE_FLOATn D3DDECLTYPE_D3DCOLOR 數(shù)據(jù)類型。
            • 使用 (D3DDECLUSAGE_POSITION, 0) (D3DDECLUSAGE_POSITIONT, 0) 的頂點(diǎn)元素不是必需的。
            • 使用 (D3DDECLUSAGE_POSITION, 0) (D3DDECLUSAGE_POSITIONT, 0) 的頂點(diǎn)元素不能在同一個(gè)聲明中出現(xiàn)。
            • 當(dāng)使用此類聲明時(shí),當(dāng)前頂點(diǎn)著色器的必須是 3.0 及以上版本。

            posted on 2006-12-02 16:42 李錦俊(mybios) 閱讀(2744) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Direct3D
            久久久精品波多野结衣| 亚洲国产成人久久笫一页| 久久亚洲AV成人无码软件| 性高朝久久久久久久久久| 99久久国产亚洲综合精品| 色婷婷综合久久久中文字幕| 久久国产精品无码HDAV| 91精品国产高清久久久久久国产嫩草 | 国产精品久久久久久| 亚洲国产二区三区久久| 欧美亚洲国产精品久久久久| 国内精品久久久久久久久电影网| 99久久777色| 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | 亚洲中文久久精品无码ww16| 91久久精品电影| 久久人人爽人人爽人人片AV高清| 精品精品国产自在久久高清| 模特私拍国产精品久久| 久久精品国产免费| 久久精品人妻中文系列| 久久高潮一级毛片免费| 久久久久99精品成人片试看 | 久久久久久久波多野结衣高潮 | 亚洲国产高清精品线久久| 久久99精品久久久久久久不卡| 一本色道久久88综合日韩精品 | 亚洲中文字幕无码久久2017| 久久精品国产亚洲Aⅴ香蕉| 国产精品99精品久久免费| 久久久无码精品亚洲日韩京东传媒| 国产三级观看久久| 久久最新精品国产| 久久国产精品99久久久久久老狼| 18岁日韩内射颜射午夜久久成人 | 免费精品久久天干天干| 9191精品国产免费久久| 九九99精品久久久久久| 久久精品国产亚洲av影院| 亚洲午夜久久久影院伊人| 国内精品久久久久影院薰衣草|