青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

D3D中的模板緩存(1)

模板緩存是一個(gè)離屏緩存,我們能夠用它來(lái)完成一些特效。模板緩存與后臺(tái)緩存和深度緩存有相同的定義,因此在模板緩存中的像素與后臺(tái)緩存和深度緩存中的像素是相協(xié)調(diào)的。就象名字所說(shuō),模板緩存就象一個(gè)模板它允許我們刷新渲染后緩存的某個(gè)部分。

       舉例,當(dāng)要實(shí)現(xiàn)一個(gè)鏡子時(shí),我們只需要簡(jiǎn)單地反射一個(gè)物體細(xì)節(jié)到鏡子平面上;然而,我們僅僅想只繪制鏡子里的反射結(jié)果。我們能用模板緩存來(lái)渲染它,圖8.1清楚的顯示了這一點(diǎn)。

模板緩存是Direct3D中的一小部分,它是通過(guò)一個(gè)簡(jiǎn)單的表面而被約束的。就象混合,這個(gè)簡(jiǎn)單的表面提供了可變的強(qiáng)大的設(shè)置能力。有效地學(xué)習(xí)使用模板緩存最好的方法是通過(guò)學(xué)習(xí)實(shí)際的應(yīng)用程序。一旦你學(xué)懂了一點(diǎn)應(yīng)用程序中的模板緩存,你將會(huì)得到一個(gè)更好的用于你自己需要特效的主意。

 

8.1使用模板緩存

為了使用模板緩存,我們?cè)诔跏蓟疍irect3D時(shí)必須首先請(qǐng)求一個(gè),然后必須啟用它。為了啟用模板緩存,我們必須設(shè)置D3DRS_STENCILENABLE渲染狀態(tài)并且指定它為true(關(guān)閉它即可指定為false)。下面的代碼是啟用和關(guān)閉模板緩存的代碼:

Device->SetRenderState(D3DRS_STENCILENABLE, true);

... // do stencil work

Device->SetRenderState(D3DRS_STENCILENABLE, false);

我們可以使用IDirect3DDevice9::Clear方法來(lái)清除模板緩存并讓其擁有默認(rèn)值。回憶一下,同樣的方法被用在清除后緩存和深度緩存中。

Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL, 0xff000000, 1.0f, 0 );

注意我們已經(jīng)添加了D3DCLEAR_STENCIL到第三個(gè)參數(shù)中,它表示我們想把模板緩存和目標(biāo)(后緩存)以及深度緩存一起清除。有6種值可以用來(lái)指定清除后的模板緩存;在這個(gè)例子中我們將它清除為0。

 

8.1.1請(qǐng)求一個(gè)模板緩存

在我們創(chuàng)建深度緩存的同時(shí)一個(gè)模板緩存能夠被創(chuàng)建。當(dāng)指定深度緩存格式的時(shí)候,我們同時(shí)指定模板緩存的格式。這樣,模板緩存和深度緩存分享同一個(gè)離屏表面緩存,但是每個(gè)像素被指定到各自緩存內(nèi)存片段中。下面列出了3種深度/模板緩存的格式:

D3DFMT_D24S8—這種格式是說(shuō)創(chuàng)建一個(gè)32位深度/模板緩存,其中24位為深度緩存,8位為模板緩存。

D3DFMT_D24X4S4—這種格式是說(shuō)創(chuàng)建一個(gè)32位深度/模板緩存,其中24位為深度緩存,4位為模板緩存,還有4位留著不用。

D3DFMT_D15S1—這種格式是說(shuō)創(chuàng)建一個(gè)16位深度/模板緩存,其中15位為深度緩存,1位為模板緩存。

注意,還有一些格式?jīng)]有分配任何位給模板緩存。例如,D3DFMT_D32格式是說(shuō)只創(chuàng)建一個(gè)32位深度緩存。

       同樣,不同硬件對(duì)模板緩存的支持也是不同的。例如有些顯卡就不支持8位模板緩存。

 

8.1.2模板測(cè)試

       如前所述,我們能夠使用模板緩存來(lái)阻止渲染后緩存中的某些部分。阻止特殊像素被寫是通過(guò)模板測(cè)試(stencil test)來(lái)決定的,這是通過(guò)下面的表達(dá)式來(lái)完成的:

(ref & mask) ComparisonOperation (value & mask)

模板測(cè)試是對(duì)每個(gè)像素進(jìn)行的,假設(shè)模板是被允許。將有兩個(gè)操作:

左手邊操作數(shù)(LHS=ref&mask

右手邊操作數(shù)(RHS=value&mask

模板測(cè)試比較LHS和RHS,通過(guò)比較運(yùn)算來(lái)指定。全部的運(yùn)算都得到一個(gè)布爾值(true/false)。假如測(cè)試的結(jié)果是true,那么我們把像素寫入后緩存。假如測(cè)試的結(jié)果是false,我們就阻止像素被寫入后緩存。當(dāng)然,如果像素不能被寫入后緩存,那么它也不能被寫入深度緩存。

 

8.1.3控制模板測(cè)試

       Direct3D允許我們控制變量用于模板測(cè)試。換句話說(shuō),我們可以指定參考值(stencil reference)和掩碼(mask value),以便進(jìn)行比較運(yùn)算。雖然我們不能明確地設(shè)定模板值(stencil value),但是我們能夠控制寫入模板緩存的值。

8.1.3.1模板參考值(Reference Value)

模板參考值ref的默認(rèn)值為0,但是我們能夠通過(guò)設(shè)置D3DRS_STENCILREF渲染狀態(tài)來(lái)改變它。例如,下面的代碼就是設(shè)置模板參考值為1:

Device->SetRenderState(D3DRS_STENCILREF, 0x1);     

注意我們往往使用16進(jìn)制,因?yàn)檫@讓它看起來(lái)比整數(shù)更容易象一個(gè)位隊(duì)列,并且當(dāng)我們做位操作時(shí)這樣看起來(lái)更有用,比如相加。

8.1.3.2模板掩碼

模板掩碼值mask是被用來(lái)掩飾(隱藏)在ref和value變量中的位。它的默認(rèn)值是0xffffffff,也就是沒(méi)有掩飾任何位。我們能夠通過(guò)設(shè)置D3DRS_STENCILMASK渲染狀態(tài)來(lái)改變它。下面的例子就是掩飾高16位:

Device->SetRenderState(D3DRS_STENCILMASK, 0x0000ffff);

 

8.1.3.3模板值(Stencil Value)

假如我們對(duì)第i行第j列的像素進(jìn)行模板測(cè)試,那么該值將被寫入第i行第j列的模板緩存。我們不能明確地設(shè)置個(gè)別模板值,但是可以清除模板緩存。我們能夠使用模板渲染狀態(tài)來(lái)控制將什么寫入模板緩存。

 

8.1.3.4比較運(yùn)算

我們能夠通過(guò)設(shè)置D3DRS_STENCILFUNC渲染狀態(tài)來(lái)設(shè)置比較運(yùn)算。這個(gè)比較運(yùn)算能夠被D3DCMPFUNC的任何成員類型列舉:

typedef enum _D3DCMPFUNC {

       D3DCMP_NEVER = 1,

       D3DCMP_LESS = 2,

       D3DCMP_EQUAL = 3,

       D3DCMP_LESSEQUAL = 4,

       D3DCMP_GREATER = 5,

       D3DCMP_NOTEQUAL = 6,

       D3DCMP_GREATEREQUAL = 7,

       D3DCMP_ALWAYS = 8,

       D3DCMP_FORCE_DWORD = 0x7fffffff

} D3DCMPFUNC;

D3DCMP_NEVER——模板測(cè)試永不成功。
D3DCMP_LESS——假如LHS < RHS,那么模板測(cè)試成功。
D3DCMP_EQUAL——假如LHS = RHS,那么模板測(cè)試成功。
D3DCMP_LESSEQUAL——假如LHS <= RHS,那么模板測(cè)試成功。
D3DCMP_GREATER——假如LHS > RHS,那么模板測(cè)試成功。
D3DCMP_NOTEQUAL——假如LHS <> RHS,那么模板測(cè)試成功。
D3DCMP_GREATEREQUAL——假如LHS >= RHS,那么模板測(cè)試成功。
D3DCMP_ALWAYS——模板測(cè)試總是成功。

8.1.3更新模板緩存

除了決定是否寫或阻止一個(gè)特殊像素被寫入后緩存以外,我們能夠定義模板緩存基于三種可能的案例怎樣被更新:

對(duì)于ijth像素模板測(cè)試失敗。我們能夠定義怎樣更新在模板緩存中的ijth,通過(guò)設(shè)置D3DRS_STENCILFAIL渲染狀態(tài)來(lái)適應(yīng)這種情形:

Device->SetRenderState(D3DRS_STENCILFAIL, StencilOperation);

對(duì)于ijth像素深度測(cè)試失敗。我們能夠定義怎樣更新在模板緩存中的ijth,通過(guò)設(shè)置D3DRS_STENCILZFAIL渲染狀態(tài)來(lái)適應(yīng)這種情形:

Device->SetRenderState(D3DRS_STENCILZFAIL, StencilOperation);

對(duì)于ijth像素模板測(cè)試和深度測(cè)試都成功。我們能夠定義怎樣更新在模板緩存中的ijth,通過(guò)設(shè)置D3DRS_STENCILPASS渲染狀態(tài)來(lái)適應(yīng)這種情形:

Device->SetRenderState(D3DRS_STENCILPASS, StencilOperation);

其中StencilOperation能夠是下面預(yù)先定義的常數(shù):

D3DSTENCILOP_KEEP——指定不改變模板緩存。
D3DSTENCILOP_ZERO——指定設(shè)置模板緩存入口為0。
D3DSTENCILOP_REPLACE——指定用模板參考值(reference value)來(lái)替換模板緩存入口。
D3DSTENCILOP_INCRSAT——指定增加模板緩存入口。假如增加的值超過(guò)了允許的最大值,我們就設(shè)置它為最大值。
D3DSTENCILOP_DECRSAT——指定減少模板緩存入口。假如減少后的值小于了0,我們就設(shè)置它0。
D3DSTENCILOP_INVERT——指定按位取反模板緩存入口。
D3DSTENCILOP_INCR——指定增加模板緩存入口。假如增加的值超過(guò)了允許的最大值,我們就設(shè)置它為0。
D3DSTENCILOP_DECR——指定減少模板緩存入口。假如減少后的值小于了0,我們就設(shè)置它為允許的最大值。

 

8.1.4模板寫掩碼

除了已經(jīng)提及的模板渲染狀態(tài)之外,我們能夠設(shè)置一個(gè)寫掩碼(write mask)它將屏蔽我們寫進(jìn)模板緩存的任何值的位。我們能夠通過(guò)D3DRS_STENCILWRITEMASK渲染狀態(tài)來(lái)設(shè)置寫掩碼。它的默認(rèn)值是0xffffffff。下面的例子是掩飾高16位:

Device->SetRenderState(D3DRS_STENCILWRITEMASK, 0x0000ffff);


posted on 2008-03-19 15:02 lovedday 閱讀(4036) 評(píng)論(1)  編輯 收藏 引用

評(píng)論

# re: D3D中的模板緩存(1) 2013-01-22 14:21 ANT

不給力  回復(fù)  更多評(píng)論   


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线观看国产精品网站| 午夜亚洲视频| 亚洲破处大片| 久久久五月天| 一区二区三区视频观看| 欧美激情黄色片| 亚洲国产精品视频一区| 欧美一区二区大片| 亚洲精品乱码久久久久久日本蜜臀| 久久精品国产清自在天天线| 国产精品欧美激情| 欧美一级片久久久久久久| 一本一本久久| 欧美日韩免费高清| 一本一本久久a久久精品综合麻豆| 美女脱光内衣内裤视频久久影院| 亚洲欧美中文日韩v在线观看| 欧美新色视频| 欧美影视一区| 午夜欧美大片免费观看| 国产精品伊人日日| 久久高清一区| 久久精品二区| 亚洲国产欧美日韩| 欧美精品久久久久久| 夜夜嗨av色综合久久久综合网| 亚洲国产精彩中文乱码av在线播放| 噜噜噜躁狠狠躁狠狠精品视频| 欧美成人精品在线观看| 久久成人亚洲| 欧美一级淫片播放口| 国产精品永久在线| 欧美一站二站| 久久久久国产精品一区三寸| 亚洲娇小video精品| 亚洲精选一区| 国产精品日韩久久久久| 久久亚洲精品一区二区| 欧美韩日一区二区| 亚洲伊人一本大道中文字幕| 午夜在线观看免费一区| 亚洲大胆视频| 日韩一区二区精品| 国产精品亚洲综合一区在线观看| 久久综合影视| 欧美啪啪一区| 久久av一区| 免费看av成人| 亚洲欧美中文在线视频| 久久久999国产| 亚洲精品在线电影| 亚洲婷婷综合久久一本伊一区| 国产欧美一区二区三区国产幕精品 | 亚洲午夜视频在线观看| 国产亚洲精品久久久| 亚洲国产日韩欧美综合久久| 国产精品久久久久91| 欧美成人精品在线| 国产精品免费看| 欧美大色视频| 欧美一区二区三区视频免费播放 | 久久精品国产第一区二区三区最新章节| 欧美在线电影| 亚洲午夜精品一区二区| 猫咪成人在线观看| 久久久不卡网国产精品一区| 欧美超级免费视 在线| 欧美亚洲免费高清在线观看| 欧美黄色免费网站| 麻豆成人综合网| 国产女主播在线一区二区| 亚洲精品国产精品乱码不99按摩 | 亚洲精品久久嫩草网站秘色| 亚洲欧美不卡| 一区二区三区四区五区视频| 鲁鲁狠狠狠7777一区二区| 久久成人精品视频| 欧美另类变人与禽xxxxx| 欧美r片在线| 国内伊人久久久久久网站视频 | 久久久精品国产一区二区三区 | 欧美中文字幕第一页| 性欧美video另类hd性玩具| 亚洲深夜福利在线| 亚洲乱码一区二区| 久久婷婷av| 久久精品综合一区| 国产精品三上| 99re这里只有精品6| 亚洲国产精品福利| 久久精品一区二区三区四区| 香蕉久久一区二区不卡无毒影院| 欧美日韩亚洲一区二区三区在线观看 | 亚洲一区二区动漫| 欧美精品日韩www.p站| 亚洲电影免费| 亚洲人成人一区二区三区| 欧美www视频| 亚洲承认在线| 亚洲人成网站999久久久综合| 欧美成人久久| 99国产精品久久久久久久成人热 | 亚洲第一区在线| 亚洲精品视频在线播放| 欧美激情亚洲激情| 日韩亚洲精品在线| 亚洲欧美视频在线观看视频| 国产精品乱码妇女bbbb| 亚洲男人的天堂在线观看| 久久经典综合| 亚洲国产美女| 欧美视频一区在线观看| 亚洲综合视频网| 麻豆国产va免费精品高清在线| 在线观看欧美成人| 欧美久久久久| 一区二区三区.www| 久久精品一区二区三区四区 | 99re在线精品| 国产精品免费一区二区三区观看| 亚洲尤物在线视频观看| 久久国产日韩欧美| 亚洲精品国偷自产在线99热| 欧美日韩国产欧美日美国产精品| 在线视频亚洲一区| 老鸭窝亚洲一区二区三区| 日韩亚洲欧美一区| 国产一区二区三区四区在线观看 | 欧美成人精品影院| 亚洲伊人第一页| 欧美成人午夜视频| 亚洲欧美日韩系列| 91久久黄色| 久久久久亚洲综合| 一区二区三区四区蜜桃| 好看不卡的中文字幕| 欧美精品在线观看| 久久超碰97人人做人人爱| 亚洲精品韩国| 久久精品国产亚洲精品| 99re热这里只有精品免费视频| 国产婷婷色综合av蜜臀av| 国产精品xvideos88| 欧美日韩国产综合新一区| 性伦欧美刺激片在线观看| 亚洲国产日韩欧美一区二区三区| 欧美一区二区三区喷汁尤物| 亚洲国产小视频| 国产亚洲欧美中文| 欧美性做爰猛烈叫床潮| 欧美va亚洲va国产综合| 亚洲欧美国产三级| 一区二区三区精品| 亚洲人成在线影院| 欧美国产日产韩国视频| 久久久国产精品一区| 亚洲欧美中文日韩在线| 这里只有精品在线播放| 亚洲国产精品成人综合| 国产一区免费视频| 国产精品丝袜91| 欧美色图五月天| 欧美日韩国产首页| 免费亚洲电影在线| 久久婷婷综合激情| 久久精品91久久久久久再现| 亚洲欧美日韩一区二区在线| 亚洲免费观看高清在线观看 | 日韩视频不卡中文| 亚洲欧洲日产国产网站| 亚洲黄色尤物视频| 亚洲国产成人av| 伊人激情综合| 精品二区久久| 在线观看国产成人av片| 尤物99国产成人精品视频| 在线精品观看| 亚洲破处大片| 99re66热这里只有精品4| 日韩视频精品在线| 在线视频你懂得一区二区三区| 日韩午夜电影| 亚洲香蕉在线观看| 亚洲欧美成人综合| 久久www免费人成看片高清| 久久精品视频免费| 久久理论片午夜琪琪电影网| 麻豆精品精品国产自在97香蕉| 猫咪成人在线观看| 亚洲高清久久网| 亚洲欧洲一区| 一区二区精品在线观看| 一区二区三区精品在线| 亚洲永久网站| 久久久久88色偷偷免费| 欧美成人自拍| 国产精品入口尤物| 在线观看精品视频| 99精品热视频只有精品10| 羞羞色国产精品|