版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、大綱明暗處理介紹光源明暗處理OpenGL for shadingOpenGL for lighting范例Introduction of shading(1/2)Shading(明暗處理)真實(shí)感圖形:必須考慮燈光與模型之間的關(guān)系燈光-材質(zhì)相互關(guān)系(light-material interaction)目標(biāo):發(fā)展出燈光模型(lighting model)wireframeflat shadingphong shading明暗處理概念在計(jì)算機(jī)圖形學(xué)當(dāng)中,使用多邊形來(lái)逼近光滑曲面,可以使用單一的顏色或者許多不同的顏色來(lái)渲染這些多邊形,這稱為明暗處理。在openGL中,用單一顏色處理的方式稱為平面明暗
2、處理(Flat shading),而用許多不同顏色處理的方式稱為光滑明暗處理(smooth shading),smooth shading也叫,Gourand Shading。在openGL中,我們可以調(diào)用函數(shù) void glShadeModel(GLenum mode); Introduction of shading(2/2)Shading根據(jù)光源位置(light position,direction,color.)、材質(zhì)屬性(materials color,texture.)、表面的幾何性質(zhì)(normal.)計(jì)算出物體表面的色度以viewport上的圖點(diǎn)為單位探討主題:光源,光與材質(zhì)的關(guān)
3、系,法向量對(duì)色度的影響xyz投影平面(projection plane)Viewport掃描線依序計(jì)算點(diǎn)的色度光與材質(zhì)(1/2)眼睛之所以能看見(jiàn)物體,是因?yàn)槲矬w自行發(fā)光物體反射光線模擬光線,物體,眼睛之間互動(dòng)光線跟蹤法(ray-tracing)輻射成像(radiosity)計(jì)算速度緩慢光與材質(zhì)(2/2)光與物體的互動(dòng)關(guān)系材質(zhì)方面有三種屬性鏡射表面(specular surface):金屬,鏡子散射表面(diffuse surface):陶器半透明表面(translucent surface):毛玻璃Reflection(diffuse)inReflection(specular)transmi
4、ttedScattering & emissionabsorption光源(1/11)光源強(qiáng)度表示法三色理論以rgb三個(gè)成分強(qiáng)度(Ir,Ig,Ib)代表光源四種基本光源環(huán)境光源(ambient light)均勻散布于環(huán)境中的亮度,沒(méi)有方向性,對(duì)所有物體的影響均相同例如,陰雨天看不見(jiàn)太陽(yáng),但仍有一定亮度點(diǎn)光源(point light)理想點(diǎn)光源:體積0,呈放射狀用于產(chǎn)生強(qiáng)烈的對(duì)比效果聚光燈(spotlight)探照燈遠(yuǎn)距平行光源(distant light)太陽(yáng)光光源(2/11)光源對(duì)物體顏色的影響,假設(shè)各光源的強(qiáng)度分別是:環(huán)境光源(ambient light):Ia點(diǎn)光源:Isp聚光燈:Iw平
5、行光: Ip則物體上某一點(diǎn)投射到眼睛(投影平面)的顏色將是F(Ia, Isp, Iw, Ip)問(wèn)題是F()=?從光源與物體材質(zhì)互動(dòng)來(lái)找出F()即一簡(jiǎn)化模型反射模型:三種互動(dòng)ambient light reflection, diffuse reflection, specular reflection環(huán)境光源反射,散射,鏡射分別代表ambient color, diffuse color, specular color有時(shí)候也會(huì)加入深度效應(yīng)(depth cue),及透明度光源(3/11)環(huán)境光源反射(ambient light reflection)通常假設(shè)有一環(huán)境光源強(qiáng)度為Ia打在表面上有部
6、份被吸收吸收比例:由ka(環(huán)境光源反射系數(shù))決定環(huán)境光色反射系數(shù)(ambient reflection coefficient):與物體材質(zhì)有關(guān)此系數(shù)可能是一向量NLR吸收光源(4/11)散射(diffuse reflection)物體表面粗糙導(dǎo)致光線反射沒(méi)有一致的方向性(圖6-14)散射平面,只能看到部份的光線NLR部份反射:入射角=反射角部份吸收(ambient color)理想表面真實(shí)對(duì)象表面(放大觀察)光源(5/11)散射(diffuse reflection)(CONT)Lamberts law(考慮點(diǎn)光源):看到的部份光線量和L,N夾角的余旋函數(shù)(cos)成正比如果L,N的長(zhǎng)度都是
7、1(即單位向量)再考慮散射系數(shù)(因?yàn)椴糠荼晃? 可得diffuse reflection termReflection(diffuse)inReflection(specular)transmittedScattering & emissionabsorptionNLRcos = L Ndiffuse reflection term :點(diǎn)光源光源(6/11)散射(diffuse reflection)(CONT)假設(shè)光線沒(méi)有任何衰減考慮強(qiáng)度衰減:光線經(jīng)過(guò)距離d之后,強(qiáng)度變?nèi)醯那樾蝜ight-source attenuation光源強(qiáng)度x強(qiáng)度衰減比例(light-source attenuat
8、ion factor)光源強(qiáng)度衰減比例常數(shù)Ci使用者可自定,通??稍O(shè)為光源(7/11)有顏色的平面與光源平面的顏色:diffuse color Od顏色的計(jì)算不含Od光源(8/11)深度效應(yīng)(depth cueing)大氣衰減效應(yīng)(atmospheric attenuation )假設(shè)ambient term與diffuse term的和為則加上depth cueing之后的顏色為:depth-cue color通常是背景顏色光源(9/11)Specular Reflection(鏡射)作用于反光平面金屬,鏡子,蘋果表皮.Phong所提的近似模型觀察者所看到光線強(qiáng)度取決于夾角不考慮物體顏色時(shí),
9、鏡射產(chǎn)生的強(qiáng)度鏡射強(qiáng)光NLRv觀察者v鏡面反射方向R入射光線L平面法向量N觀察者與光線反射方向之夾角n不同,代表不同材質(zhì)鏡射反射系數(shù)光源(10/11)夾角與n的關(guān)聯(lián):n越大,亮點(diǎn)越小,越亮,越集中如果R,V都是單位向量物體的specular color OsNLRv光源(11/11)眼睛看到的顏色:多重光源ambientdiffusespecular光線強(qiáng)度衰減系數(shù)大氣層衰減效應(yīng)背景色Shading(1/8)四種常見(jiàn)的shading方式之一flat shading (或稱constant shading)只考慮ambient與diffuse reflection求得三角形(多邊形)中某個(gè)點(diǎn)(例
10、如某頂點(diǎn))的顏色強(qiáng)度之后,即以該顏色作為整個(gè)三角形(多邊形)的顏色viewer不夠真實(shí)圖6.27Shading(2/8)四種常見(jiàn)的shading方式之二Interpolated shading(內(nèi)插著色法)只考慮ambient與diffuse reflection以三個(gè)頂點(diǎn)顏色進(jìn)行內(nèi)插計(jì)算Shading(3/8)四種常見(jiàn)的shading方式之三最初內(nèi)插著色法只用于單一三角形一般化之后,擴(kuò)充至多邊形,解決三角形接縫問(wèn)題 即所謂的Gouraud Shading仍只考慮ambient與diffuse reflection法向量平均法 + 頂點(diǎn)顏色強(qiáng)度內(nèi)差Shading(4/8)關(guān)于法向量(norma
11、l vector)平面法向量平面法向量 n如果知道平面方程式為則法向量 n為如果知道三個(gè)頂點(diǎn)坐標(biāo)則法向量 n為外積P0P1P2法向量 nShading(5/8)關(guān)于法向量(normal vector)cont如果知道曲面方程為而法向量 n與切線垂直切線法向量 n法向量 n則切線為法向量 n法向量 n(2x,2y,2z)Shading(6/8)四種常見(jiàn)的shading方式之四Gouraud shading 顏色內(nèi)插值Phong shading 法向量?jī)?nèi)插值考慮ambient與diffuse reflection + specular reflectionOpenGL for shading(1/
12、4)指定shading modelOpenGL支持兩種shading modelGL_FLATFlat shading:以一個(gè)頂點(diǎn)的顏色做為整個(gè)多邊形的顏色GL_SMOOTH(默認(rèn)值)每一點(diǎn)的顏色各自獨(dú)立計(jì)算以頂點(diǎn)顏色做內(nèi)插(Gouraud shading)void glShadeModel(GLenum mode);mode可設(shè)為GL_FLAT或GL_SMOOTHOpenGL for shading(2/4)/* smooth.c(1/3)* This program demonstrates smooth shading.* A smooth shaded polygon is drawn
13、 in a 2-D projection.*/#include #include void init(void) glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_SMOOTH);void triangle(void)glBegin (GL_TRIANGLES);glColor3f (1.0, 0.0, 0.0);glVertex2f (5.0, 5.0);glColor3f (0.0, 1.0, 0.0);glVertex2f (25.0, 5.0);glColor3f (0.0, 0.0, 1.0);glVertex2f (5.0, 25
14、.0);glEnd();/下頁(yè)繼續(xù)OpenGL for shading(3/4)/* smooth.c(2/3)*/void display(void)glClear (GL_COLOR_BUFFER_BIT);triangle ();glFlush ();void reshape (int w, int h)glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();if (w = h) gluOrtho2D (0.0, 30.0, 0.0, 30.0 * (GLfloa
15、t) h/(GLfloat) w);else gluOrtho2D (0.0, 30.0 * (GLfloat) w/(GLfloat) h, 0.0, 30.0);glMatrixMode(GL_MODELVIEW);void keyboard(unsigned char key, int x, int y) switch (key) case 27: exit(0); break;/下頁(yè)繼續(xù)OpenGL for shading(4/4)/* smooth.c(3/3)*/int main(int argc, char* argv)glutInit(&argc, argv);glutInit
16、DisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (500, 500);glutInitWindowPosition (100, 100);glutCreateWindow (argv0);init ();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc (keyboard);glutMainLoop();return 0;OpenGL for lighting(1/11)在OpenGL環(huán)境中加入光源的步驟步驟1定義所有物體上每一個(gè)點(diǎn)的法向量可以調(diào)用
17、glNormal*設(shè)定頂點(diǎn)法向量步驟2建立光源調(diào)用glLight*建立光源的位置,方向,光度(包含ambient light, diffuse light & specular light),強(qiáng)度衰減系數(shù)(c1,c2,c3)用glEnable()將燈光開(kāi)關(guān)打開(kāi)步驟3選定lighting model是否加入global ambient light效應(yīng),是否處理正反兩面,specular color 的計(jì)算與否.步驟4定義場(chǎng)景中物體的材質(zhì)屬性(material)設(shè)定物體的顏色(ambient,diffuse,specular color & shininess)OpenGL for lightin
18、g(2/11)OpenGL支持的法向量相關(guān)函數(shù)glNormal3* : 設(shè)定法向量后續(xù)調(diào)用glVertex3*設(shè)定的頂點(diǎn),都會(huì)以該法向量做為頂點(diǎn)法向量glBegin(GL_POLYGON);glNormal3fv(n0);/ n0:三個(gè)元素的array,代表法向量(x,y,z)glVertex3fv(v0);/ v0:三個(gè)元素的array,代表頂點(diǎn)(x,y,z)glNormal3fv(n1);glVertex3fv(v1);glNormal3fv(n2);glVertex3fv(v2);glNormal3fv(n3);glVertex3fv(v3);glEnd(); glNormal3bsid
19、fv(const TYPE *v);/ v:三個(gè)元素的array glNormal3bsidf(TYPE nx, TYPE ny, TYPE nz);function prototypeOpenGL for lighting(3/11)法向量必須自行計(jì)算!在進(jìn)行l(wèi)ighting calculation之前,法向量必須維持為單位法向量(長(zhǎng)度為1)!解決之道:一開(kāi)始就設(shè)成長(zhǎng)度為1的單位法向量當(dāng)物體完成scaling transformation之后,法向量長(zhǎng)度會(huì)改變,必須調(diào)用glEnable(GL_NORMALIZE)重新改變法向量為單位法向量若scaling transformation是x,y
20、,z等比例縮放的話,則也可調(diào)用glEnable(GL_RESCALE_NORMAL)GL_RESCALE_NORMAL的計(jì)算比GL_NORMALIZE快OpenGL for lighting(4/11)/ * light.c(1/3) */#include #include / Initialize material property, light source, lighting model, and depth buffer.void init(void) GLfloat mat_specular = 1.0, 1.0, 1.0, 1.0 ;GLfloat mat_shininess =
21、50.0 ;GLfloat light_position = 1.0, 1.0, 1.0, 0.0 ;glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_SMOOTH);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);glLightfv(GL_LIGHT0, GL_POSITION, light_position);glEnable(GL_LIGHTING);glEnable(GL_LIGH
22、T0);glEnable(GL_DEPTH_TEST);/下頁(yè)繼續(xù)OpenGL for lighting(5/11)/ * light.c(2/3) */void display(void)glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glutSolidSphere (1.0, 20, 16);glFlush ();void reshape (int w, int h)glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdenti
23、ty();if (w = h)glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);elseglOrtho (-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();/下頁(yè)繼續(xù)OpenGL for lighting(6/11)/ * light.c(3/3) */void keyboard(
24、unsigned char key, int x, int y)switch (key) case 27: exit(0); break;int main(int argc, char* argv)glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize (500, 500);glutInitWindowPosition (100, 100);glutCreateWindow (argv0);init ();glutDisplayFunc(display)
25、;glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;OpenGL for lighting(7/11)程序解析步驟一:設(shè)定Shading Model步驟二:設(shè)定光源void glShadeModel(GLenum mode);mode可設(shè)為GL_FLAT或GL_SMOOTH(逐點(diǎn)運(yùn)算)glLightfv(GL_LIGHT0, GL_POSITION, light_position);light_position是一數(shù)組,定義如下:GLfloat light_position = 1.0, 1.
26、0, 1.0, 0.0 ;常數(shù)GL_LIGHT0是系統(tǒng)內(nèi)定的光源名稱常數(shù)(GL_LIGHT0, GL_LIGHT1, GL_LIGHT2.)OpenGL for lighting(8/11)程序解析關(guān)于光源函數(shù) glLightifv(GLenum light, GLenum pname, TYPE *param);glLightif(GLenum light, GLenum pname, TYPE param);function prototype光源代號(hào)改變的參數(shù)代號(hào)設(shè)定的參數(shù)值光源代號(hào): 從GL_LIGHT0 GL_LIGHT7改變的參數(shù)代號(hào)默認(rèn)值meaningGL_AMBIENT(0.0
27、, 0.0, 0.0, 1.0)光的ambient強(qiáng)度GL_DIFFUSE(1.0, 1.0, 1.0, 1.0)或(0.0, 0.0, 0.0, 1.0)光的diffuse強(qiáng)度GL_SPECULAR(1.0, 1.0, 1.0, 1.0)或(0.0, 0.0, 0.0, 1.0)光的specular強(qiáng)度OpenGL for lighting(9/11)程序解析關(guān)于光源函數(shù)(cont)改變的參數(shù)代號(hào)默認(rèn)值meaningGL_POSITION(0.0, 0.0, 0.0, 1.0)光源位置GL_CONSTANT_ATTENUATION1.0衰減系數(shù)GL_LINEAR_ATTENUATION0.0
28、衰減系數(shù)GL_QUADRATIC_ATTENUATION0.0衰減系數(shù)GL_SPOT_DIRECTION(0.0, 0.0, -1.0)光源方向GL_SPOT_EXPONENT0.0spotlight exponentGL_SPOT_CUTOFF180.0cutoff angleOpenGL for lighting(10/11)程序解析步驟三:設(shè)定light model glLightModelifv(GLenum pname, TYPE *param); glLightModelif(GLenum pname, TYPE param);設(shè)定光源模型。function prototype改變
29、的參數(shù)代號(hào)meaningGL_LIGHT_MODEL_AMBIENT環(huán)境中ambient強(qiáng)度GL_LIGHT_MODEL_LOCAL_VIEWER計(jì)算specular反射角的方式GL_LIGHT_MODEL_TWO_SIDE單面/雙面打光GL_LIGHT_MODEL_COLOR_CONTROLspecular term是否單獨(dú)計(jì)算改變的參數(shù)代號(hào)設(shè)定的參數(shù)值OpenGL for lighting(11/11)程序解析步驟四:設(shè)定物體材質(zhì) glMaterialifv(GLenum face, GLenum pname, TYPE *param); glMaterialif(GLenum face,
30、 GLenum pname, TYPE param);改變的參數(shù)代號(hào)meaningGL_AMBIENTambient colorGL_DIFFUSEdiffuse colorGL_AMBIENT_AND_DIFFUSEambient+diffuseGL_SPECULARspecular colorGL_SHININESSspecular指數(shù)項(xiàng)GL_EMISSION發(fā)光體GL_COLOR_INDEXES以索引方式存取顏色范例(1/28)定義光源的位置與顏色GLfloat light_ambient = 0.0, 0.0, 0.0, 1.0 ;/ 漫射強(qiáng)度GLfloat light_diffuse
31、 = 1.0, 1.0, 1.0, 1.0 ;/ 散射強(qiáng)度GLfloat light_specular = 1.0, 1.0, 1.0, 1.0 ;/鏡射強(qiáng)度GLfloat light_position = 1.0, 1.0, 1.0, 0.0 ;/位置glLightfv(GL_LIGHT0,GL_AMBIENT, light_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE, light_diffuse);glLightfv(GL_LIGHT0,GL_SPECULAR, light_specular);glLightfv(GL_LIGHT0,GL_POSITIO
32、N, light_position);.glLight*可供設(shè)定的參數(shù)代號(hào)glLight*可供設(shè)定的參數(shù)代號(hào)GL_AMBIENTGL_LINEAR_ATTENUATIONGL_DIFFUSEGL_QUADRATIC_ATTENUATIONGL_SPECULARGL_SPOT_DIRECTIONGL_POSITIONGL_SPOT_EXPONENTGL_CONSTANT_ATTENUATIONGL_SPOT_CUTOFF范例(2/28)定義光源的位置與顏色(CONT)光源強(qiáng)度衰減與距離平方成反比.glLightfv(GL_LIGHT0,GL_CONSTANT_ATTENUATION, 0.5);
33、glLightfv(GL_LIGHT0,GL_LINEAR_ATTENUATION, 0.25);glLightfv(GL_LIGHT0,GL_QUADRATIC_ATTENUATION, 0.5);.范例(3/28)探照燈方向性,照射范圍,集中程度GL_SPOT_CUTOFFGL_SPOT_DIRECTION.GLfloat spot_direction = -1.0, -1.0, 0.0 ;/方向.glLightf(GL_LIGHT0,GL_SPOT_CUTOFF, 45.0 );/ 45度glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION, spot_direct
34、ion);.范例(4/28)多重光源(GL_LIGHT0GL_LIGHT7)GLfloat light0_ambient=0.0, 0.0, 0.0, 1.0 ;/ 第一個(gè)光源glLightfv(GL_LIGHT0,GL_AMBIENT, light0_ambient);/ 第一個(gè)光源的漫射強(qiáng)度.GLfloat light1_ambient = 0.0, 0.0, 0.0, 1.0 ;/ 第二個(gè)光源GLfloat light1_diffuse = 1.0, 1.0, 1.0, 1.0 ;GLfloat light1_specular = 1.0, 1.0, 1.0, 1.0 ;GLfloat
35、light1_position = 1.0, 1.0, 1.0, 0.0 ;GLfloat spot_direction = -1.0, -1.0, 0.0 ;/ 方向glLightfv(GL_LIGHT1,GL_AMBIENT, light1_ambient);/漫射強(qiáng)度glLightfv(GL_LIGHT1,GL_DIFFUSE, light1_diffuse);/ 散射強(qiáng)度glLightfv(GL_LIGHT1,GL_SPECULAR, light1_specular);/鏡射強(qiáng)度glLightfv(GL_LIGHT1,GL_POSITION, light1_position);/位置g
36、lLightfv(GL_LIGHT1,GL_CONSTANT_ATTENUATION, 0.5);/ 強(qiáng)度衰減系數(shù)glLightfv(GL_LIGHT1,GL_LINEAR_ATTENUATION, 0.25);glLightfv(GL_LIGHT1,GL_QUADRATIC_ATTENUATION, 0.5);glLightf(GL_LIGHT1,GL_SPOT_CUTOFF, 45.0 );/ 45度glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION, spot_direction);glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,2.0);
37、glEnable(GL_LIGHT1);/ 開(kāi)啟第二個(gè)光源,程序最前面已經(jīng)執(zhí)行g(shù)lEnable(GL_LIGHTING)范例(5/28)光源位置固定void init(void).GLfloat light_position = 1.0, 1.0, 1.0, 1.0 ;glLightfv(GL_LIGHT0, GL_POPSITION, light_position);.范例(6/28)單獨(dú)移動(dòng)光源(假設(shè)物體不動(dòng),但想改變光源的位置)static GLdouble spin=30.0;void init() ./* 內(nèi)容與前相同 */. void display() GLfloat posit
38、ion = 0.0, 0.0, 1.5, 1.0 ;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glPushMatrix();glRotated(spin, 1.0, 0.0, 0.0);glLightfv(GL_LIGHT0, GL_POSITION, position);glPopMatrix();gluSolidTorus(0.275, 0.85, 8, 15);glPopMatrix();g
39、lFlush();范例(7/28)/ * movelight.c(1/4)* A sphere is drawn using a grey material characteristic.* A single light source illuminates the object.* Interaction: pressing the left mouse button alters* the modeling transformation (x rotation) by 30 degrees.* The scene is then redrawn with the light in a ne
40、w position. */#include #include static int spin = 0;/* Initialize material property, light source, lighting model,* and depth buffer. */void init(void)glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_SMOOTH);glEnable(GL_LIGHTING);/ 開(kāi)啟光源計(jì)算功能glEnable(GL_LIGHT0);/ 把燈光一GL_LIGHT0打開(kāi)glEnable(GL_DEPTH_TES
41、T);/ 下頁(yè)繼續(xù)范例(8/28)/ * movelight.c(2/4) */void display(void)GLfloat position = 0.0, 0.0, 1.5, 1.0 ;glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix ();gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glPushMatrix ();glRotated (GLdouble) spin, 1.0, 0.0, 0.0);/ 只旋轉(zhuǎn)光源,及底下的cubeglLig
42、htfv (GL_LIGHT0, GL_POSITION, position);glTranslated (0.0, 0.0, 1.5);glDisable (GL_LIGHTING);/ 暫時(shí)不計(jì)算光源影響glColor3f (0.0, 1.0, 1.0);glutWireCube (0.1);/ 代表光源位置的cubeglEnable (GL_LIGHTING);/ 重新計(jì)算光源影響glPopMatrix ();/ 恢復(fù)gluLookAt()之后的狀態(tài)glutSolidTorus (0.275, 0.85, 8, 15);glPopMatrix ();glFlush ();/ 下頁(yè)繼續(xù)范例
43、(9/28)/ * movelight.c(3/4) */void reshape (int w, int h) glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity();gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();void mouse(int button, int state, int x, int y) swit
44、ch (button) caseGLUT_LEFT_BUTTON:/ 鼠標(biāo)左鍵if (state =GLUT_DOWN) / 按下spin = (spin + 30) % 360; glutPostRedisplay();/ 重畫(huà)break;default: break;/ 下頁(yè)繼續(xù)范例(10/28)/ * movelight.c(4/4) */void keyboard(unsigned char key, int x, int y) switch (key) case 27: exit(0); break;int main(int argc, char* argv)glutInit(&ar
45、gc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize (500, 500);glutInitWindowPosition (100, 100);glutCreateWindow (argv0);init ();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMouseFunc(mouse);glutKeyboardFunc(keyboard);glutMainLoop();return 0;范例(11/28)執(zhí)行結(jié)果
46、范例(12/28)選擇光源模型全局漫射光源(global ambient light)光源各自有自己的漫射強(qiáng)度,但global ambient light則是在光源之外,另外設(shè)定的場(chǎng)景漫射強(qiáng)度.GLfloat lmodel_ambient =0.2, 0.2, 0.2, 1.0;glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);.改變的參數(shù)代號(hào)meaningGL_LIGHT_MODEL_AMBIENT環(huán)境中ambient強(qiáng)度GL_LIGHT_MODEL_LOCAL_VIEWER計(jì)算specular反射角的方式GL_LIGHT_MODE
47、L_TWO_SIDE單面/雙面打光GL_LIGHT_MODEL_COLOR_CONTROLspecular term是否單獨(dú)計(jì)算范例(13/28)選擇光源模型(cont)反射角的計(jì)算方式NLRv觀察者v鏡面反射方向R入射光線L平面法向量N觀察者與光線反射方向之夾角理論上,對(duì)相同的viewport(即觀察者所在位置)而言,物體上不同的頂點(diǎn),其反射向量R的方向都不相同但是,當(dāng)viewport位于無(wú)限遠(yuǎn)時(shí),則物體上所有頂點(diǎn)的反射向量R都可視為相同/ viewport在有限距離內(nèi),計(jì)算時(shí)間長(zhǎng),顏色較精準(zhǔn)glLightModelfi(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE
48、);/ viewport在無(wú)限遠(yuǎn),計(jì)算時(shí)間短,顏色較不精準(zhǔn)glLightModelfi(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_FALSE);范例(14/28)選擇光源模型(cont)雙面打光(Two-Sided Lighting)鏡射項(xiàng)(specular term)分開(kāi)計(jì)算(ambient+diffuse+specular+emission) 再套用texture mapping分開(kāi)計(jì)算: 產(chǎn)生兩組顏色(ambient+diffuse+emission) 套用texture mappingspecular term最后兩組顏色再相加/ 開(kāi)啟雙面打光glLightMode
49、lfi(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);/ 關(guān)閉雙面打光glLightModelfi(GL_LIGHT_MODEL_TWO_SIDE,GL_FALSE);glLightModelfi(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);/ 分開(kāi)計(jì)算glLightModelfi(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR);/ 合并范例(15/28)設(shè)定物體材質(zhì)定義物體的diffuse color與ambient color真實(shí)物體:diffuse co
50、lor與ambient color相同.GLfloat mat_amb_diff =0.1, 0.5, 0.8, 1.0;glMaterialfv(GL_FORNT_AND_BACK,GL_AMBIENT_AND_DIFFUSE, mat_amb_diff);.改變的參數(shù)代號(hào)meaningGL_AMBIENTambient colorGL_DIFFUSEdiffuse colorGL_AMBIENT_AND_DIFFUSEambient+diffuseGL_SPECULARspecular colorGL_SHININESSspecular指數(shù)項(xiàng)GL_EMISSION發(fā)光體GL_COLOR_I
51、NDEXES以索引方式存取顏色范例(16/28)設(shè)定物體材質(zhì)(cont)定義物體的specular color名詞解釋specular term=常數(shù)c*(物體specular color) * (光源specular強(qiáng)度)定義物體的明亮度:GL_SHININESS數(shù)值介于0.0, 128.0之間,數(shù)字越高物體越明亮.GLfloat mat_specular = 1.0, 1.0, 1.0, 1.0;GLfloat low_shininess = 5.0;glMaterialfv(GL_FORNT,GL_SPECULAR, mat_specular);glMaterialfv(GL_FORNT
52、,GL_SHININESS, low_shininess);.范例(17/28)設(shè)定物體材質(zhì)(cont)發(fā)光體:如場(chǎng)景中的臺(tái)燈.GLfloat mat_specular = 1.0, 1.0, 1.0, 1.0;GLfloat low_shininess = 5.0;GLfloat mat_emission = 0.3, 0.2, 0.2, 0.0;glMaterialfv(GL_FORNT,GL_SPECULAR, mat_specular);glMaterialfv(GL_FORNT,GL_SHININESS, low_shininess);glMaterialfv(GL_FORNT,GL
53、_EMISSION,mat_emission);.范例(18/28)/ * material.c (1/10) */#include #include void init(void)GLfloat ambient = 0.0, 0.0, 0.0, 1.0 ;GLfloat diffuse = 1.0, 1.0, 1.0, 1.0 ;GLfloat specular = 1.0, 1.0, 1.0, 1.0 ;GLfloat position = 0.0, 3.0, 2.0, 0.0 ;GLfloat lmodel_ambient = 0.4, 0.4, 0.4, 1.0 ;GLfloat lo
54、cal_view = 0.0 ;glClearColor(0.0, 0.1, 0.1, 0.0);glEnable(GL_DEPTH_TEST);glShadeModel(GL_SMOOTH);/ 逐點(diǎn)著色glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);glLightfv(GL_LIGHT0, GL_POSITION, position);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);glLightModelfv
55、(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);/ GL_FALSEglEnable(GL_LIGHTING);glEnable(GL_LIGHT0);/ 下頁(yè)繼續(xù)范例(19/28)/ * material.c (2/10) Draw twelve spheres in 3 rows with 4 columns.* The spheres in the first row have materials with no ambient reflection.* The second row has materials with significant amb
56、ient reflection.* The third row has materials with colored ambient reflection.* The first column has materials with blue, diffuse reflection only.* The second column has blue diffuse reflection, as well as specular reflection with a low shininess exponent.* The third column has blue diffuse reflecti
57、on, as well as specular reflection* with a high shininess exponent(a more concentrated highlight).* The fourth column has materials which also include an emissive component.* glTranslatef() is used to move spheres to their appropriate locations. */void display(void) GLfloat no_mat = 0.0, 0.0, 0.0, 1
58、.0 ;GLfloat mat_ambient = 0.7, 0.7, 0.7, 1.0 ;/ 漫射: 灰度GLfloat mat_ambient_color = 0.8, 0.8, 0.2, 1.0 ;/ 漫射 :coloredGLfloat mat_diffuse = 0.1, 0.5, 0.8, 1.0 ;GLfloat mat_specular = 1.0, 1.0, 1.0, 1.0 ;GLfloat no_shininess = 0.0 ; GLfloat low_shininess = 5.0 ;/ 第二列的明亮系數(shù)GLfloat high_shininess = 100.0 ;
59、/ 第三列的明亮系數(shù)GLfloat mat_emission = 0.3, 0.2, 0.2, 0.0;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ 下頁(yè)繼續(xù)范例(20/28)/ * material.c (3/10) display() - draw sphere in first row, first column* diffuse reflection only; no ambient or specular */glPushMatrix();glTranslatef (-3.75, 3.0, 0.0);glMaterialfv
60、(GL_FRONT, GL_AMBIENT, no_mat);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);/ 只有散射顏色glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);glutSolidSphere(1.0, 16, 16);glPopMatrix();/* draw sphere in first row, se
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年陜西寧陜縣文化旅游投資開(kāi)發(fā)有限責(zé)任公司招聘筆試參考題庫(kù)附帶答案詳解
- 2025年版?zhèn)€人房產(chǎn)出售交易資金監(jiān)管及風(fēng)險(xiǎn)控制合同
- 2025年全球及中國(guó)阻燃塑料膜行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球3D激光雷達(dá)掃描儀行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球低截止光纖行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)有機(jī)硅柔性皮膚粘合劑行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025版無(wú)證二手房交易合同糾紛調(diào)解及賠償協(xié)議3篇
- 委托接送子女上下學(xué)合同
- 教育政策解讀與匯報(bào)策略
- 二零二五年度廚師個(gè)人工作室聘用合同規(guī)范4篇
- 三年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)附答案
- 中醫(yī)診療方案腎病科
- 2025年安慶港華燃?xì)庀薰菊衅腹ぷ魅藛T14人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 人教版(2025新版)七年級(jí)下冊(cè)數(shù)學(xué)第七章 相交線與平行線 單元測(cè)試卷(含答案)
- 玩具有害物質(zhì)風(fēng)險(xiǎn)評(píng)估-洞察分析
- 2024年河南省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- GB/T 44351-2024退化林修復(fù)技術(shù)規(guī)程
- T-CHSA 020-2023 上頜骨缺損手術(shù)功能修復(fù)重建的專家共識(shí)
- Hypermesh lsdyna轉(zhuǎn)動(dòng)副連接課件完整版
- 小學(xué)六年級(jí)數(shù)學(xué)計(jì)算題100道(含答案)
評(píng)論
0/150
提交評(píng)論