圖形學(xué)光照與明暗處理_第1頁(yè)
圖形學(xué)光照與明暗處理_第2頁(yè)
圖形學(xué)光照與明暗處理_第3頁(yè)
圖形學(xué)光照與明暗處理_第4頁(yè)
圖形學(xué)光照與明暗處理_第5頁(yè)
已閱讀5頁(yè),還剩69頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1第八章明暗處理

為了使用幾何模型創(chuàng)造逼真的圖形場(chǎng)景,我們根據(jù)物體的材質(zhì)屬性、光源位置和視點(diǎn)計(jì)算物體表面的光照亮度。2內(nèi)容Phong照明模型點(diǎn)光源線光源反射漫反射鏡面反射環(huán)境反射Gouraud明暗處理Phong明暗處理陰影3點(diǎn)光源n為表面法向.

n在平面上各點(diǎn)處是相等的s

為光源的方向.

s

根據(jù)位置的不同不斷改變,例如,

s1

s2.

光源靠近物體表面時(shí),s的改變量變得更大

sns1s2nn4線光源當(dāng)光源離得較遠(yuǎn)時(shí),s的變化將變得不明顯.當(dāng)距離變得非常遠(yuǎn)時(shí),s在一個(gè)表面上保持不變

例如太陽(yáng).被稱為線光源(或平行光源,或分散光源.)ssnn5令I(lǐng)i

為入射光的強(qiáng)度

,為

s和n

的夾角大小,0o90o.Ii

cos為單位表面區(qū)域接收到的光的數(shù)量當(dāng)

=0,入射光垂直于表面。表面接收到的入射光的數(shù)量最多例如:

正午的太陽(yáng)光當(dāng)=90o時(shí),它接收不到光照。當(dāng)>90o時(shí),光在表面的另一邊,它也接收不到光照。cossncos6漫反射一個(gè)完美的粗糙表面幾乎可以向所有方向反射光Lambert余弦定律

反射的光的數(shù)量為

Id=

RdIi

cosRd,漫反射系數(shù)為:

0Rd

1Id

與視點(diǎn)無(wú)關(guān)

cos為s在n上的投影.

如果s

n

是單位向量, cos=sn

(點(diǎn)乘)snsncosMicroscopicview7衰減

當(dāng)光遠(yuǎn)離表面時(shí),光的強(qiáng)度變?nèi)鯇?duì)于一個(gè)點(diǎn)光源,衰減系數(shù)為,

d

為到點(diǎn)光源的距離.

a,b,

c

為以經(jīng)驗(yàn)選擇的啟發(fā)式參數(shù)

、對(duì)于一個(gè)定向光源,Af=1(intheory)(inpractice)8漫反射

從一個(gè)點(diǎn)光源從一個(gè)線光源 Id=

RdIi

cos=

RdIi

(sn)9Purediffusereflectionfromdirectionalsourcepointing(1,1,1)10鏡面反射平滑的亮的表面對(duì)光的反射.純鏡面反射的例子11鏡面反射一個(gè)亮的表面以一個(gè)標(biāo)準(zhǔn)的方向反射光r

在跨越

n

s的表面上.

它和n的夾角大小與n和s的夾角大小相等

.0o90o.

當(dāng)從

v方向觀察表面上的一個(gè)點(diǎn)時(shí),光的反射量為:

Ii,入射光強(qiáng)度

Rs,鏡面反射系數(shù),

0Rs

1snrsnrv12

為標(biāo)準(zhǔn)反射線

(r)

和視線

(v)

的夾角在一個(gè)亮表面上,當(dāng)

v

偏離

r

時(shí)很少能發(fā)現(xiàn)反射光.

當(dāng)在一個(gè)陰暗的表面上,在v處能發(fā)現(xiàn)更多的光。

這種現(xiàn)象可用cosk

來(lái)建模.k為物體的反光度。k越大,亮度越高。cos=rv光的衰減的建模與漫反射相同。snrv1314鏡面反射從點(diǎn)光源從線光源

15找到反射射線

r,根據(jù)

n

sr,n和s為歸一化向量.red_arrow=(n

?s)nr+s=2red_arrow

r=2(n

?s)ns

rsrsrsn16模擬材質(zhì)屬性為了提高效率,在公式中使用

h

n來(lái)近似r

v。h

被稱為half-way向量.h=(s+v

)/2snrvh17使用模擬材質(zhì)屬性進(jìn)行漫反射從一個(gè)點(diǎn)光源從一個(gè)線光源

h=(s+v

)/218kshalllessthan12819純鏡面反射20環(huán)境光的反射(background),Ia由于表面之間的多次反射,環(huán)境光(IAm)為均勻亮度. Ia=RaIAmRa,環(huán)境光反射系數(shù),

0Ra

1Ia和表面法向及視點(diǎn)無(wú)關(guān),和光源的位置(或方向)無(wú)關(guān)21PureAmbientfloatglobalAmbient[]={0.9,0.9,0.9,1.};glLightModelfv(GL_LIGHT_MODEL_AMBIENT,globalAmbient);22OverallPureDiffusePureAmbientPureSpecular23整體Phong照明模型對(duì)點(diǎn)光源的反射對(duì)線光源的反射

24ShinyTeapot

為生成彩色圖片,分別對(duì)紅色、綠色和藍(lán)色進(jìn)行明暗處理運(yùn)算。GLfloatspecular[]={1.,1.,1.,1.};GLfloatambient[]={.41,.135,.067,1.};GLfloatdiffuse[]={.41,.135,.067,1.};glMaterialf(GL_FRONT,GL_SHININESS,125.);25快速明暗處理(FlatShading),基于多邊形

表面的明暗是從表面反射的環(huán)境光、漫射光和鏡面光的數(shù)量。在快速渲染中,只對(duì)多邊形上的一個(gè)點(diǎn)進(jìn)行一次反射計(jì)算。計(jì)算的結(jié)果將被賦給多邊形上的所有像素.表面法向被用于計(jì)算整個(gè)多邊形有同樣的明暗值方法是有效率的,但過(guò)于粗糙。n26一個(gè)Machband

是在兩個(gè)具有不同明暗值的多邊形的鄰接邊上發(fā)現(xiàn)的條紋.Machbands經(jīng)常發(fā)現(xiàn)于陰影上我們的眼睛對(duì)離散變化的明暗特別敏感

2728Gouraud明暗處理,基于頂點(diǎn)的

對(duì)多邊形上的每個(gè)頂點(diǎn)進(jìn)行一次明暗計(jì)算。

每個(gè)頂點(diǎn)有一個(gè)法向,可能是多邊形的法向或者周圍相鄰幾個(gè)法向的平均。使用這個(gè)頂點(diǎn)的法向計(jì)算這個(gè)頂點(diǎn)處像素的明暗值。n4n3n2n1n0nbncnandn29被這個(gè)多邊形覆蓋的其他像素的明暗值通過(guò)插值得到,如同計(jì)算顏色的情況。中間點(diǎn)的顏色C,由下式得到:

ABC30確定被多邊形覆蓋的一個(gè)像素點(diǎn)的顏色D的顏色由A和B確定E的顏色由

A和C確定F點(diǎn)的顏色由D和E確定BACDEF一行像素31ConstantShadingGouraudShading323334Phong明暗處理,基于像素不同于Gouraud明暗處理技術(shù)的對(duì)每個(gè)像素處明暗值進(jìn)行插值計(jì)算,Phong提出對(duì)多邊形上的每個(gè)像素的法向進(jìn)行插值計(jì)算。然后計(jì)算每個(gè)像素處的明暗值。使用Gouraud明暗處理技術(shù),我們常常需要將一個(gè)表面分割成小塊來(lái)得到滿意的結(jié)果。Phong明暗處理技術(shù)減少了過(guò)多的分割,但是需要更多的計(jì)算。它能產(chǎn)生更高質(zhì)量的圖片但也更慢。BACDEFArowofpixels35插值計(jì)算邊緣和每一行像素的法向36Phong明暗處理技術(shù)示例37OpenGL

中的照明技術(shù)Enable/Disablelighting glEnable(GL_LIGHTING); //settingcolorsareignored glDisable(GL_LIGHTING);指定一個(gè)陰影模型 Eitherflatshadingorsmooth(Gouraud)shading glShadeModel(GL_FLAT); glShadeModel(GL_SMOOTH);指定每個(gè)頂點(diǎn)的法向量.例如,在原點(diǎn)繪制球體時(shí)

glNormal3f(x,y,z);glVertex3f(r*x,r*y,r*z);38在另一個(gè)法向被指定前,一個(gè)法向一直保持有效。//DrawacylinderglBegin(GL_QUAD_STRIP);t=0.;dt=(360./nslice)*3.1416/180.;for(j=0;j<=nslice;++j){

glNormal3f(cos(t),0.,sin(t)); glVertex3f(cos(t),0.,sin(t));

glVertex3f(cos(t),2.,sin(t));t=t+dt;}glEnd();zyx39voidtriangle(floatv[][3],inta,intb,intc){glBegin(GL_TRIANGLES); glVertex3fv(v[a]); glVertex3fv(v[b]); glVertex3fv(v[c]);glEnd();}

voidtetrahedron(){floatv[][3]={{-1.,-1.,-1.},{1.,-1.,1.},{-1.,1.,1.},{1.,1.,-1.}};

glNormal3f(-1.,-1.,1.);triangle(v,0,1,2);glNormal3f(1.,1.,1.);triangle(v,1,3,2);

glNormal3f(-1.,1.,-1.);triangle(v,0,2,3);

glNormal3f(1.,-1.,-1.);triangle(v,0,3,1);}(1,-1,1)

(-1,1,1)

(1,1,-1)xzy1320(-1,-1,-1)

40為了避免需要提供單位法向的困擾,你可以通過(guò)在

init()

中增加以下語(yǔ)句來(lái)讓系統(tǒng)為你歸一化所有向量

glEnable(GL_NORMALIZE);為一個(gè)光源指定顏色元素(r,g,b,a) GLfloatambient0[]={0.1,0.1,0.1,1.}; //GreyGLfloatdiffuse0[]={1.,1.,1.,1.}; //WhiteGLfloatspecular0[]={1.,1.,1.,1.}; //White

glLightfv(GL_LIGHT0,GL_AMBIENT,ambient0);glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse0);glLightfv(GL_LIGHT0,GL_SPECULAR,specular0);41實(shí)際生活中,一個(gè)光源的漫反射和鏡面反射經(jīng)常是相同的。

環(huán)境光依賴于環(huán)境。如果環(huán)境中有很多紅色物體,環(huán)境光則微微傾向于紅色。 GLfloata[]={0.1,0.,0.,1.}; //VerypaleredGLfloatd[]={1.,1.,0.,1.}; //YellowGLfloats[]={1.,1.,0.,1.}; //Yellow

glLightfv(GL_LIGHT0,GL_AMBIENT,a);glLightfv(GL_LIGHT0,GL_DIFFUSE,d);glLightfv(GL_LIGHT0,GL_SPECULAR,s);42OpenGL

已經(jīng)可以調(diào)用下面語(yǔ)句將它轉(zhuǎn)化為(r,g,b),作為全局環(huán)境光. floatglobalAmbient[]={r,g,b,1.};glLightModelfv(GL_LIGHT_MODEL_AMBIENT,globalAmbient);指定一個(gè)點(diǎn)光源的位置 GLfloatlight_position[]={2.,4.,6.,1.}; glLightfv(GL_LIGHT0,GL_POSITION,light_position);指定線光源的方向。

GLfloatlight_position[]={1.,1.,1.,0.}; glLightfv(GL_LIGHT1,GL_POSITION,light_position);s

為從物體指向光源的方向。它和光線方向相反。sn(x,y,z)43可以定義8個(gè)光源 GL_LIGHT0,GL_LIGHT1,…,GL_LIGHT7打開或關(guān)閉一個(gè)特定的光源

(在繪制之前或之后) glEnable(GL_LIGHT0); glDisable(GL_LIGHT0);默認(rèn)模式下,OpenGL

假設(shè)觀察者在無(wú)窮遠(yuǎn)處,這樣視角為一個(gè)常數(shù)。

當(dāng)觀察者實(shí)際離得很近時(shí),這種近似會(huì)導(dǎo)致嚴(yán)重的錯(cuò)誤。 ToaskOpenGLtousethetrueviewingangleinthecalculationofspecularreflection. glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);44網(wǎng)格大小的影響(Important)

下面,一個(gè)發(fā)光的白墻被分成不同的大小并用一個(gè)白色的線光源來(lái)渲染

GLfloatambient0[]={0.,0.,0.,1.}; GLfloatdiffuse0[]={.7,.7,.7,1.};GLfloatspecular0[]={1.,1.,1.,1.}; position[]={0.,0.,1.,0.};//光源方向

//視點(diǎn)位置(0,0,8)20×2010×104×42×21×1FastSlow45線光源和點(diǎn)光源在一個(gè)白色發(fā)光物體上的比較.視點(diǎn)位置在(0,0,8)Pointsourceat(0,0,8)Dir.sourceat(0,0,1)46對(duì)于一個(gè)點(diǎn)光源,我們可以指定一個(gè)常數(shù)為衰減系數(shù) glLightf(GL_LIGHT1,GL_CONSTANT_ATTENUATION,.0);glLightf(GL_LIGHT1,GL_LINEAR_ATTENUATION,.5);glLightf(GL_LIGHT1,GL_QUADRATIC_ATTENUATION,0.);默認(rèn)值為

a=1,b=0,c=0(沒(méi)有衰減)對(duì)于更高的衰減,則為b和

c設(shè)定一個(gè)更高的系數(shù),e.g.,1,1.5,2or3.47定義一個(gè)聚光燈(一個(gè)特殊的點(diǎn)光源)

的顏色值,位置,衰減常數(shù)的指定方式和普通點(diǎn)光源相同。另外,我們可以指定聚光燈的方向和遮光角度4850403020 GLfloatlight_direction[]={0,0,-1};//Fromthelight glLightfv(GL_LIGHT2,GL_SPOT_DIRECTION,light_direction);

glLightf(GL_LIGHT2,GL_SPOT_CUTOFF,20.);截止角在白墻上的影響。49e=0e=10e=100也可以設(shè)置GL_SPOT_EXPONENT默認(rèn)值為0表示光強(qiáng)度從中心到邊緣均勻分布一個(gè)更高的衰減范圍導(dǎo)致中心強(qiáng)度更強(qiáng)。

glLightf(GL_LIGHT2,GL_SPOT_EXPONENT,10.);50指定一個(gè)亮紅色物體的反射比GLfloatdiffuse[]={.41,.135,.067,1.};GLfloatspecular[]={1.,1.,1.,1.};glMaterialfv(GL_FRONT,GL_AMBIENT,diffuse);glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,specular);glMaterialf(GL_FRONT,GL_SHININESS,125.);白色光源的方向?yàn)?1,1,1)51材質(zhì)的反射鏡面反射的紅色、綠色和藍(lán)色分量一般是相同的,因此光源的原始顏色將被反射。(在上一副關(guān)于茶壺的圖片中最亮的部分為白色,和光源的顏色一樣。)對(duì)于高度反光的材質(zhì),鏡面反射率接近于1并且亮度可高達(dá)100甚至更高.暗表面的鏡面反射率和亮度接近于0。一個(gè)材質(zhì)屬性,例如,反射比,在下一個(gè)值被指定之前保持有效。52材質(zhì)的顏色主要取決于漫反射率。漫反射提供很多曲率和物體深度的信息。鏡面反射產(chǎn)生的亮點(diǎn)為光源的模糊圖像。53OverallPureDiffusePureAmbientPureSpecular54

GLfloatambient[]={.6,.59,.42,1.};GLfloatdiffuse[]={.5,.5,.35,1.};GLfloatspecular[]={.1,.1,.07,1.};glMaterialfv(GL_FRONT,GL_AMBIENT,ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,specular);glMaterialf(GL_FRONT,GL_SHININESS,1.);光源為位于(1,1,1)處的白色線光源5556發(fā)光為讓一個(gè)材料看起來(lái)發(fā)光,例如,下一頁(yè)中的月亮. GLfloatemission[]={r,g,b,a};glMaterialfv(GL_FRONT,GL_EMISSION,emission);關(guān)閉emission:將r-,g-,b-部件設(shè)定為0值.注意一個(gè)發(fā)光物體不是一個(gè)光源.發(fā)光只是材質(zhì)的一個(gè)屬性GLfloatemission[]={1.,1.,.75,1.};glMaterialfv(GL_FRONT,GL_EMISSION,emission);draw_moon();GLfloatno_em[]={0.,0.,0.,1.};glMaterialfv(GL_FRONT,GL_EMISSION,no_em);57使用5種材質(zhì)渲染的一副圖片,兩個(gè)紋理,16個(gè)點(diǎn)光源.月亮是一個(gè)發(fā)光物體。5859Transparent透明物體60透明物體1.定義混合函數(shù),并打開混合glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_BLEND);2.定義材質(zhì)的不透明度小于1.3.在繪制透明物體之前先繪制背景物體.正面和背面都使用填充多邊形繪制。voidtransMaterial1(){GLfloata[]={.7,1.,.85,.3};GLfloats[]={1.,1.,1.,1.};glMaterialfv(GL_FRONT,GL_AMBIENT,a);glMaterialfv(GL_FRONT,GL_DIFFUSE,a);glMaterialfv(GL_FRONT,GL_SPECULAR,s);glMaterialf(GL_FRONT,GL_SHININESS,100.);}***616263所有的

OpenGL

參數(shù),包括光照,都有默認(rèn)值.在指定一個(gè)新的參數(shù)值之前,這個(gè)參數(shù)值一直保持有效。默認(rèn)GL_LIGHT0

發(fā)出白光并且位于視點(diǎn)處。確切的光照明效果是很難預(yù)測(cè)的。

在調(diào)節(jié)光照參數(shù)時(shí)實(shí)驗(yàn)和經(jīng)驗(yàn)都很重要。在一個(gè)PC機(jī)上

OpenGL

提供的照明效果是有限的。

64ShadowsShadow65ShadowBShadowsfromadirectionallightsource使用

i,j,k,l,pand;來(lái)移動(dòng)茶壺.使用

arrowsandPgUp

PgDnkeys來(lái)移動(dòng)光源.66光的方向?yàn)?dx,dy,dz).(x,y,z)在平面上的陰影位于(x’,y’,z’).我們有

x’=x+dx,y’=y+dy,

z’=z+dz.另外,a(x+dx)

+b

(y+dy)+c

(z+dz)+d=0.=(ax+by+cz+d)/(adx+bdy+cdz)(x,y,z)(x’,y’,z’)ax+by+cz+d=0(dx,dy,dz)67=(ax+by+cz+d)/(adx+bdy+cdz)68//設(shè)定矩陣M使得它將一個(gè)頂點(diǎn)投影到平面上//ax+by+cz+d=0.//光線的方向?yàn)?dx,dy,dz).voiddirectionalLightShadow(doubledx,doubledy,doubledz,doublea,doubleb,doublec,doubled,GLfloatM[16]){M[0]=b*dy+c*dz;M[4]=-b*dx;M[8]=-c*dx;M[12]=-d*dx;M[1]=-a*dy;M[5]=a*dx+c*dz;M[9]=-c*dy;M[13]=-d*dy;M[2]=-a*dz;M[6]=-b*dz;M[10]=a*dx+b*dy;M[14]=-d*dz;M[3]=0;M[7]=0;M[11]=0;M[15]=a*dx+b*dy+c*dz;}69GLfloatM[16];doubledx=…,dy=…,dz=…;glDisable(GL_LIGHTING);glColor4f(0.,0.,0.,1.);glPushMatrix();

directionalLightShadow(dx,dy,dz,0,0,1,5,M); glMultMatrixf(M);drawTeapot();glPopMatrix();在平面

z+5=0上繪制茶壺的陰影光線的方向?yàn)?dx,dy,dz)ShadowB70ShadowA從一個(gè)點(diǎn)光源得到的陰影71假設(shè)點(diǎn)光源位于原點(diǎn).頂點(diǎn)(x,y,z)的在平面上的陰影為(x’,y’,z’).因此我們有x’=x,y’=y,

z’=z.另外,a(x)+b

(y)+c

(z)+d=0.=d/(ax+by+cz)x’=dx/(ax+by+cz)(x,y,z)(x’,y’,z’)(0,0,0)ax+by+cz+d=072如果光源位于(lx,ly,lz)而不是在原點(diǎn),首先將光源移到原點(diǎn)(x,y,z)(x’,y’,z’)ax+by+cz+d=0(lx,ly,lz)(x,y,z)(x’,y’,z’)ax+by+cz+new_d=0(0,0,0)x=x–lxy=y–

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論