




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
深度測(cè)試與混合第一頁,共四十頁,2022年,8月28日8.1深度測(cè)試在的場(chǎng)景中,通常有多個(gè)物體需要繪制,這些物體之間通常會(huì)存在遮擋關(guān)系,離觀察點(diǎn)較遠(yuǎn)的物體會(huì)因?yàn)榻幬矬w的遮擋而不可見或只有部分可見,D3D圖形系統(tǒng)提供了嘗試測(cè)試功能來實(shí)現(xiàn)這種效果。第二頁,共四十頁,2022年,8月28日8.1.2使用深度測(cè)試第三頁,共四十頁,2022年,8月28日創(chuàng)建深度緩沖區(qū)若要在D3D圖形程序中應(yīng)用嘗試測(cè)試,首先必須在創(chuàng)建D3D渲染設(shè)備時(shí)創(chuàng)建深度緩沖區(qū):D3DPRESENT_PARAMETERS3dpp;ZeroMemory(&d3dpp,sizeof(d3dpp));d3dpp.windowed=TRUE;d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;d3dpp.EnableAutoDepthStencil=TURE;d3dpp.AutoDepthStencilFormat=D3DFMT_D16;第四頁,共四十頁,2022年,8月28日參數(shù)說明深度緩沖區(qū)是D3D渲染設(shè)備的一項(xiàng)屬性,為了創(chuàng)建一個(gè)由D3D管理的深度緩沖區(qū),只需設(shè)置結(jié)構(gòu)體D3DPRENSENT_PARAMETERS相應(yīng)的成員即可,在上面的代碼中,d3dpp.EnableAutoDepthStencil賦值為TRUE,表示由D3D創(chuàng)建并管理一個(gè)深度緩沖區(qū)。d3dpp.AutoDepthStencilFormat賦值為D3DFMT_D16,表示深度緩沖中每一個(gè)像素的深度值由16位的二進(jìn)制數(shù)表示。第五頁,共四十頁,2022年,8月28日激活深度測(cè)試深度緩沖區(qū)隨D3D渲染設(shè)備創(chuàng)建好之后,調(diào)用D3D渲染狀態(tài)設(shè)置函數(shù)IDirect3DDevice9::SetRenderState(),將第一個(gè)參數(shù)設(shè)置為D3DRS_ZENABLE,第二個(gè)參數(shù)設(shè)置為TRUE,激活深度測(cè)試。
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE,TRUE);第六頁,共四十頁,2022年,8月28日設(shè)置深度測(cè)試函數(shù)接下來仍然調(diào)用:
IDirect3DDevice9::SetRenderState()函數(shù)設(shè)置舉薦度測(cè)試函數(shù),第一個(gè)參數(shù)設(shè)置為D3DRS_ZRUNC;第二個(gè)參數(shù)設(shè)置為想要設(shè)置的深度測(cè)試函數(shù),它屬于D3DCMPFUNC枚舉類型。第七頁,共四十頁,2022年,8月28日D3DCMPFUNC枚舉類型定義typedefenum3DCMPRUNC{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=ox77777777}D3DCMPFUNC;第八頁,共四十頁,2022年,8月28日D3DCMPFUNC枚舉值及其說明D3DCMP_NEVER深度測(cè)試函數(shù)總返回FALSED3DCMP_LESS測(cè)試點(diǎn)深度值小于嘗試緩沖區(qū)中相應(yīng)值時(shí),返回TRUED3DCMP_EQUAL測(cè)試點(diǎn)深度值等于嘗試緩沖區(qū)中相應(yīng)值時(shí),返回TRUED3DCMP_LESSEQUAL測(cè)試點(diǎn)深度值小于等于嘗試緩沖區(qū)中相應(yīng)值時(shí),返回TRUE第九頁,共四十頁,2022年,8月28日D3DCMPFUNC枚舉值及其說明(續(xù)表)D3DCMP_GREATER測(cè)試點(diǎn)深度值大于嘗試緩沖區(qū)中相應(yīng)值時(shí),返回TRUED3DCMP_NOTEQUAL測(cè)試點(diǎn)深度值不等于嘗試緩沖區(qū)中相應(yīng)值時(shí),返回TRUED3DCMP_GREATEREQUAL測(cè)試點(diǎn)深度值大于等于嘗試緩沖區(qū)中相應(yīng)值時(shí),返回TRUED3DCMP_ALWAYS深度測(cè)試函數(shù)總返回TRUED3DCMP_FORCE_DWORD該枚舉不使用,用于保證將D3DCMFUNC枚舉類型編譯為32位第十頁,共四十頁,2022年,8月28日通常深度測(cè)試函數(shù)設(shè)置為D3DCMP_LESS,表示當(dāng)測(cè)試點(diǎn)深度值小于深度緩沖區(qū)中相應(yīng)值時(shí),通過測(cè)試并繪制相關(guān)像素,這樣沒有被遮擋的物體才顯示,而被遮擋住的物體就不顯示。如:g_pd3dDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESS);第十一頁,共四十頁,2022年,8月28日更新深度緩沖區(qū)設(shè)置了深度測(cè)試函數(shù)后,還需要設(shè)置深度測(cè)試成功時(shí)對(duì)深度緩沖區(qū)如何操作:是保持原來的深度值,還是用當(dāng)前像素的嘗試值更新對(duì)應(yīng)的數(shù)值,如:g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
第十二頁,共四十頁,2022年,8月28日8.2半透明物體的繪制在前面已經(jīng)遇到了Alpha值的概念。如結(jié)構(gòu)D3CCOLORVALUE中的變量a,但它并沒有被使用,因?yàn)檫€沒有激活A(yù)lpha混合,并且Alpha總是被賦值為1.0f。默認(rèn)狀態(tài)下Alpha為1.0f表示完全不透明。第十三頁,共四十頁,2022年,8月28日8.2.1Alpha混合原理前面的示例程序中,繪制圖形的顏色總是替換當(dāng)前顏色緩沖區(qū)中存在的顏色值,這樣后畫的物體總是覆蓋在原有的物體上。但是當(dāng)想要繪制類似于玻璃、水等具有透明效果的物體時(shí),這種方法顯然滿足不了要求。通過定義一個(gè)表示物體半透明度的Alpha值和一個(gè)半透明計(jì)算公式,可以把將要繪制的物體顏色與顏色緩沖區(qū)中存在的顏色相混合,從而繪制出具有半透明效果的物體。第十四頁,共四十頁,2022年,8月28日D3D計(jì)算Alpha顏色混合的方法如下:
Color=(RGBsrcKsrc)OP(RGBdistKdist)
其中Color表示Alpha混合后的顏色值;RGBsrc表示源顏色值,即將要繪制的圖形的顏色值,Ksrc表示源混合系統(tǒng),通常賦值為表示物體半透明程度的Alpha值,也可以是屬于枚舉D3DBLEND的任意值,用來和RGBsrc相乘;RGBdist表示目標(biāo)顏色值,即當(dāng)前顏色緩沖區(qū)中的顏色值;Kdist表示目標(biāo)混合系統(tǒng),可以是屬于枚舉D3DBLEND的任意值,用來和RGBdist相乘;OP表示源計(jì)算結(jié)果與顏色緩沖區(qū)計(jì)算結(jié)果的混合方法,默認(rèn)狀態(tài)下OP為D3DBLEND_ADD,即源計(jì)算結(jié)果與顏色緩沖區(qū)計(jì)算結(jié)果相加。因此,Alpha混合顏色的公式變?yōu)椋?/p>
Color=(RGBsrcAlpha)+(RGBdist(1-Alpha))第十五頁,共四十頁,2022年,8月28日8.2.2利用Alpha混合實(shí)現(xiàn)半透明效果示例程序AlphaBlend模擬了直升機(jī)螺旋槳的半透明效果。在程序初始化階段,載入了Heli.x文件,它是一個(gè)包含直升機(jī)的三維模型文件,其中螺旋槳的材質(zhì)的漫反射屬性被設(shè)為(R,G,B,A)=(0.1837;0.1837;0.1837;0.500),可以用文件方式打開Heli查看它的材質(zhì)屬性,Heli.x是一個(gè)文件格式的.x文件。第十六頁,共四十頁,2022年,8月28日啟用Alpha混合要繪制半透明物體,首先需要激活D3D的Alpha混合運(yùn)算。調(diào)用D3D渲染狀態(tài)設(shè)置函數(shù)IDirect3DDevice9::SetRenderState(),將第一個(gè)參數(shù)設(shè)置為D3DRS_ALPHABLENDENABLE,第二個(gè)參數(shù)可以設(shè)置為TRUE。g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);第十七頁,共四十頁,2022年,8月28日設(shè)置Alapha混合系數(shù)在上面介紹的Alpha混合原理中提到的源系數(shù)和目標(biāo)混合系數(shù),也是通過D3D的渲染狀態(tài)設(shè)置數(shù)設(shè)置的。若將第一個(gè)參數(shù)設(shè)置為D3DRS_SCRBLEND,則用于設(shè)置源混合系數(shù),若將第二個(gè)參數(shù)可以設(shè)置為D3DBLEND枚舉常量。第十八頁,共四十頁,2022年,8月28日枚舉常量D3DBLEND的常用值D3DBLEND_ZEROAlpha混合系數(shù)為0D3DBLEND_ONEAlpha混合系數(shù)為1D3DBLEND_SRCCOLORAlpha混合系數(shù)為當(dāng)前繪制像素的Color值,(Rs,Gs,Bs,As)。D3DBLEND_INVERCCOLORAlpha混合系數(shù)為1-當(dāng)前繪制像素的Color值(1-Rs,1-Gs,1-Bs,1-As)。D3DBLEND_SRCALPHAAlpha混合系數(shù)為當(dāng)前繪制像素的Alpha。D3DBLEND_INVSRCALPHAAlpha混合系數(shù)為1-當(dāng)前繪制像素的Alpha值。第十九頁,共四十頁,2022年,8月28日枚舉常量D3DBLEND的常用值(續(xù))D3DBLEND_DESTALPHAAlpha混合系數(shù)為顏色緩沖區(qū)中像素的Alpha值。D3DBLEND_INVDESTALPHAAlpha混合系數(shù)為1-顏色緩沖區(qū)中像素的Alpha值。D3DBLEND_DESTCOLORAlpha混合系數(shù)為顏色緩沖區(qū)中像素的Color值。D3DBLEND_INVDESTCOLORAlpha混合系數(shù)為1-顏色緩沖區(qū)中像素的Color值。(1-Rd,1-Gd,1-Bd,1-Ad)第二十頁,共四十頁,2022年,8月28日示例程序中設(shè)置Alpha混合系數(shù)的代碼g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DRSBLEND_SRCALPHA);g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DRSBLEND_INVSRCALPHA);第二十一頁,共四十頁,2022年,8月28日設(shè)置Alpha混合方法
Alpha混合方法指定源目標(biāo)顏色和目標(biāo)顏色的混合方法。Alpha混合方法也是通過D3D渲染狀態(tài)設(shè)置函數(shù)IDirect3DDevice::SetRenderState()設(shè)置的,其中第一參數(shù)設(shè)置為D3DRS_BLENDOP,第二參數(shù)設(shè)置為D3DBLENDO枚舉常量。第二十二頁,共四十頁,2022年,8月28日D3DBLENDOP的常用值D3DBLENDOP_ADD源計(jì)算結(jié)果與顏色緩沖區(qū)計(jì)算結(jié)果相加D3DBLENDOP_SUBTRACT源計(jì)算結(jié)果送去顏色緩沖區(qū)計(jì)算結(jié)果D3DBLENDOP_REVSUBTRACT顏色緩沖區(qū)計(jì)算結(jié)果減去計(jì)算結(jié)果D3DBLENDOP_MINMIN(源計(jì)算結(jié)果,顏色緩沖區(qū)計(jì)算結(jié)果)D3DBLENDOP_MAXMAX(源計(jì)算結(jié)果,顏色緩沖區(qū)計(jì)算結(jié)果)應(yīng)用程序采用默認(rèn)的Alpha混合方法D3DBLEND_ADD第二十三頁,共四十頁,2022年,8月28日8.2.3Alpha混合系數(shù)
Alpha源混合系數(shù)通常設(shè)置為:
D3DBLEND_SRCALPHA,即當(dāng)前繪制像素的Alpha值;目標(biāo)混合系數(shù)設(shè)置為:
D3DBLEND_INVSRCALPHA,即1減去當(dāng)前繪制像素的Alpha值。如果沒有使用材質(zhì)和紋理,當(dāng)前繪制像素的Alpha值來自每個(gè)頂點(diǎn)顏色設(shè)置的Alpha值;如果使用燈光和材質(zhì),則當(dāng)前像素的Alpha來自物體表面材質(zhì);如果為物體表面使用了紋理則Alpha值還與紋理有關(guān)。第二十四頁,共四十頁,2022年,8月28日頂點(diǎn)Alpha如果在程序中直接指定每個(gè)頂點(diǎn)的顏色,則可以直接給出每個(gè)頂點(diǎn)顏色的Alpha值,可以在定義頂點(diǎn)時(shí)直接聲明該頂點(diǎn)的Alpha值,也可以在程序運(yùn)行時(shí)動(dòng)態(tài)地修改頂點(diǎn)的Alpha值。有了頂點(diǎn)的Alpha值,渲染對(duì)象中每個(gè)像素的Alpha值由該對(duì)象的頂點(diǎn)Alpha值和著色模式?jīng)Q定。當(dāng)著色模式為平面著色模式時(shí),構(gòu)成對(duì)象的各個(gè)多邊形中所有像素的Alpha值都等于該多邊形的第一個(gè)頂點(diǎn)的Alpha值;當(dāng)著色模式為戈勞德著色模式時(shí),每個(gè)多邊形面上的像素的Alpha值是它的各個(gè)頂點(diǎn)的Alpha進(jìn)行線性插值得到的。第二十五頁,共四十頁,2022年,8月28日啟用Alpha混合并設(shè)置相應(yīng)的混合系數(shù)g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_INVSRCALPHA);第二十六頁,共四十頁,2022年,8月28日然后,在設(shè)置三角形每個(gè)頂點(diǎn)顏色時(shí),將Alpha值設(shè)置為十六進(jìn)制數(shù)0x50,3個(gè)頂點(diǎn)都設(shè)置為紅色:CUSTOMVERTEXvertices[]={{100.0f,400.0f,0.5,1.0f,0x50ff0000},{300.0f,50.0f,0.5f,1.0f,0x50ff0000},{500.0f,400.0f,0.5f,1.0f,0x50ff0000},};第二十七頁,共四十頁,2022年,8月28日caseWM_KEYDOWN:switch(wParam){case48:g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);break;case49:g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);break;}第二十八頁,共四十頁,2022年,8月28日材質(zhì)Alpha頂點(diǎn)Alpha是沒有使用燈光和材質(zhì)的情況,如果對(duì)場(chǎng)景內(nèi)的物體添加了燈光和材質(zhì)而沒有添加紋理時(shí),頂點(diǎn)Alpha值取決于材質(zhì)屬性中漫反射屬性中的Alpha系數(shù)和燈光顏色中的Alpha值,頂點(diǎn)Alpha值,頂點(diǎn)Alpha值是根據(jù)光照計(jì)算得到的。在第5章中我們知道,頂點(diǎn)光照計(jì)算是分別針對(duì)紅、綠、藍(lán)和Alpha分別進(jìn)行的。其中alpha光照計(jì)算的結(jié)果就是頂點(diǎn)的Alpha值。有了頂點(diǎn)的Alpha值就可根據(jù)著色模式計(jì)算出每個(gè)像素的Alpha值。第二十九頁,共四十頁,2022年,8月28日紋理Alpha當(dāng)對(duì)物體表面使用了紋理之后,像素的Alpha值就是紋理Alpha混合之后的值,所以這又取決于紋理的的Alpha混合方法,紋理Alpha混合方法決定了紋理Alpha混合之后的Alpha值是取自材料,還是取自紋理,或者是取自兩者的某種去處。像素Alpha值的具體計(jì)算過程是這樣的,首先得到頂點(diǎn)Alpha值,頂點(diǎn)Alpha值可能是直接指定的,也可能是光照計(jì)算得到,然后根據(jù)著色模式對(duì)頂點(diǎn)Alpha值進(jìn)行插值,得到的結(jié)果再根據(jù)紋理Alpha混合方法和紋理采樣得到的Alpha值進(jìn)行指定的運(yùn)算,得到最終每個(gè)像素的Alpha值。紋理Alpha混合方法和紋理顏色混合方法基本相同,區(qū)別是紋理Alpha混合的結(jié)果是像素的Alpha值,紋理顏色混合的結(jié)果是像素顏色RGB值。第三十頁,共四十頁,2022年,8月28日一個(gè)紋理Alpha混合的示例m_pd3dDevice->SetTextureStageState(0,D3DDTSS_ALPHAOP,D3DTOP_MODULATE);m_pd3dDevice->SetTextureStageState(0,D3DDTSS_ALPHAARG1,D3DTA_TEXTURE);m_pd3dDevice->SetTextureStageState(0,D3DDTSS_ALPHAARG2,D3DTA_DIFFUSE);第三十一頁,共四十頁,2022年,8月28日8.3Alpha測(cè)試透過那些透明度非常高的物體看其他物體,例如透過幾乎完全透明的玻璃看其他物體,會(huì)感到玻璃好像不存在,在三維圖形程序中渲染時(shí),就可以不渲染這些透明度非常高的物體,從崦可以提高渲染速度。第三十二頁,共四十頁,2022年,8月28日8.3.1Alpha測(cè)試原理
Alpha測(cè)試根據(jù)當(dāng)前像素是否滿足Alpha測(cè)試條件,控制D3D程序是否繪制該像素,圖形程序應(yīng)用Alpha測(cè)試可以有效地屏蔽某些像素顏色。與Alpha混合相比,Slpha測(cè)試不將當(dāng)前像素的顏色與顏色緩沖區(qū)中像素的顏色混合,像素要么完全不透明,那么完全透明。由于無需進(jìn)行顏色緩沖區(qū)的讀操作和顏色混合,因此Alpha測(cè)試在速度上優(yōu)于Alpha混合。第三十三頁,共四十頁,2022年,8月28日8.3.2使用Alpha測(cè)試第三十四頁,共四十頁,2022年,8月28日啟用Alpha測(cè)試Alpha測(cè)試通過渲染狀態(tài):D3DRS_ALPHATESTENABLE激活,激活A(yù)lpha測(cè)試的代碼如下:g_pd3dDevice->SetRenderState(D3DRS_ALPHAREF,0x00000001);第三十五頁,共四十頁,2022年,8月28日設(shè)置Alpha測(cè)試參考值渲染狀態(tài)D3DRS_ALPHAREF用來設(shè)置進(jìn)行AlphaReference。Alpha測(cè)試函數(shù)比較當(dāng)前繪制的像素的Alpha值和AlphaReference值,如果返回TRUE,則通過測(cè)試并繪制像素,反之不予繪制。AlphaReference的取值范圍從0x00000000到0x000000ff。下列代碼設(shè)置Alpha測(cè)試的參考值為0x00000001。g_pd3dDevice->SetRenderState(D3DRS_ALPHAREF,0X00000001);第三十六頁,共四十頁,2022年,8月28日設(shè)置
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人才違約合同范本
- 出資購買商鋪合同范本
- 分析公司合同范本
- ktv水果配送合同范本
- 人力轉(zhuǎn)讓合同范本
- 倉庫維修維護(hù)合同范本
- 出國合同范本ps
- 樂器進(jìn)貨合同范本
- 冰箱購買合同范例
- 單位清單合同范本
- 2025年不停電電源(UPS)項(xiàng)目合作計(jì)劃書
- 2025年國家林業(yè)和草原局直屬事業(yè)單位第一批招聘應(yīng)屆畢業(yè)生96人歷年高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 2025年春季開學(xué)典禮校長(zhǎng)講話稿-少年無畏凌云志扶搖直上入云蒼
- 2025寒假開學(xué)第一課 課件【1】
- 2025年湖南食品藥品職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年??及鎱⒖碱}庫含答案解析
- 2024-2024年高考全國卷英語語法填空
- 會(huì)議會(huì)務(wù)服務(wù)投標(biāo)方案投標(biāo)文件(技術(shù)方案)
- 無違法犯罪記錄證明申請(qǐng)表(個(gè)人)
- (更新版)HCIA安全H12-711筆試考試題庫導(dǎo)出版-下(判斷、填空、簡(jiǎn)答題)
- 華科版五年級(jí)全冊(cè)信息技術(shù)教案(共24課時(shí))
- 《乒乓球》體育課教案(全)
評(píng)論
0/150
提交評(píng)論