深度測試與混合_第1頁
深度測試與混合_第2頁
深度測試與混合_第3頁
深度測試與混合_第4頁
深度測試與混合_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

深度測試與混合第1頁,共40頁,2023年,2月20日,星期日8.1深度測試在的場景中,通常有多個物體需要繪制,這些物體之間通常會存在遮擋關(guān)系,離觀察點較遠(yuǎn)的物體會因為近處物體的遮擋而不可見或只有部分可見,D3D圖形系統(tǒng)提供了嘗試測試功能來實現(xiàn)這種效果。第2頁,共40頁,2023年,2月20日,星期日8.1.2使用深度測試第3頁,共40頁,2023年,2月20日,星期日創(chuàng)建深度緩沖區(qū)若要在D3D圖形程序中應(yīng)用嘗試測試,首先必須在創(chuàng)建D3D渲染設(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;第4頁,共40頁,2023年,2月20日,星期日參數(shù)說明深度緩沖區(qū)是D3D渲染設(shè)備的一項屬性,為了創(chuàng)建一個由D3D管理的深度緩沖區(qū),只需設(shè)置結(jié)構(gòu)體D3DPRENSENT_PARAMETERS相應(yīng)的成員即可,在上面的代碼中,d3dpp.EnableAutoDepthStencil賦值為TRUE,表示由D3D創(chuàng)建并管理一個深度緩沖區(qū)。d3dpp.AutoDepthStencilFormat賦值為D3DFMT_D16,表示深度緩沖中每一個像素的深度值由16位的二進(jìn)制數(shù)表示。第5頁,共40頁,2023年,2月20日,星期日激活深度測試深度緩沖區(qū)隨D3D渲染設(shè)備創(chuàng)建好之后,調(diào)用D3D渲染狀態(tài)設(shè)置函數(shù)IDirect3DDevice9::SetRenderState(),將第一個參數(shù)設(shè)置為D3DRS_ZENABLE,第二個參數(shù)設(shè)置為TRUE,激活深度測試。

g_pd3dDevice->SetRenderState(D3DRS_ZENABLE,TRUE);第6頁,共40頁,2023年,2月20日,星期日設(shè)置深度測試函數(shù)接下來仍然調(diào)用:

IDirect3DDevice9::SetRenderState()函數(shù)設(shè)置舉薦度測試函數(shù),第一個參數(shù)設(shè)置為D3DRS_ZRUNC;第二個參數(shù)設(shè)置為想要設(shè)置的深度測試函數(shù),它屬于D3DCMPFUNC枚舉類型。第7頁,共40頁,2023年,2月20日,星期日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;第8頁,共40頁,2023年,2月20日,星期日D3DCMPFUNC枚舉值及其說明D3DCMP_NEVER深度測試函數(shù)總返回FALSED3DCMP_LESS測試點深度值小于嘗試緩沖區(qū)中相應(yīng)值時,返回TRUED3DCMP_EQUAL測試點深度值等于嘗試緩沖區(qū)中相應(yīng)值時,返回TRUED3DCMP_LESSEQUAL測試點深度值小于等于嘗試緩沖區(qū)中相應(yīng)值時,返回TRUE第9頁,共40頁,2023年,2月20日,星期日D3DCMPFUNC枚舉值及其說明(續(xù)表)D3DCMP_GREATER測試點深度值大于嘗試緩沖區(qū)中相應(yīng)值時,返回TRUED3DCMP_NOTEQUAL測試點深度值不等于嘗試緩沖區(qū)中相應(yīng)值時,返回TRUED3DCMP_GREATEREQUAL測試點深度值大于等于嘗試緩沖區(qū)中相應(yīng)值時,返回TRUED3DCMP_ALWAYS深度測試函數(shù)總返回TRUED3DCMP_FORCE_DWORD該枚舉不使用,用于保證將D3DCMFUNC枚舉類型編譯為32位第10頁,共40頁,2023年,2月20日,星期日通常深度測試函數(shù)設(shè)置為D3DCMP_LESS,表示當(dāng)測試點深度值小于深度緩沖區(qū)中相應(yīng)值時,通過測試并繪制相關(guān)像素,這樣沒有被遮擋的物體才顯示,而被遮擋住的物體就不顯示。如:g_pd3dDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESS);第11頁,共40頁,2023年,2月20日,星期日更新深度緩沖區(qū)設(shè)置了深度測試函數(shù)后,還需要設(shè)置深度測試成功時對深度緩沖區(qū)如何操作:是保持原來的深度值,還是用當(dāng)前像素的嘗試值更新對應(yīng)的數(shù)值,如:g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);

第12頁,共40頁,2023年,2月20日,星期日8.2半透明物體的繪制在前面已經(jīng)遇到了Alpha值的概念。如結(jié)構(gòu)D3CCOLORVALUE中的變量a,但它并沒有被使用,因為還沒有激活A(yù)lpha混合,并且Alpha總是被賦值為1.0f。默認(rèn)狀態(tài)下Alpha為1.0f表示完全不透明。第13頁,共40頁,2023年,2月20日,星期日8.2.1Alpha混合原理前面的示例程序中,繪制圖形的顏色總是替換當(dāng)前顏色緩沖區(qū)中存在的顏色值,這樣后畫的物體總是覆蓋在原有的物體上。但是當(dāng)想要繪制類似于玻璃、水等具有透明效果的物體時,這種方法顯然滿足不了要求。通過定義一個表示物體半透明度的Alpha值和一個半透明計算公式,可以把將要繪制的物體顏色與顏色緩沖區(qū)中存在的顏色相混合,從而繪制出具有半透明效果的物體。第14頁,共40頁,2023年,2月20日,星期日D3D計算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表示源計算結(jié)果與顏色緩沖區(qū)計算結(jié)果的混合方法,默認(rèn)狀態(tài)下OP為D3DBLEND_ADD,即源計算結(jié)果與顏色緩沖區(qū)計算結(jié)果相加。因此,Alpha混合顏色的公式變?yōu)椋?/p>

Color=(RGBsrcAlpha)+(RGBdist(1-Alpha))第15頁,共40頁,2023年,2月20日,星期日8.2.2利用Alpha混合實現(xiàn)半透明效果示例程序AlphaBlend模擬了直升機螺旋槳的半透明效果。在程序初始化階段,載入了Heli.x文件,它是一個包含直升機的三維模型文件,其中螺旋槳的材質(zhì)的漫反射屬性被設(shè)為(R,G,B,A)=(0.1837;0.1837;0.1837;0.500),可以用文件方式打開Heli查看它的材質(zhì)屬性,Heli.x是一個文件格式的.x文件。第16頁,共40頁,2023年,2月20日,星期日啟用Alpha混合要繪制半透明物體,首先需要激活D3D的Alpha混合運算。調(diào)用D3D渲染狀態(tài)設(shè)置函數(shù)IDirect3DDevice9::SetRenderState(),將第一個參數(shù)設(shè)置為D3DRS_ALPHABLENDENABLE,第二個參數(shù)可以設(shè)置為TRUE。g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);第17頁,共40頁,2023年,2月20日,星期日設(shè)置Alapha混合系數(shù)在上面介紹的Alpha混合原理中提到的源系數(shù)和目標(biāo)混合系數(shù),也是通過D3D的渲染狀態(tài)設(shè)置數(shù)設(shè)置的。若將第一個參數(shù)設(shè)置為D3DRS_SCRBLEND,則用于設(shè)置源混合系數(shù),若將第二個參數(shù)可以設(shè)置為D3DBLEND枚舉常量。第18頁,共40頁,2023年,2月20日,星期日枚舉常量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值。第19頁,共40頁,2023年,2月20日,星期日枚舉常量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)第20頁,共40頁,2023年,2月20日,星期日示例程序中設(shè)置Alpha混合系數(shù)的代碼g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DRSBLEND_SRCALPHA);g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DRSBLEND_INVSRCALPHA);第21頁,共40頁,2023年,2月20日,星期日設(shè)置Alpha混合方法

Alpha混合方法指定源目標(biāo)顏色和目標(biāo)顏色的混合方法。Alpha混合方法也是通過D3D渲染狀態(tài)設(shè)置函數(shù)IDirect3DDevice::SetRenderState()設(shè)置的,其中第一參數(shù)設(shè)置為D3DRS_BLENDOP,第二參數(shù)設(shè)置為D3DBLENDO枚舉常量。第22頁,共40頁,2023年,2月20日,星期日D3DBLENDOP的常用值D3DBLENDOP_ADD源計算結(jié)果與顏色緩沖區(qū)計算結(jié)果相加D3DBLENDOP_SUBTRACT源計算結(jié)果送去顏色緩沖區(qū)計算結(jié)果D3DBLENDOP_REVSUBTRACT顏色緩沖區(qū)計算結(jié)果減去計算結(jié)果D3DBLENDOP_MINMIN(源計算結(jié)果,顏色緩沖區(qū)計算結(jié)果)D3DBLENDOP_MAXMAX(源計算結(jié)果,顏色緩沖區(qū)計算結(jié)果)應(yīng)用程序采用默認(rèn)的Alpha混合方法D3DBLEND_ADD第23頁,共40頁,2023年,2月20日,星期日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值來自每個頂點顏色設(shè)置的Alpha值;如果使用燈光和材質(zhì),則當(dāng)前像素的Alpha來自物體表面材質(zhì);如果為物體表面使用了紋理則Alpha值還與紋理有關(guān)。第24頁,共40頁,2023年,2月20日,星期日頂點Alpha如果在程序中直接指定每個頂點的顏色,則可以直接給出每個頂點顏色的Alpha值,可以在定義頂點時直接聲明該頂點的Alpha值,也可以在程序運行時動態(tài)地修改頂點的Alpha值。有了頂點的Alpha值,渲染對象中每個像素的Alpha值由該對象的頂點Alpha值和著色模式?jīng)Q定。當(dāng)著色模式為平面著色模式時,構(gòu)成對象的各個多邊形中所有像素的Alpha值都等于該多邊形的第一個頂點的Alpha值;當(dāng)著色模式為戈勞德著色模式時,每個多邊形面上的像素的Alpha值是它的各個頂點的Alpha進(jìn)行線性插值得到的。第25頁,共40頁,2023年,2月20日,星期日啟用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);第26頁,共40頁,2023年,2月20日,星期日然后,在設(shè)置三角形每個頂點顏色時,將Alpha值設(shè)置為十六進(jìn)制數(shù)0x50,3個頂點都設(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},};第27頁,共40頁,2023年,2月20日,星期日caseWM_KEYDOWN:switch(wParam){case48:g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);break;case49:g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);break;}第28頁,共40頁,2023年,2月20日,星期日材質(zhì)Alpha頂點Alpha是沒有使用燈光和材質(zhì)的情況,如果對場景內(nèi)的物體添加了燈光和材質(zhì)而沒有添加紋理時,頂點Alpha值取決于材質(zhì)屬性中漫反射屬性中的Alpha系數(shù)和燈光顏色中的Alpha值,頂點Alpha值,頂點Alpha值是根據(jù)光照計算得到的。在第5章中我們知道,頂點光照計算是分別針對紅、綠、藍(lán)和Alpha分別進(jìn)行的。其中alpha光照計算的結(jié)果就是頂點的Alpha值。有了頂點的Alpha值就可根據(jù)著色模式計算出每個像素的Alpha值。第29頁,共40頁,2023年,2月20日,星期日紋理Alpha當(dāng)對物體表面使用了紋理之后,像素的Alpha值就是紋理Alpha混合之后的值,所以這又取決于紋理的的Alpha混合方法,紋理Alpha混合方法決定了紋理Alpha混合之后的Alpha值是取自材料,還是取自紋理,或者是取自兩者的某種去處。像素Alpha值的具體計算過程是這樣的,首先得到頂點Alpha值,頂點Alpha值可能是直接指定的,也可能是光照計算得到,然后根據(jù)著色模式對頂點Alpha值進(jìn)行插值,得到的結(jié)果再根據(jù)紋理Alpha混合方法和紋理采樣得到的Alpha值進(jìn)行指定的運算,得到最終每個像素的Alpha值。紋理Alpha混合方法和紋理顏色混合方法基本相同,區(qū)別是紋理Alpha混合的結(jié)果是像素的Alpha值,紋理顏色混合的結(jié)果是像素顏色RGB值。第30頁,共40頁,2023年,2月20日,星期日一個紋理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);第31頁,共40頁,2023年,2月20日,星期日8.3Alpha測試透過那些透明度非常高的物體看其他物體,例如透過幾乎完全透明的玻璃看其他物體,會感到玻璃好像不存在,在三維圖形程序中渲染時,就可以不渲染這些透明度非常高的物體,從崦可以提高渲染速度。第32頁,共40頁,2023年,2月20日,星期日8.3.1Alpha測試原理

Alpha測試根據(jù)當(dāng)前像素是否滿足Alpha測試條件,控制D3D程序是否繪制該像素,圖形程序應(yīng)用Alpha測試可以有效地屏蔽某些像素顏色。與Alpha混合相比,Slpha測試不將當(dāng)前像素的顏色與顏色緩沖區(qū)中像素的顏色混合,像素要么完全不透明,那么完全透明。由于無需進(jìn)行顏色緩沖區(qū)的讀操作和顏色混合,因此Alpha測試在速度上優(yōu)于Alpha混合。第33頁,共40頁,2023年,2月20日,星期日8.3.2使用Alpha測試第34頁,共40頁,2023年,2月20日,星期日啟用Alpha測試Alpha測試通過渲染狀態(tài):D3DRS_ALPHATESTENABLE激活,激活A(yù)lpha測試的代碼如下:g_pd3dDevice->SetRenderState(D3DRS_ALPHAREF,0x00000001);第35頁,共40頁,2023年,2月20日,星期日設(shè)置Alpha測試參考值渲染狀態(tài)D3DRS_ALPHAREF用來設(shè)置進(jìn)行AlphaReference。Alpha測試函數(shù)比較當(dāng)前繪制的像素的Alpha值和AlphaReference值,如果返回TRUE,則通過測試并繪制像素,反之不予繪制。AlphaReference的取值范圍從0x00000000到0x000000ff。下列代碼設(shè)置Alpha測試的參考值為0x00000001。g_pd3dDevice->SetRenderState(D3DRS_ALPHAREF,0X00000001);第36頁,共40頁,2023年,2月20日,星期日設(shè)置

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論