![圖形學(xué)光照與明暗處理_第1頁](http://file4.renrendoc.com/view/0ea76d27328a7d2097e3868ed5e47a11/0ea76d27328a7d2097e3868ed5e47a111.gif)
![圖形學(xué)光照與明暗處理_第2頁](http://file4.renrendoc.com/view/0ea76d27328a7d2097e3868ed5e47a11/0ea76d27328a7d2097e3868ed5e47a112.gif)
![圖形學(xué)光照與明暗處理_第3頁](http://file4.renrendoc.com/view/0ea76d27328a7d2097e3868ed5e47a11/0ea76d27328a7d2097e3868ed5e47a113.gif)
![圖形學(xué)光照與明暗處理_第4頁](http://file4.renrendoc.com/view/0ea76d27328a7d2097e3868ed5e47a11/0ea76d27328a7d2097e3868ed5e47a114.gif)
![圖形學(xué)光照與明暗處理_第5頁](http://file4.renrendoc.com/view/0ea76d27328a7d2097e3868ed5e47a11/0ea76d27328a7d2097e3868ed5e47a115.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1第八章明暗處理
為了使用幾何模型創(chuàng)造逼真的圖形場景,我們根據(jù)物體的材質(zhì)屬性、光源位置和視點計算物體表面的光照亮度。2內(nèi)容Phong照明模型點光源線光源反射漫反射鏡面反射環(huán)境反射Gouraud明暗處理Phong明暗處理陰影3點光源n為表面法向.
n在平面上各點處是相等的s
為光源的方向.
s
根據(jù)位置的不同不斷改變,例如,
s1
s2.
光源靠近物體表面時,s的改變量變得更大
sns1s2nn4線光源當(dāng)光源離得較遠時,s的變化將變得不明顯.當(dāng)距離變得非常遠時,s在一個表面上保持不變
例如太陽.被稱為線光源(或平行光源,或分散光源.)ssnn5令I(lǐng)i
為入射光的強度
,為
s和n
的夾角大小,0o90o.Ii
cos為單位表面區(qū)域接收到的光的數(shù)量當(dāng)
=0,入射光垂直于表面。表面接收到的入射光的數(shù)量最多例如:
正午的太陽光當(dāng)=90o時,它接收不到光照。當(dāng)>90o時,光在表面的另一邊,它也接收不到光照。cossncos6漫反射一個完美的粗糙表面幾乎可以向所有方向反射光Lambert余弦定律
反射的光的數(shù)量為
Id=
RdIi
cosRd,漫反射系數(shù)為:
0Rd
1Id
與視點無關(guān)
cos為s在n上的投影.
如果s
和
n
是單位向量, cos=sn
(點乘)snsncosMicroscopicview7衰減
當(dāng)光遠離表面時,光的強度變?nèi)鯇τ谝粋€點光源,衰減系數(shù)為,
d
為到點光源的距離.
a,b,
和
c
為以經(jīng)驗選擇的啟發(fā)式參數(shù)
、對于一個定向光源,Af=1(intheory)(inpractice)8漫反射
從一個點光源從一個線光源 Id=
RdIi
cos=
RdIi
(sn)9Purediffusereflectionfromdirectionalsourcepointing(1,1,1)10鏡面反射平滑的亮的表面對光的反射.純鏡面反射的例子11鏡面反射一個亮的表面以一個標(biāo)準(zhǔn)的方向反射光r
在跨越
n
和
s的表面上.
它和n的夾角大小與n和s的夾角大小相等
.0o90o.
當(dāng)從
v方向觀察表面上的一個點時,光的反射量為:
Ii,入射光強度
Rs,鏡面反射系數(shù),
0Rs
1snrsnrv12
為標(biāo)準(zhǔn)反射線
(r)
和視線
(v)
的夾角在一個亮表面上,當(dāng)
v
偏離
r
時很少能發(fā)現(xiàn)反射光.
當(dāng)在一個陰暗的表面上,在v處能發(fā)現(xiàn)更多的光。
這種現(xiàn)象可用cosk
來建模.k為物體的反光度。k越大,亮度越高。cos=rv光的衰減的建模與漫反射相同。snrv1314鏡面反射從點光源從線光源
15找到反射射線
r,根據(jù)
n
和
sr,n和s為歸一化向量.red_arrow=(n
?s)nr+s=2red_arrow
r=2(n
?s)ns
rsrsrsn16模擬材質(zhì)屬性為了提高效率,在公式中使用
h
n來近似r
v。h
被稱為half-way向量.h=(s+v
)/2snrvh17使用模擬材質(zhì)屬性進行漫反射從一個點光源從一個線光源
h=(s+v
)/218kshalllessthan12819純鏡面反射20環(huán)境光的反射(background),Ia由于表面之間的多次反射,環(huán)境光(IAm)為均勻亮度. Ia=RaIAmRa,環(huán)境光反射系數(shù),
0Ra
1Ia和表面法向及視點無關(guān),和光源的位置(或方向)無關(guān)21PureAmbientfloatglobalAmbient[]={0.9,0.9,0.9,1.};glLightModelfv(GL_LIGHT_MODEL_AMBIENT,globalAmbient);22OverallPureDiffusePureAmbientPureSpecular23整體Phong照明模型對點光源的反射對線光源的反射
24ShinyTeapot
為生成彩色圖片,分別對紅色、綠色和藍色進行明暗處理運算。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ù)量。在快速渲染中,只對多邊形上的一個點進行一次反射計算。計算的結(jié)果將被賦給多邊形上的所有像素.表面法向被用于計算整個多邊形有同樣的明暗值方法是有效率的,但過于粗糙。n26一個Machband
是在兩個具有不同明暗值的多邊形的鄰接邊上發(fā)現(xiàn)的條紋.Machbands經(jīng)常發(fā)現(xiàn)于陰影上我們的眼睛對離散變化的明暗特別敏感
2728Gouraud明暗處理,基于頂點的
對多邊形上的每個頂點進行一次明暗計算。
每個頂點有一個法向,可能是多邊形的法向或者周圍相鄰幾個法向的平均。使用這個頂點的法向計算這個頂點處像素的明暗值。n4n3n2n1n0nbncnandn29被這個多邊形覆蓋的其他像素的明暗值通過插值得到,如同計算顏色的情況。中間點的顏色C,由下式得到:
ABC30確定被多邊形覆蓋的一個像素點的顏色D的顏色由A和B確定E的顏色由
A和C確定F點的顏色由D和E確定BACDEF一行像素31ConstantShadingGouraudShading323334Phong明暗處理,基于像素不同于Gouraud明暗處理技術(shù)的對每個像素處明暗值進行插值計算,Phong提出對多邊形上的每個像素的法向進行插值計算。然后計算每個像素處的明暗值。使用Gouraud明暗處理技術(shù),我們常常需要將一個表面分割成小塊來得到滿意的結(jié)果。Phong明暗處理技術(shù)減少了過多的分割,但是需要更多的計算。它能產(chǎn)生更高質(zhì)量的圖片但也更慢。BACDEFArowofpixels35插值計算邊緣和每一行像素的法向36Phong明暗處理技術(shù)示例37OpenGL
中的照明技術(shù)Enable/Disablelighting glEnable(GL_LIGHTING); //settingcolorsareignored glDisable(GL_LIGHTING);指定一個陰影模型 Eitherflatshadingorsmooth(Gouraud)shading glShadeModel(GL_FLAT); glShadeModel(GL_SMOOTH);指定每個頂點的法向量.例如,在原點繪制球體時
glNormal3f(x,y,z);glVertex3f(r*x,r*y,r*z);38在另一個法向被指定前,一個法向一直保持有效。//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為了避免需要提供單位法向的困擾,你可以通過在
init()
中增加以下語句來讓系統(tǒng)為你歸一化所有向量
glEnable(GL_NORMALIZE);為一個光源指定顏色元素(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實際生活中,一個光源的漫反射和鏡面反射經(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)用下面語句將它轉(zhuǎn)化為(r,g,b),作為全局環(huán)境光. floatglobalAmbient[]={r,g,b,1.};glLightModelfv(GL_LIGHT_MODEL_AMBIENT,globalAmbient);指定一個點光源的位置 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個光源 GL_LIGHT0,GL_LIGHT1,…,GL_LIGHT7打開或關(guān)閉一個特定的光源
(在繪制之前或之后) glEnable(GL_LIGHT0); glDisable(GL_LIGHT0);默認模式下,OpenGL
假設(shè)觀察者在無窮遠處,這樣視角為一個常數(shù)。
當(dāng)觀察者實際離得很近時,這種近似會導(dǎo)致嚴(yán)重的錯誤。 ToaskOpenGLtousethetrueviewingangleinthecalculationofspecularreflection. glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);44網(wǎng)格大小的影響(Important)
下面,一個發(fā)光的白墻被分成不同的大小并用一個白色的線光源來渲染
GLfloatambient0[]={0.,0.,0.,1.}; GLfloatdiffuse0[]={.7,.7,.7,1.};GLfloatspecular0[]={1.,1.,1.,1.}; position[]={0.,0.,1.,0.};//光源方向
//視點位置(0,0,8)20×2010×104×42×21×1FastSlow45線光源和點光源在一個白色發(fā)光物體上的比較.視點位置在(0,0,8)Pointsourceat(0,0,8)Dir.sourceat(0,0,1)46對于一個點光源,我們可以指定一個常數(shù)為衰減系數(shù) glLightf(GL_LIGHT1,GL_CONSTANT_ATTENUATION,.0);glLightf(GL_LIGHT1,GL_LINEAR_ATTENUATION,.5);glLightf(GL_LIGHT1,GL_QUADRATIC_ATTENUATION,0.);默認值為
a=1,b=0,c=0(沒有衰減)對于更高的衰減,則為b和
c設(shè)定一個更高的系數(shù),e.g.,1,1.5,2or3.47定義一個聚光燈(一個特殊的點光源)
的顏色值,位置,衰減常數(shù)的指定方式和普通點光源相同。另外,我們可以指定聚光燈的方向和遮光角度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默認值為0表示光強度從中心到邊緣均勻分布一個更高的衰減范圍導(dǎo)致中心強度更強。
glLightf(GL_LIGHT2,GL_SPOT_EXPONENT,10.);50指定一個亮紅色物體的反射比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.);白色光源的方向為(1,1,1)51材質(zhì)的反射鏡面反射的紅色、綠色和藍色分量一般是相同的,因此光源的原始顏色將被反射。(在上一副關(guān)于茶壺的圖片中最亮的部分為白色,和光源的顏色一樣。)對于高度反光的材質(zhì),鏡面反射率接近于1并且亮度可高達100甚至更高.暗表面的鏡面反射率和亮度接近于0。一個材質(zhì)屬性,例如,反射比,在下一個值被指定之前保持有效。52材質(zhì)的顏色主要取決于漫反射率。漫反射提供很多曲率和物體深度的信息。鏡面反射產(chǎ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ā)光為讓一個材料看起來發(fā)光,例如,下一頁中的月亮. GLfloatemission[]={r,g,b,a};glMaterialfv(GL_FRONT,GL_EMISSION,emission);關(guān)閉emission:將r-,g-,b-部件設(shè)定為0值.注意一個發(fā)光物體不是一個光源.發(fā)光只是材質(zhì)的一個屬性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ì)渲染的一副圖片,兩個紋理,16個點光源.月亮是一個發(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ù),包括光照,都有默認值.在指定一個新的參數(shù)值之前,這個參數(shù)值一直保持有效。默認GL_LIGHT0
發(fā)出白光并且位于視點處。確切的光照明效果是很難預(yù)測的。
在調(diào)節(jié)光照參數(shù)時實驗和經(jīng)驗都很重要。在一個PC機上
OpenGL
提供的照明效果是有限的。
64ShadowsShadow65ShadowBShadowsfromadirectionallightsource使用
i,j,k,l,pand;來移動茶壺.使用
arrowsandPgUp
和
PgDnkeys來移動光源.66光的方向為(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使得它將一個頂點投影到平面上//ax+by+cz+d=0.//光線的方向為(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上繪制茶壺的陰影光線的方向為(dx,dy,dz)ShadowB70ShadowA從一個點光源得到的陰影71假設(shè)點光源位于原點.頂點(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)而不是在原點,首先將光源移到原點(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度城市道路回填工程承包合同
- 上海居間合同范本
- 保密條款合同范本
- 2025年建筑門窗安裝與智能化管理系統(tǒng)合同
- 養(yǎng)殖工人安全合同范本
- 與飯店合作合同范例
- 烏魯木齊離婚律師合同范例
- 包招聘合同范本
- 公園木棧道維修合同范本
- 農(nóng)副產(chǎn)購銷合同范本
- 部編版語文二年級下冊第三單元教材解讀大單元集體備課
- HYT 235-2018 海洋環(huán)境放射性核素監(jiān)測技術(shù)規(guī)程
- ISO28000:2022供應(yīng)鏈安全管理體系
- 中國香蔥行業(yè)市場現(xiàn)狀分析及競爭格局與投資發(fā)展研究報告2024-2034版
- 婦科惡性腫瘤免疫治療中國專家共識(2023)解讀
- 2024年浪潮入職測評題和答案
- 小班數(shù)學(xué)《整理牛奶柜》課件
- 中考語文真題雙向細目表
- 我國新零售業(yè)上市公司財務(wù)質(zhì)量分析-以蘇寧易購為例
- 藥品集采培訓(xùn)課件
- 股骨干骨折教學(xué)演示課件
評論
0/150
提交評論