繪制帶有紋理的立方體_第1頁
繪制帶有紋理的立方體_第2頁
繪制帶有紋理的立方體_第3頁
繪制帶有紋理的立方體_第4頁
繪制帶有紋理的立方體_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

繪制帶有紋理的立方體第1頁,共51頁,2023年,2月20日,星期四拋磚引玉Copyright2008ByNeusoftGroup.Allrightsreserved第2頁,共51頁,2023年,2月20日,星期四拋磚引玉Copyright2008ByNeusoftGroup.Allrightsreserved第3頁,共51頁,2023年,2月20日,星期四專題3繪制帶有紋理的立方體學(xué)習(xí)目標(biāo):1.掌握如何設(shè)置光源,控制光照2.理解物體材質(zhì)作用及如何進(jìn)行材質(zhì)的設(shè)置3.熟悉如何對(duì)簡(jiǎn)單幾何物體實(shí)現(xiàn)紋理帖圖4.掌握如何實(shí)現(xiàn)多重紋理Copyright2008ByNeusoftGroup.Allrightsreserved第4頁,共51頁,2023年,2月20日,星期四Copyright2008ByNeusoftGroup.Allrightsreserved光照與材質(zhì)基本紋理繪制特殊紋理渲染專題授課要點(diǎn)第5頁,共51頁,2023年,2月20日,星期四燈光的組成在Direct3D燈光模型中,燈光是通過燈光模型的三個(gè)成員之一來照射的-----------即有三種燈光.①環(huán)境光(AmbientLight):是經(jīng)其他表面反射到達(dá)物體表面,并照亮整個(gè)場(chǎng)景。這時(shí)物體并不處于光源的直接照射下,照亮物體的光是其他物體反射到該物體上的光線。光線經(jīng)過多次折射后看起來就像是來自四面八方一樣,這種光不依賴于光源的位置。Copyright2008ByNeusoftGroup.Allrightsreserved第6頁,共51頁,2023年,2月20日,星期四燈光的組成

②漫射光(DiffuseLight):有特定的傳播方向,但當(dāng)它到達(dá)某一表面時(shí),將沿著各個(gè)方向均勻反射。這種光無論從哪個(gè)方位觀察,表面亮度均相同,所以無須考慮觀察者的位置,僅需考慮光傳播的方向以及表面的朝向。從一個(gè)光源發(fā)出的光一般都是這種類型的。Copyright2008ByNeusoftGroup.Allrightsreserved粗糙表面上每一個(gè)小區(qū)域內(nèi)都有大量的朝各個(gè)方向的小的表面,因此光線是朝向任意方向均勻反射出去的。第7頁,共51頁,2023年,2月20日,星期四燈光的組成

③鏡面光(SpecularLight):用于顯示物體表面(光滑和光澤表面)的高光效果,有特定的傳播方向。但當(dāng)它到達(dá)一個(gè)表面時(shí),將嚴(yán)格的沿著另一個(gè)方向反射。是只能在一定的角度范圍內(nèi)才能觀察到的高亮度照射。因?yàn)楣庹站刂粋€(gè)方向反射,所以不僅要考慮光的入射方向和表面的朝向,還需要考慮觀察者的位置。Copyright2008ByNeusoftGroup.Allrightsreserved第8頁,共51頁,2023年,2月20日,星期四燈光的組成小結(jié)

鏡面反射光與其他類型的光相比,計(jì)算量要大很多,所以Direct3D為其提供了開關(guān)選項(xiàng),默認(rèn)狀態(tài)下,Direct3D不進(jìn)行鏡面反射計(jì)算??刹捎孟旅娴姆椒▎⒂茫篠etRenderState(D3DRS_SPECULARENABLE,true);

Copyright2008ByNeusoftGroup.Allrightsreserved第9頁,共51頁,2023年,2月20日,星期四燈光的組成小結(jié)每種類型的光都是通過D3DCOLORVALUE結(jié)構(gòu)或者D3DXCOLOR來描繪,表示光照的顏色。

D3DXCOLORredAmbient(1.0f,0.0f,0.0f,1.0f);D3DXCOLORblueDiffuse(0.0f,0.0f,1.0f,1.0f);D3DXCOLORwhiteSpecular(1.0f,1.0f,1.0f,1.0f);

注意:1、在D3DXCOLOR類中的alpha值用在描述光線顏色時(shí)是被忽略的。Copyright2008ByNeusoftGroup.Allrightsreserved第10頁,共51頁,2023年,2月20日,星期四材質(zhì)的概念在現(xiàn)實(shí)世界中,我們所觀察到的物體的顏色是由該物體所反射的光的顏色決定的。如:一個(gè)純紅色的球體反射了全部的紅色入射光,并吸收了所有非紅色的光,所以該球體呈現(xiàn)為紅色。在Direct3D中,通過定義物體的材質(zhì)(materials)來模擬這樣的現(xiàn)象。材質(zhì)允許我們定義物體表面對(duì)各種顏色光的反射比例。Copyright2008ByNeusoftGroup.Allrightsreserved第11頁,共51頁,2023年,2月20日,星期四材質(zhì)材質(zhì)結(jié)構(gòu)體D3DMATERIAL9的定義:Copyright2008ByNeusoftGroup.Allrightsreserved

typedefstructD3DMATERIAL9{D3DCOLORVALUEDiffuse;//指定表面對(duì)漫射光的反射率D3DCOLORVALUEAmbient;//指定表面對(duì)環(huán)境光的反射率D3DCOLORVALUESpecular;//指定表面對(duì)鏡面光的反射率D3DCOLORVALUEEmissive;//指定物體的自發(fā)光亮度floatPower;//指定鏡面高光點(diǎn)的銳度(sharpness)}D3DMATERIAL9,*LPD3DMATERIAL9;

第12頁,共51頁,2023年,2月20日,星期四材質(zhì)問題:得到一個(gè)紅色的球。思路:定義球的材質(zhì)為只反射紅光而吸收所有其他顏色的光:

Copyright2008ByNeusoftGroup.AllrightsreservedD3DMATERIAL9red;::ZeroMemory(&red,sizeof(red));red.Diffuse=D3DXCOLOR(1.0f,0.0f,0.0f,1.0f);//紅色red.Ambient=D3DXCOLOR(1.0f,0.0f,0.0f,1.0f);//紅色red.Specular=D3DXCOLOR(1.0f,0.0f,0.0f,1.0f);//紅色red.Emissive=D3DXCOLOR(0.0f,0.0f,0.0f,1.0f);

//無自發(fā)光red.Power=5.0f;第13頁,共51頁,2023年,2月20日,星期四材質(zhì)的實(shí)現(xiàn)方法總結(jié)第1步:設(shè)置物體的反光性,即分別設(shè)置物體對(duì)環(huán)境光、漫射光、鏡面反射光的反射性.以及物體本身的發(fā)光性,物體的反射系數(shù).第2步:Direct3D設(shè)備接口調(diào)用SetMaterial函數(shù)實(shí)現(xiàn)對(duì)物體材質(zhì)的設(shè)置.Copyright2008ByNeusoftGroup.Allrightsreserved第14頁,共51頁,2023年,2月20日,星期四效果展示1.點(diǎn)光源Copyright2008ByNeusoftGroup.Allrightsreserved第15頁,共51頁,2023年,2月20日,星期四效果展示2.方向光Copyright2008ByNeusoftGroup.Allrightsreserved第16頁,共51頁,2023年,2月20日,星期四效果展示3.聚光燈Copyright2008ByNeusoftGroup.Allrightsreserved第17頁,共51頁,2023年,2月20日,星期四結(jié)果分析1.第1幅中有高亮2.第2幅中光均勻分布3.第3幅中有未接受到光部分Copyright2008ByNeusoftGroup.Allrightsreserved第18頁,共51頁,2023年,2月20日,星期四光源Direct3D支持3種類型的光源:點(diǎn)光源(Pointlights):處于世界坐標(biāo)系中固有的位置,向所有的方向發(fā)射光線。Copyright2008ByNeusoftGroup.Allrightsreserved光線的作用范圍半徑沿光線方向,光強(qiáng)度逐漸衰減第19頁,共51頁,2023年,2月20日,星期四光源方向光(Directionallights):沒有位置信息,所發(fā)射的光線相互平行地沿某一特定方向傳播。Copyright2008ByNeusoftGroup.Allrightsreserved光強(qiáng)不隨距離而衰減第20頁,共51頁,2023年,2月20日,星期四光源聚光燈(Spotlights):與手電筒類似,有位置信息,發(fā)出的光在特定方向上按照?qǐng)A錐形照射。該錐形可用兩個(gè)角度:和來描述。角描述了內(nèi)部錐形,描述了外部錐形。Copyright2008ByNeusoftGroup.AllrightsreservedAttenuation衰減第21頁,共51頁,2023年,2月20日,星期四光源的設(shè)置1.點(diǎn)光源的設(shè)置點(diǎn)光源的特點(diǎn):光線來源于一固定點(diǎn)設(shè)定點(diǎn)光源時(shí)應(yīng)該設(shè)置光源位置與光源2.方向光的設(shè)置方向光的特點(diǎn):沒有位置信息,平行地沿某一特定方向傳播設(shè)定方向光時(shí)應(yīng)該設(shè)置方向與光源3.聚光燈的設(shè)置聚光燈的特點(diǎn):有位置信息,發(fā)出的光在特定方向上按照?qǐng)A錐形照射。設(shè)定聚光燈時(shí)應(yīng)該設(shè)置光源位置光源方向與光源Copyright2008ByNeusoftGroup.Allrightsreserved第22頁,共51頁,2023年,2月20日,星期四常見問題光照計(jì)算是對(duì)每個(gè)頂點(diǎn)進(jìn)行的,所以Direct3D需要知道表面在每個(gè)頂點(diǎn)處的局部朝向(法線方向),從而確定光線到達(dá)表面時(shí)候的入射角.Copyright2008ByNeusoftGroup.Allrightsreserved頂點(diǎn)法線和面法線是不相同面法線頂點(diǎn)法線第23頁,共51頁,2023年,2月20日,星期四頂點(diǎn)的法向量的計(jì)算思路:⑴已知三角形的三個(gè)頂點(diǎn)坐標(biāo)P0,P1,P2,求三角形面的法向量。Copyright2008ByNeusoftGroup.AllrightsreservednP2P0P1P1-P0=uP2-P0=v則可以得到面法線為:n=u×v第24頁,共51頁,2023年,2月20日,星期四頂點(diǎn)的法向量的計(jì)算Copyright2008ByNeusoftGroup.AllrightsreservedvoidComputeNormal(D3DXVECTOR3*p0, D3DXVECTOR3*p1, D3DXVECTOR3*p2, D3DXVECTOR3*out){ D3DXVECTOR3u=*p1-*p0; D3DXVECTOR3v=*p2-*p0; D3DXVec3Cross(out,&u,&v); D3DXVec3Normalize(out,out);}下面的函數(shù)通過三角形的三個(gè)頂點(diǎn)計(jì)算三角形的面法線。注意這個(gè)函數(shù)的三個(gè)頂點(diǎn)是按照順時(shí)針方向指定的。第25頁,共51頁,2023年,2月20日,星期四頂點(diǎn)的法向量的計(jì)算Copyright2008ByNeusoftGroup.Allrightsreserved⑵求出共享頂點(diǎn)P0的所有平面的法向量,取其和。

n=n1+n2+…+nt(共t個(gè)面共享P0)

⑶規(guī)范化頂點(diǎn)的法向量。

SetRenderState(D3DRS_NORMALIZENORMALS,true);第26頁,共51頁,2023年,2月20日,星期四注意Copyright2008ByNeusoftGroup.Allrightsreserved我們?cè)诙x頂點(diǎn)結(jié)構(gòu)體的時(shí)候,如果需要用到頂點(diǎn)的法線信息,就在結(jié)構(gòu)體中定義相應(yīng)的數(shù)據(jù)成員。

structVertex{ ……

float_x,_y,_z;

float_nx,_ny,_nz;}#defineD3DFVF_CUSTOMVERTEX(D3DFVF_XYZ|D3DFVF_NORMAL)注意:在這里不需要表示頂點(diǎn)的顏色了,頂點(diǎn)的顏色是由光照和材質(zhì)來計(jì)算出來的,所以我們需要在這里加上頂點(diǎn)的法向量成員。第27頁,共51頁,2023年,2月20日,星期四實(shí)例:用聚光燈照射一個(gè)立方體Copyright2008ByNeusoftGroup.Allrightsreserved步驟:1.創(chuàng)建立方體2.設(shè)置立方體的材質(zhì)3.設(shè)置聚光燈第28頁,共51頁,2023年,2月20日,星期四實(shí)例:用聚光燈照射一個(gè)立方體Copyright2008ByNeusoftGroup.Allrightsreserved步驟:1.創(chuàng)建立方體(略)2.設(shè)置立方體的材質(zhì)第1步:封裝設(shè)置材質(zhì)的函數(shù)D3DMATERIAL9InitMtrl(D3DXCOLORa,D3DXCOLORd,D3DXCOLORs,D3DXCOLORe,floatp){ D3DMATERIAL9mtrl; mtrl.Ambient=a; mtrl.Diffuse=d; mtrl.Specular=s; mtrl.Emissive=e; mtrl.Power=p; returnmtrl;}第2步:設(shè)置立方體材質(zhì)D3DMATERIAL9

matrl=InitMtrl(D3DCOLOR_XRGB(255,0,0),D3DCOLOR_XRGB(255,0,0),D3DCOLOR_XRGB(255,0,0),D3DCOLOR_XRGB(0,0,0),2.0f);第29頁,共51頁,2023年,2月20日,星期四實(shí)例:用聚光燈照射一個(gè)立方體Copyright2008ByNeusoftGroup.Allrightsreserved步驟:3.設(shè)置聚光燈第1步:設(shè)置聚光燈的位置D3DXVECTOR3position(0.0f,0.0f,-5.0f);第2步:設(shè)置聚光燈的照射的方向D3DXVECTOR3dir(0.0f,0.0f,1.0f);第3步:設(shè)置聚光燈的光源D3DXCOLORc=D3DCOLOR_XRGB(255,255,255);第30頁,共51頁,2023年,2月20日,星期四實(shí)例:用聚光燈照射一個(gè)立方體Copyright2008ByNeusoftGroup.Allrightsreserved步驟:第4步:封裝初始化聚光燈函數(shù):D3DLIGHT9InitSpotLight(D3DXVECTOR3*position,D3DXVECTOR3*direction,D3DXCOLOR*color){ D3DLIGHT9light; ::ZeroMemory(&light,sizeof(light)); light.Type=D3DLIGHT_SPOT; light.Ambient=*color*0.0f; light.Diffuse=*color; light.Specular=*color*0.6f; light.Position=*position; light.Direction=*direction; light.Range=1000.0f; light.Falloff=1.0f; light.Attenuation0=1.0f; light.Attenuation1=0.0f; light.Attenuation2=0.0f; light.Theta=0.4f; light.Phi=0.9f; returnlight;}第31頁,共51頁,2023年,2月20日,星期四注意Copyright2008ByNeusoftGroup.Allrightsreserved完成后需要在繪制的時(shí)候調(diào)用SetMaterial函數(shù)將前面設(shè)置材質(zhì)信息導(dǎo)入.需要打開光照.

g_pD3DDevice->SetLight(0,&Spot); g_pD3DDevice->LightEnable(0,true);第32頁,共51頁,2023年,2月20日,星期四課堂練習(xí)Copyright2008ByNeusoftGroup.Allrightsreserved實(shí)現(xiàn)利用點(diǎn)光源照射一個(gè)幾何體(注意點(diǎn)光源需要哪些)第33頁,共51頁,2023年,2月20日,星期四課后作業(yè)Copyright2008ByNeusoftGroup.Allrightsreserved實(shí)現(xiàn)利用方向光源照射一個(gè)物體(幾何體形狀自己設(shè)計(jì))第34頁,共51頁,2023年,2月20日,星期四紋理所謂紋理,就是一張用來表示物體表面細(xì)節(jié)的二維位圖.Copyright2008ByNeusoftGroup.Allrightsreserved第35頁,共51頁,2023年,2月20日,星期四紋理坐標(biāo)Direct3D中,紋理坐標(biāo)系(紋理空間)由水平方向的u軸和沿垂直方向的v軸構(gòu)成。由(u,v)坐標(biāo)對(duì)決定紋理上的元素,它被叫做texel(紋理元/紋素)。Direct3D將紋理坐標(biāo)進(jìn)行了規(guī)范化處理,以處理不同尺寸的紋理,將紋理坐標(biāo)的范圍都限制在[0,1]以內(nèi)。Copyright2008ByNeusoftGroup.Allrightsreserved第36頁,共51頁,2023年,2月20日,星期四紋理繪制步驟第1步:創(chuàng)建并啟用紋理.通常使用D3DXCreateTextureFromFile或者D3DXCreateTextureFromFileEx函數(shù)來實(shí)現(xiàn).Copyright2008ByNeusoftGroup.Allrightsreserved第37頁,共51頁,2023年,2月20日,星期四紋理繪制步驟第2步:設(shè)定紋理過濾器.Direct3D提供了三種不同的過濾器;每種都提供了一個(gè)不同的品質(zhì)級(jí)別。越好的品質(zhì)越慢,因此你必須在品質(zhì)與速度之間取得一個(gè)平衡。紋理過濾器是用IDirect3DDevice9::SetSamplerState方法來設(shè)置的。Copyright2008ByNeusoftGroup.AllrightsreservedHRESULTSetSamplerState(DWORDSampler,//取樣階段索引D3DSAMPLERSTATETYPEType,//取樣狀態(tài)類型DWORDValue//取樣值,由type決定);

第38頁,共51頁,2023年,2月20日,星期四紋理繪制步驟第3步:設(shè)置當(dāng)前紋理.使用SetTexture方法:

Copyright2008ByNeusoftGroup.AllrightsreservedHRESULTIDirect3DDevice9::SetTexture(DWORDStage,//0-7的值用于標(biāo)識(shí)紋理等級(jí),現(xiàn)在我們?nèi)?IDirect3DBaseTexture9*pTexture//要設(shè)置紋理的指針);第39頁,共51頁,2023年,2月20日,星期四注意我們?cè)诙x頂點(diǎn)結(jié)構(gòu)體的時(shí)候,如果需要實(shí)現(xiàn)紋理映射,就在結(jié)構(gòu)體中定義相應(yīng)的數(shù)據(jù)成員。Copyright2008ByNeusoftGroup.AllrightsreservedstructVertex{

……

float_x,_y,_z;

float_nx,_ny,_nz;

float_u,_v;//紋理坐標(biāo)

static

constDWORDFVF;};constDWORDVertex::FVF=D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1;注:在靈活頂點(diǎn)標(biāo)記處增加了一個(gè)D3DFVF_TEX1(1—8)的標(biāo)記,表示頂點(diǎn)結(jié)構(gòu)中包含了一對(duì)紋理坐標(biāo)。這樣,我們?cè)诙x構(gòu)成三角形的三個(gè)頂點(diǎn)時(shí)候,在紋理坐標(biāo)系中也定義了一個(gè)相應(yīng)的紋理三角形。紋理映射是在光柵化階段進(jìn)行的。第40頁,共51頁,2023年,2月20日,星期四關(guān)鍵程序代碼Copyright2008ByNeusoftGroup.Allrightsreserved第1步:創(chuàng)建紋理并導(dǎo)入D3DXCreateTextureFromFile(g_pD3DDevice,"1.jpg",&Tex);第2步:設(shè)定紋理過濾器g_pD3DDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);g_pD3DDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);g_pD3DDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_POINT);第3步:設(shè)置當(dāng)前紋理g_pD3DDevice->SetTexture(0,Tex);第41頁,共51頁,2023年,2月20日,星期四實(shí)例:為一個(gè)立方體貼紋理Copyright2008ByNeusoftGroup.Allrightsreserved實(shí)現(xiàn)如下效果:第42頁,共51頁,2023年,2月20日,星期四多重紋理(Multitexturing)多次渲染:分多次將多張紋理映射到同一個(gè)多邊形上。多重紋理:將多張紋理在一次渲染中映射到同一個(gè)多邊形上。多重紋理比多次渲染更快一些,但是它需要顯卡的支持。多重紋理只渲染一次,而在渲染之前通過調(diào)用SetTexture和SetTextureStageState函數(shù)來對(duì)不同的紋理進(jìn)行混合,這個(gè)過程就叫做紋理混合(textureblending)。每個(gè)紋理階段的結(jié)果都會(huì)傳遞到下一個(gè)階段,最后一個(gè)階段的結(jié)果被光柵化到多邊形上。Copyright2008ByNeusoftGroup.Allrightsreserved第43頁,共51頁,2023年,2月20日,星期四多重紋理的設(shè)置對(duì)每個(gè)頂點(diǎn)使用兩組紋理坐標(biāo),第一張紋理使用第一組紋理坐標(biāo),第二張紋理使用第二組紋理坐標(biāo)。Device->SetTexture(0,tex0);Device->SetTextureStageState(0,D3DTSS_TEXCOORDINDEX,0);

……Device->SetTexture(1,tex1);Device->SetTextureStageState(1,D3DTSS_TEXCOORDINDEX,1);

……當(dāng)然,也可以重復(fù)使用一組紋理坐標(biāo):Device->SetTexture(0,tex0);Device->SetTextureStageState(0,D3DTSS_TEXCOORDINDEX,0);

……Device->SetTexture(1,tex1);Device->SetTextureStageState(1,D3DTSS_TEXCOORDINDEX,0);Copyright2008ByNeusoftGroup.Allrightsreserved第44頁,共51頁,2023年,2月20日,星期四多重紋理的應(yīng)用實(shí)例黑暗映射(DarkMapping)將兩張紋理的顏色相乘。這種類型的多重紋理之所以稱為“黑暗映射”是因?yàn)樽罱K結(jié)果中未受到光照的圖素比原圖中的圖素更暗。Copyright2008ByNeusoftGroup.Allrightsreserved第45頁,共51頁,2023年,2月20日,星期四實(shí)現(xiàn)代碼設(shè)置發(fā)光映射:

g_pD3DDevice->SetTexture(0,m_pTexture1);

g_pD3DDevice->SetTextureStageState(0,D3DTSS_TEXCOORDINDEX,0);

g_pD3DDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);

g_pD3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);//使用當(dāng)前顏色作為第一個(gè)texturestage

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論