• <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>
            隨筆 - 132  文章 - 51  trackbacks - 0
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(7)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            cocos2d-x

            OGRE

            OPenGL

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            狀態(tài)

                Direct3D設(shè)備使用狀態(tài)來配置所有的管道處理。采樣器狀態(tài)通過例如定義紋理尋址方式(texture addressing)和過濾模式控制紋理采樣器設(shè)置。紋理狀態(tài)設(shè)置用于控制紋理如何被組合以及相互之間如何混合的多重紋理混合器。渲染狀態(tài)控制大多數(shù)管道狀態(tài)。

                狀態(tài)塊是存儲和恢復(fù)狀態(tài)的便利機(jī)制。

            狀態(tài)塊保存和恢復(fù)狀態(tài)

                狀態(tài)塊是一組設(shè)備狀態(tài)。設(shè)備狀態(tài)由渲染狀態(tài),定點(diǎn)狀態(tài),像素狀態(tài),或上述的所有狀態(tài)組成。狀態(tài)塊包含設(shè)備當(dāng)前狀態(tài)的快照,或你可以創(chuàng)建狀態(tài)塊來記錄每一個應(yīng)用程序造成的狀態(tài)改變。

            創(chuàng)建狀態(tài)塊

                選擇你想獲取的狀態(tài)類型,比功能照下面的方法創(chuàng)建狀態(tài)塊:

                IDirect3DStateBlock9* pStateBlock = NULL;

                pd3dDevice->CreateStateBlock(D3DSBT_ALL, &pStateBlock);

                CreateStateBlock創(chuàng)建狀態(tài)塊,并且獲取設(shè)備狀態(tài)。設(shè)備狀態(tài)由第一個參數(shù)中狀態(tài)塊類型指定。該狀態(tài)可以為下面任一值:

            l         所有的設(shè)備狀態(tài)

            l         所有的像素狀態(tài)

            l         所有的定點(diǎn)狀態(tài)

            獲取狀態(tài)信息

                創(chuàng)建狀態(tài)塊自動獲取當(dāng)前設(shè)備狀態(tài)。效果系統(tǒng)使用狀態(tài)塊保存狀態(tài)。在調(diào)用Begin后,狀態(tài)塊被創(chuàng)建并且獲取狀態(tài)。當(dāng)調(diào)用End,狀態(tài)塊中狀態(tài)被重新應(yīng)用于設(shè)備。

                要保存自定義的狀態(tài)序列,將你需要保存的狀態(tài)更改序列包含在BeginStateBlockEndStateBlock之間。BeginStateBlock通知當(dāng)前的設(shè)備設(shè)置狀態(tài)塊并且將EndStateBlock調(diào)用之前發(fā)生的狀態(tài)改變添加到其中。下面是例子:

                IDirect3DStateBlock9* pStateBlock = NULL;

                pd3dDevice->BeginStateBlock();

            //這里發(fā)生任意數(shù)量的狀態(tài)改變

            //SetRenderState, SetSamplerState, SetTextureStageState…

                pd3dDevice->EndStateBlock(&pStateBlock);

                這將在自定義狀態(tài)塊中保存代碼序列中任意數(shù)量的狀態(tài)改變。之后,當(dāng)你想要使用狀態(tài)塊重置設(shè)備狀態(tài)時,調(diào)用IDirect3DStateBlock::Apply。這僅僅會覆蓋狀態(tài)塊中義獲取的設(shè)備狀態(tài)。其他在自定義狀態(tài)塊中沒有獲取的設(shè)備狀態(tài)不會改變。(記得在不需要使用狀態(tài)塊對象時調(diào)用Release)。

             

            用狀態(tài)塊保存所有的設(shè)備狀態(tài)

                狀態(tài)塊可以用于獲取所有的設(shè)備狀態(tài)。下面是設(shè)備狀態(tài)中包含的狀態(tài)元素:

            l         頂點(diǎn)狀態(tài);

            l         像素狀態(tài);

            l         每個紋理指定的采樣器;

            l         每個頂點(diǎn)紋理;

            l         每個位移映射紋理(Each displacement map texture;

            l         當(dāng)前紋理的調(diào)色板;

            l         對于每個頂點(diǎn)流:指向頂點(diǎn)緩存的指針,SetStreamSource中指定的每個參數(shù)和SetStreamSourceFreq指定的分配器(divider)(如果有);

            l         指向索引緩存的指針;

            l         視口;

            l         裁剪矩形;

            l         世界變換矩陣,視變換矩陣和投影矩陣;

            l         紋理變換;

            l         裁剪面(如果有);

            l         當(dāng)前材質(zhì);

             

            要用狀態(tài)塊獲取所有的狀態(tài)對象,需在調(diào)用CreateStateBlock時使用D3DSBT_ALL作為第一個參數(shù)。

             

            使用狀態(tài)塊保存頂點(diǎn)狀態(tài)

                狀態(tài)塊可以用于僅獲取頂點(diǎn)狀態(tài)。下面的狀態(tài)為頂點(diǎn)狀態(tài):

            l         頂點(diǎn)渲染狀態(tài);

            l         頂點(diǎn)采樣器器狀態(tài);

            l         頂點(diǎn)紋理狀態(tài);

            l         SetNPatchModeN面片(NPatch)模式片段;

            l         SetLight中每一個光源,包括LightEnable指定的光源是否開啟的狀態(tài);

            l         當(dāng)前頂點(diǎn)著色器和每一個頂點(diǎn)著色器常量;

            l         對于每個頂點(diǎn)流:保存SetStreamSourceFreq中指定的分配器(divider;

            l         當(dāng)前頂點(diǎn)聲明(FVF)

             

            使用狀態(tài)塊獲取頂點(diǎn)狀態(tài),需在調(diào)用CreateStateBlock時為第一個參數(shù)指定D3DSBT_VERTEXSTATE

            頂點(diǎn)管道:渲染狀態(tài)

                設(shè)備渲染狀態(tài)幾乎影響管道的每一個部分的行為。渲染狀態(tài)通過調(diào)用SetRenderState來設(shè)置。下面的表格包含設(shè)置頂點(diǎn)狀態(tài)的所有渲染狀態(tài):

            Render States

            Default Value

            D3DRS_CULLMODE(剔除模式)

            D3DCULL_CCW(剔除逆時針順序的點(diǎn)平面)

            D3DRS_FOGCOLOR(霧顏色)

            0

            D3DRS_FOGTABLEMODE

            D3DFOG_NONE

            D3DRS_FOGSTART

            0

            D3DRS_FOGEND

            1

            D3DRS_FOGDENSITY(霧密度)

            1

            D3DRS_RANGEFOGENABLE

            FALSE

            D3DRS_AMBIENT(環(huán)境()色)

            0

            D3DRS_COLORVERTEX

            TRUE

            D3DRS_FOGVERTEXMODE

            D3DFOG_NONE

            D3DRS_CLIPPING(裁剪)

            TRUE

            D3DRS_LIGHTING(光照)

            TRUE

            D3DRS_LOCALVIEWER

            TRUE

            D3DRS_EMISSIVEMATERIALSOURCE

            D3DMCS_MATERIAL

            D3DRS_AMBIENTMATERIALSOURCE

            D3DMCS_MATERIAL

            D3DRS_DIFFUSEMATERIALSOURCE

            D3DMCS_COLOR1

            D3DRS_SPECULARMATERIALSOURCE

            D3DMCS_COLOR2

            D3DRS_VERTEXBLEND

            D3DVBF_DISABLE

            D3DRS_CLIPPLANEENABLE

            0

            D3DRS_POINTSIZE

            Driver dependent

            D3DRS_POINTSIZE_MIN

            1

            D3DRS_POINTSPRITEENABLE

            FALSE

            D3DRS_POINTSCALEENABLE

            FALSE

            D3DRS_POINTSCALE_A

            1

            D3DRS_POINTSCALE_B

            0

            D3DRS_POINTSCALE_C

            0

            D3DRS_MULTISAMPLEANTIALIAS

            TRUE

            D3DRS_MULTISAMPLEMASK

            0xffffffff

            D3DRS_PATCHEDGESTYLE

            D3DPATCHEDGE_DISCRETE

            D3DRS_POINTSIZE_MAX

            1

            D3DRS_INDEXEDVERTEXBLENDENABLE

            FALSE

            D3DRS_TWEENFACTOR

            0

            D3DRS_POSITIONDEGREE

            D3DDEGREE_CUBIC

            D3DRS_NORMALDEGREE

            D3DDEGREE_LINEAR

            D3DRS_MINTESSELLATIONLEVEL

            1

            D3DRS_MAXTESSELLATIONLEVEL

            1

            D3DRS_ADAPTIVETESS_X

            0

            D3DRS_ADAPTIVETESS_Y

            0

            D3DRS_ADAPTIVETESS_Z

            1

            D3DRS_ADAPTIVETESS_W

            0

            D3DRS_ENABLEADAPTIVETESSELLATION"/>

            FALSE

            采樣器狀態(tài)控制采樣相關(guān)的主題,如濾波,貼瓷和紋理坐標(biāo)尋址模式。使用SetSamplerState設(shè)置采樣器狀態(tài)(包括在鑲嵌器(tessellator)單元中用于采樣位移映射(displacement maps的采樣器狀態(tài)).采樣器狀態(tài)以”D3DSAMP_”為前綴重命名會導(dǎo)致從DirectX 8中移植的程序在編譯時報錯。

                下面的表格包含設(shè)置頂點(diǎn)狀態(tài)的所有采樣器狀態(tài):

            Sampler States

            Default Value

            D3DSAMP_DMAPOFFSET

            256

            頂點(diǎn)管道:紋理狀態(tài)

                紋理狀態(tài)控制多紋理混合器的紋理混合操作。使用SetTextureStageState來設(shè)置紋理狀態(tài)。使用SetTexture將一個紋理對象與采樣器層關(guān)聯(lián)。

                下面的表格包含設(shè)置頂點(diǎn)狀態(tài)的所有紋理狀態(tài):

            Texture States

            Default Value

            D3DTSS_TEXCOORDINDEX

            0

            D3DTSS_TEXTURETRANSFORMFLAGS

            D3DTTFF_DISABLE

                D3DTSS_TEXCOORDINDEX是一個固定功能的定點(diǎn)處理狀態(tài)。如果使用可編程的頂點(diǎn)著色器,該狀態(tài)會被忽略。

             

            使用狀態(tài)塊保存像素狀態(tài)

                狀態(tài)塊可以僅用于獲取像素狀態(tài)。下面的狀態(tài)為像素狀態(tài):

            l         像素渲染狀態(tài)

            l         像素紋理狀態(tài)

            l         像素采樣器狀態(tài)

            l         當(dāng)前像素著色器和每個像素著色器常量

            使用狀態(tài)塊獲取像素狀態(tài),需在調(diào)用CreateStateBlock時為第一個參數(shù)指定D3DSBT_PIXELSTATE

            像素管道:渲染狀態(tài)

                設(shè)備渲染狀態(tài)幾乎影響管道每一個部分的行為。調(diào)用SetRenderState設(shè)置渲染狀態(tài)。

                下面的表格包含設(shè)置像素狀態(tài)的所有渲染狀態(tài):

            Render States

            Default Value

            D3DRS_ZENABLE

            D3DZB_FALSE

            D3DRS_SPECULARENABLE

            FALSE

            D3DFILLMODE

            D3DFILL_SOLID

            D3DSHADEMODE

            D3DSHADE_GOURAUD

            D3DRS_ZWRITEENABLE

            TRUE

            D3DRS_ALPHATESTENABLE

            FALSE

            D3DRS_LASTPIXEL

            TRUE

            D3DRS_SRCBLEND

            D3DBLEND_ONE

            D3DRS_DESTBLEND

            D3DBLEND_ZERO

            D3DRS_ZFUNC

            D3DCMP_LESSEQUAL

            D3DRS_ALPHAREF

            0

            D3DRS_ALPHAFUNC

            D3DCMP_ALWAYS

            D3DRS_DITHERENABLE

            FALSE

            D3DRS_FOGSTART

            0

            D3DRS_FOGEND

            1

            D3DRS_FOGDENSITY

            1

            D3DRS_ALPHABLENDENABLE

            FALSE

            D3DRS_DEPTHBIAS

            0

            D3DRS_STENCILENABLE

            FALSE

            D3DRS_STENCILFAIL

            D3DSTENCILOP_KEEP

            D3DRS_STENCILZFAIL

            D3DSTENCILOP_KEEP

            D3DRS_STENCILPASS

            D3DSTENCILOP_KEEP

            D3DRS_STENCILFUNC

            D3DCMP_ALWAYS

            D3DRS_STENCILREF

            0

            D3DRS_STENCILMASK

            0xffffffff

            D3DRS_STENCILWRITEMASK

            0xffffffff

            D3DRS_TEXTUREFACTOR

            0xffffffff

            D3DRS_WRAP0

            0

            D3DRS_WRAP1

            0

            D3DRS_WRAP2

            0

            D3DRS_WRAP3

            0

            D3DRS_WRAP4

            0

            D3DRS_WRAP5

            0

            D3DRS_WRAP6

            0

            D3DRS_WRAP7

            0

            D3DRS_WRAP8

            0

            D3DRS_WRAP9

            0

            D3DRS_WRAP10

            0

            D3DRS_WRAP11

            0

            D3DRS_WRAP12

            0

            D3DRS_WRAP13

            0

            D3DRS_WRAP14

            0

            D3DRS_WRAP15

            0

            D3DRS_LOCALVIEWER

            TRUE

            D3DRS_EMISSIVEMATERIALSOURCE

            D3DMCS_MATERIAL

            D3DRS_AMBIENTMATERIALSOURCE

            D3DMCS_MATERIAL

            D3DRS_DIFFUSEMATERIALSOURCE

            D3DMCS_COLOR1

            D3DRS_SPECULARMATERIALSOURCE

            D3DMCS_COLOR2

            D3DRS_COLORWRITEENABLE

            0x0000000f

            D3DBLENDOP

            D3DBLENDOP_ADD

            D3DRS_SCISSORTESTENABLE

            FALSE

            D3DRS_SLOPESCALEDEPTHBIAS

            0

            D3DRS_ANTIALIASEDLINEENABLE

            FALSE

            D3DRS_Two_Sided_StencilMODE

            FALSE

            D3DRS_CCW_STENCILFAIL

            D3DSTENCILOP_KEEP

            D3DRS_CCW_STENCILZFAIL

            D3DSTENCILOP_KEEP

            D3DRS_CCW_STENCILPASS

            D3DSTENCILOP_KEEP

            D3DRS_CCW_STENCILFUNC

            D3DCMP_ALWAYS

            D3DRS_COLORWRITEENABLE1

            0x0000000f

            D3DRS_COLORWRITEENABLE2

            0x0000000f

            D3DRS_COLORWRITEENABLE3

            0x0000000f

            D3DRS_BLENDFACTOR

            0xffffffff

            D3DRS_SRGBWRITEENABLE

            0

            D3DRS_SEPARATEALPHABLENDENABLE

            FALSE

            D3DRS_SRCBLENDALPHA

            D3DBLEND_ONE

            D3DRS_DESTBLENDALPHA

            D3DBLEND_ZERO

            D3DRS_BLENDOPALPHA

            D3DBLENDOP_ADD

            像素管道:采樣器狀態(tài)

            采樣器狀態(tài)控制采樣相關(guān)的主題,如濾波,貼瓷和紋理坐標(biāo)尋址模式。使用SetSamplerState設(shè)置采樣器狀態(tài)(包括在鑲嵌器(tessellator)單元中用于采樣位移映射(displacement maps的采樣器狀態(tài)).采樣器狀態(tài)以”D3DSAMP_”為前綴重命名會導(dǎo)致從DirectX 8中移植的程序在編譯時報錯。

                下面的表格包含設(shè)置像素狀態(tài)的所有采樣器狀態(tài):

            Sampler States

            Default Value

            D3DSAMP_ADDRESSU

            D3DTADDRESS_WRAP

            D3DSAMP_ADDRESSV

            D3DTADDRESS_WRAP

            D3DSAMP_ADDRESSW

            D3DTADDRESS_WRAP

            D3DSAMP_BORDERCOLOR

            0x00000000

            D3DSAMP_MAGFILTER

            D3DTEXF_POINT

            D3DSAMP_MINFILTER

            D3DTEXF_POINT

            D3DSAMP_MIPFILTER

            D3DTEXF_NONE

            D3DSAMP_MIPMAPLODBIAS

            0

            D3DSAMP_MAXMIPLEVEL

            0

            D3DSAMP_MAXANISOTROPY

            1

            D3DSAMP_SRGBTEXTURE

            0

            D3DSAMP_ELEMENTINDEX

            0

            像素管道:紋理狀態(tài)

            紋理狀態(tài)控制多紋理混合器的紋理混合操作。使用SetTextureStageState來設(shè)置紋理狀態(tài)。使用SetTexture將一個紋理對象與采樣器層關(guān)聯(lián)。

                下面的表格包含設(shè)置像素狀態(tài)的所有紋理狀態(tài):

            Texture States

            Default Value

            D3DTSS_COLOROP

            D3DTOP_DISABLE

            D3DTSS_COLORARG1

            D3DTA_TEXTURE

            D3DTSS_COLORARG2

            D3DTA_CURRENT

            D3DTSS_ALPHAOP

            D3DTOP_DISABLE

            D3DTSS_ALPHAARG1

            D3DTA_TEXTURE

            D3DTSS_ALPHAARG2

            D3DTA_CURRENT

            D3DTSS_BUMPENVMAT00

            0

            D3DTSS_BUMPENVMAT01

            0

            D3DTSS_BUMPENVMAT10

            0

            D3DTSS_BUMPENVMAT11

            0

            D3DTSS_TEXCOORDINDEX

            0

            D3DTSS_BUMPENVLSCALE

            0

            D3DTSS_BUMPENVLOFFSET

            0

            D3DTSS_TEXTURETRANSFORMFLAGS

            D3DTTFF_DISABLE

            D3DTSS_COLORARG0

            D3DTA_CURRENT

            D3DTSS_ALPHAARG0

            D3DTA_CURRENT

            D3DTSS_RESULTARG

            D3DTA_CURRENT

             

             

             

            渲染狀態(tài)

            設(shè)備渲染狀態(tài)幾乎影響管道每一個部分的行為。調(diào)用SetRenderState設(shè)置渲染狀態(tài)。下面的主題包含了附加的信息。

            • Alpha混合狀態(tài)(Alpha Blending State)
            • Alpha測試狀態(tài)(Alpha Testing State)
            • 環(huán)境光照狀態(tài)(Ambient Lighting State)
            • 反走樣狀態(tài)(Antialiasing State)
            • 剔除狀態(tài)(Culling State)
            • 深度緩存狀態(tài)(Depth Buffering State)
            • 霧狀態(tài)(Fog State)
            • 光照狀態(tài)(Lighting State)
            • 輪廓和填充狀態(tài)(Outline and Fill State)
            • 單點(diǎn)顏色狀態(tài)(Per-Vertex Color State)
            • 圖元裁剪狀態(tài)(Primitive Clipping State)
            • 著色狀態(tài)(Shading State)
            • 模板緩存狀態(tài)(Stencil Buffer State)
            • 紋理包裝狀態(tài)(Texture Wrapping State)

             

            Alpha混合狀態(tài)(Alpha Blending State)

            色彩的Alpha值控制其透明度。開啟Alpha混合允許平面上的顏色,材質(zhì)和紋理以透明度混合到其他平面上。

            更多信息參考Alpha紋理混合(Alpha Texture Blending)紋理混合(Texture Blending)

            C++編寫的應(yīng)用程序使用D3DRS_ALPHABLENDENABLE渲染狀態(tài)開啟Alpha透明度混合。Direct3D API允許多種Alpha混合類型。然而,需要注意用戶的3D硬件并不一定支持所有Direct3D允許的混合狀態(tài)。

            Alpha混合類型的設(shè)定依賴于D3DRS_SRCBLENDD3DRS_DESTBLEND渲染狀態(tài)。需要成對使用源混合狀態(tài)和目標(biāo)混合狀態(tài)。下面的代碼舉例說明如何將源混合狀態(tài)設(shè)置為D3DBLEND_SRCCOLOR,將目標(biāo)混合狀態(tài)設(shè)置為D3DBLEND_INVSRCCOLOR

             

            //此代碼假設(shè)d3dDevice為合法的IDirect3DDevice9接口指針

            //設(shè)置源混合狀態(tài)

            d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);

            //設(shè)置目標(biāo)混合狀態(tài)

            d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);

               

                改變源混合狀態(tài)和目標(biāo)混合狀態(tài)會改變在布滿霧或灰層的大氣中的放射性物體的外觀。例如,如果你的應(yīng)用程序模擬在霧環(huán)境中的火焰,力場,等離子束或相似的放射性物質(zhì),將源混合狀態(tài)和目標(biāo)混合狀態(tài)設(shè)置為D3DBLEND_ONE

                其他的Alpha混合應(yīng)用程序用該狀態(tài)來控制3D場景的光照,也稱之為光照映射(light mapping)。根據(jù)源的Alpha信息,將源混合狀態(tài)設(shè)置為D3DBLEND_ZERO并將目標(biāo)混合狀態(tài)設(shè)置為D3DBLEND_SRCALPHA使場景變暗。源圖元在合適的時機(jī)被作為使幀緩存內(nèi)容變暗比例的光照映射(The source primitive is used as a light map that scales the contents of the frame buffer to darken it when appropriate).這生成單色光照映射(This produces monochrome light mapping).

                你可以通過將源Alpha混合狀態(tài)設(shè)置為D3DBLEND_ZERO,把目標(biāo)混合狀態(tài)設(shè)置為D3DBLEND_SRCCOLOR來完成彩色光照映射。

               

            Alpha測試狀態(tài)(Alpha Testing State)

            C++應(yīng)用程序可使用Alpha測試來控制像素何時被吸入渲染目標(biāo)平面。通過使用D3DRS_ALPHATESTENABLE渲染狀態(tài),應(yīng)用程序設(shè)置當(dāng)前Direct3D設(shè)備依照Alpha測試函數(shù)測試每一個像素。如果測試成功,像素被寫在該平面。如果失敗,Direct3D忽略該像素。使用D3DRS_ALPHAFUNC渲染狀態(tài)選擇Alpha測試函數(shù)。應(yīng)用程序可以通過使用D3DRS_ALPHAREF渲染狀態(tài)為所有的像素設(shè)置Alpha參考值用于比較。

            Alpha測試最一般的用途是當(dāng)柵格華對象幾乎透明時用于改進(jìn)性能。如果被柵格化的顏色數(shù)據(jù)比給定像素的顏色值更不透明(D3DCMPCAPS_GREATEREQUAL),則像素被寫入。否則,光柵完全忽略該像素,節(jié)省了對兩個顏色的混合請求的處理。下面的代碼舉例說明檢測是否所給定的比較被支持,如果被支持,設(shè)置比較函數(shù)必要的參數(shù)在渲染時改進(jìn)性能。

            //該例子假設(shè)pCapsD3DCAPS9結(jié)構(gòu)在之前調(diào)用IDirect3D9::GetDeviceCaps
            //
            時被填充
            if(pCaps.AlphaCmpCaps & D3DPCMPCAPS_GREATEREQUAL)
            {
                dev->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x00000001);
                dev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
                dev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
            }
            //
            若該比較不支持,繼續(xù)渲染。
            //
            唯一的缺點(diǎn)是沒有性能的提升。

                并不時所有的硬件支持所有的Alpha測試特性。你可以通過調(diào)用GetDeviceCaps方法檢測設(shè)備能力。在重新獲取設(shè)備能力后,檢測相關(guān)的D3DCAPS9結(jié)構(gòu)的AlphaCmpCaps成員是否支持需要的比較函數(shù)。如果AlphaCmpCaps成員包含僅僅D3DPCMPCAPS_ALWAYS能力或D3DPCMPCAPS_NEVER能力,那驅(qū)動程序不支持Alpha測試。

            環(huán)境光照狀態(tài)(Ambient Lighting State)

            環(huán)境光是環(huán)境從所有方向輻射的光線。要了解Direct3D如何使用環(huán)境光照,參考光照數(shù)學(xué)(Mathematics of Lighting)

            C++應(yīng)用程序通過在調(diào)用SetRenderState方法時給第一個參數(shù)傳遞枚舉值D3DRS_AMBIENT設(shè)置環(huán)境光顏色。第二個參數(shù)為顏色值。默認(rèn)值為0

            d3dDevice->SetRenderState(D3DRS_AMBIENT, 0x00202020);

            反走樣(抗鋸齒)狀態(tài)(Antialiasing State)

            反走樣是使線或邊緣在屏幕上外觀更光滑的方法。默認(rèn)情況下,Direct3D不執(zhí)行反走樣。要開啟全屏反走樣,設(shè)置D3DRS_MULTISAMPLEANTIALIAS渲染狀態(tài)為TRUE。要關(guān)閉反走樣則設(shè)置該渲染狀態(tài)值為FALSE

            剔除狀態(tài)(Culling State)

            要改進(jìn)渲染性能,你可以挑選(或刪除)背離攝像機(jī)的圖元面。對于單面圖元,由于背面不可見,此方法節(jié)省了渲染時間。要開啟剔出,你需要知道定點(diǎn)的環(huán)繞順序(一般為逆時針)。此例子講刪除任何背面向前的圖元(給定逆時針環(huán)繞順序):

            SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

            深度緩存狀態(tài)(Depth Buffering State)

            深度緩存是刪除隱藏線或隱藏面的方法。默認(rèn)情況下,Direct3D不使用深度緩存。

            C++應(yīng)用程序使用D3DRS_ZENABLE渲染狀態(tài)更新深度緩存狀態(tài),使用D3DZBUFFERTYPE枚舉成員以制定新的狀態(tài)值。

            如果你的應(yīng)用程序需要阻止Direct3D寫入深度緩存,可在調(diào)用SetRenderState時使用D3DRS_ZWRITEENABLE枚舉值,并給第二個參數(shù)指定值D3DZB_FALSE

            下面的代碼說明如何將深度緩存狀態(tài)設(shè)置為開啟Z緩存。

            d3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

            應(yīng)用程序也可以使用D3DRS_ZFUNC渲染狀態(tài)來控制Direct3D在執(zhí)行深度緩存時的比較函數(shù)。

            Z偏移是將一個平面在另一平面前顯示的方法,即時他們的深度值相同。你可以使用該技術(shù)實(shí)現(xiàn)變化的效果。一般的例子是渲染墻的陰影。墻和陰影具有相同的深度值。然而,你希望你的應(yīng)用程序在墻上顯示陰影。給陰影加上一個Z偏移使Direct3D合適的顯示他們(參見D3DRS_DEPTHBIAS)。

            霧狀態(tài)(Fog State)

            舞化效果使得3D場景更加真實(shí)。你可以使用霧化效果更好的模擬霧(You can use fog effects for more than simulating fog)。他們同樣可以根據(jù)距離減小場景的清晰度。這反映了現(xiàn)實(shí)世界中發(fā)生的情況;隨著物體遠(yuǎn)離用戶,他們的細(xì)節(jié)變得更模糊。

            C++應(yīng)用程序通過設(shè)備渲染狀態(tài)控制霧化。D3DRENDERSTATETYPE枚舉類型包含的狀態(tài)控制像素(表)或頂點(diǎn)霧是否使用,它們的顏色,系統(tǒng)使用的霧化計算公式和公式的參數(shù)。

            你通過將D3DRS_FOGENABLE渲染狀態(tài)設(shè)置為TRUE開啟霧化效果。可以使用D3DRS_FOGCOLOR渲染狀態(tài)將霧顏色設(shè)置為任意值;霧顏色的Alpha值被忽略。

            D3DRS_FOGTABLEMODED3DRS_FOGVERTEXMODE渲染狀態(tài)控制應(yīng)用于霧計算的公式,它們間接地控制所使用的霧化類型。兩個渲染狀態(tài)可設(shè)置D3DFOGMODE枚舉類型中的成員。分別設(shè)置為這兩個渲染狀態(tài)設(shè)置D3DFOG_NONE值關(guān)閉像素和頂點(diǎn)霧效果。如果兩個渲染狀態(tài)都被設(shè)置為有效的模式,系統(tǒng)僅應(yīng)用像素渲染效果

            D3DRS_FOGSTARTD3DRS_FOGEND渲染狀態(tài)控制D3DFOG_LINEAR模式的霧化公式的參數(shù)。D3DRS_FOGDENSITY渲染狀態(tài)控制指數(shù)(exponential)霧化模式的霧密度。

            光照狀態(tài)(Lighting State)

            如果你不使用頂點(diǎn)著色器或像素著色器進(jìn)行光照,你可以在運(yùn)行時選擇光照引擎。光照引擎要求頂點(diǎn)數(shù)據(jù)中包含每個頂點(diǎn)的法線;沒有法線數(shù)據(jù)的頂點(diǎn)在光照計算時會發(fā)生點(diǎn)積為0的情況。光照計算在光照數(shù)學(xué)(Mathematics of lighting)中有更詳細(xì)的介紹。

            要開啟光照引擎,使用:

            SetRenderState(D3DRS_LIGHTING, TRUE);

            輪廓和填充狀態(tài)(Outline and Fill State)

            沒有紋理的圖元使用由材質(zhì)或頂點(diǎn)顏色指定的顏色進(jìn)行渲染。你可以通過D3DFILLMODE中定義的枚舉值為D3DRSFILLMODE渲染狀態(tài)選擇一個填充方法。

            要開啟抖動(dithering),應(yīng)用程序需給SetRenderState的第一個參數(shù)傳遞D3DRS_DITHERENABLE枚舉值。并設(shè)置第二個參數(shù)為TRUE以打開抖動,設(shè)為FALSE關(guān)閉抖動。

            有時,在繪制直線的最后一個像素時會與周圍的圖元造成難看的重疊。你可以使用D3DRS_LASTPIXEL枚舉值控制此情況的發(fā)生。然而,在裝換該設(shè)置時需要仔細(xì)考慮。在某些情況下,禁止渲染最后一個像素會造成圖元之間難看的裂縫。

            對象輪廓可以通過設(shè)置合適的線繪模式來繪制。默認(rèn)的畫線狀態(tài)為繪制實(shí)線。參考D3DX中的繪線支持(Line Drawing Support in D3DX )渲染狀態(tài)獲取更多信息。

            逐點(diǎn)顏色狀態(tài)(Per-Vertex Color State)

            在執(zhí)行光照時如果你告知運(yùn)行時顯示頂點(diǎn)顏色數(shù)據(jù),Direct3D光照引擎會使用逐頂點(diǎn)顏色數(shù)據(jù)。通過開啟下面的渲染狀態(tài):

            //關(guān)閉逐點(diǎn)顏色渲染
            SetRenderState(D3DRS_COLORVERTEX, FALSE);
            //
            關(guān)閉逐點(diǎn)顏色渲染
            SetRenderState(D3DRS_COLORVERTEX, TRUE);

                如果逐點(diǎn)顏色被開啟,應(yīng)用程序可以配置系統(tǒng)獲取頂點(diǎn)顏色信息的源。D3DRS_AMBIENTMATERIALSOURCE, D3DRS_DIFFUSEMATERIALSOURCE, D3DRS_EMISSIVEMATERIALSOURCED3DRS_SPECULARMATERIALSOURCE渲染狀態(tài)分別控制環(huán)境光,漫反射光,發(fā)射光和鏡面光顏色組成源。每一個狀態(tài)可以被設(shè)置為定義指示系統(tǒng)為指定的顏色成份使用當(dāng)前材質(zhì),漫反射色或鏡面光顏色作為源的D3DMATERIALCOLORSOURCE枚舉類型的成員。

            圖元裁剪狀態(tài)(Primitive Clipping State)

            部分位于(或完全在外)視錐臺的圖元會被裁減,僅渲染圖元的可視部分。裁減使得僅渲染可見的圖元或圖元的可見部分,從而減少了大量工作。

            要使用管道進(jìn)行裁減,設(shè)置D3DRS_CLIPPING渲染狀態(tài)為TRUE(默認(rèn)值)來開啟裁減或設(shè)置為FALSE關(guān)閉Direct3D裁減。

            著色狀態(tài)(Shading State)

            Direct3D支持平面著色和高絡(luò)德著色。默認(rèn)為高絡(luò)德著色。遙控制當(dāng)前著色模式,C++應(yīng)用程序需為D3DRS_SHADEMODE渲染狀態(tài)指定一個D3DSHADEMODE枚舉類型的成員。

            下面的代碼說明如何設(shè)置著色狀態(tài)為平面著色模式:
            d3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);

            模板緩存狀態(tài)(Stencil Buffer State)

            應(yīng)用程序使用模板緩存來決定像素是否被寫入目標(biāo)平面。細(xì)節(jié)參看模板緩存技術(shù)(Stencil Buffer Techniques)

            紋理環(huán)繞狀態(tài)(Texture Wrapping State)

            D3DRS_WRAP0D3DRS_WRAP7渲染狀態(tài)為設(shè)備的多紋理層中多個紋理開啟和關(guān)閉u環(huán)繞和v環(huán)繞(紋理u,v坐標(biāo))。你可以設(shè)置這些渲染狀態(tài)為D3DWRAPCOORD_0D3DWRAPCOORD_1, D3DWRAPCOORD_2D3DWRAPCOORD_3標(biāo)識的或值來開啟紋理第一個,第二個,第三個和第四個方向的環(huán)繞。使用0關(guān)閉所有的環(huán)繞。默認(rèn)情況下禁用所有紋理層所有方向的紋理環(huán)繞。

            posted on 2011-06-05 15:32 風(fēng)輕云淡 閱讀(1283) 評論(0)  編輯 收藏 引用 所屬分類: DX
            国内精品久久九九国产精品| 欧美午夜A∨大片久久| 久久久综合香蕉尹人综合网| 91久久九九无码成人网站| 99久久人妻无码精品系列蜜桃| 色婷婷综合久久久中文字幕| 亚洲精品tv久久久久久久久| 亚洲国产精品无码成人片久久| 日产精品久久久久久久| 久久无码高潮喷水| 精品乱码久久久久久久| 97r久久精品国产99国产精| 99久久成人国产精品免费| 国产一区二区三区久久精品| 久久最近最新中文字幕大全| 一本色道久久88加勒比—综合| 久久99热这里只有精品国产| 欧美日韩成人精品久久久免费看| 亚洲国产成人精品无码久久久久久综合| 久久天天躁狠狠躁夜夜不卡| 久久婷婷五月综合色奶水99啪 | 精品无码久久久久久午夜| 久久久久亚洲AV片无码下载蜜桃| 国产精品欧美久久久天天影视| 亚洲精品高清久久| 欧美激情一区二区久久久| 久久精品国产亚洲av麻豆小说| 色成年激情久久综合| 伊人久久大香线蕉综合热线| 国产精品久久久久久吹潮| 久久影视国产亚洲| 国产91色综合久久免费| 香蕉99久久国产综合精品宅男自 | 久久亚洲精品成人av无码网站| 99久久超碰中文字幕伊人| 欧美性猛交xxxx免费看久久久| 久久久久亚洲av无码专区喷水| 久久人人爽人人澡人人高潮AV | 97香蕉久久夜色精品国产| 久久99国产精品一区二区| 人人妻久久人人澡人人爽人人精品|