计算机图形学明暗处理_第1页
计算机图形学明暗处理_第2页
计算机图形学明暗处理_第3页
计算机图形学明暗处理_第4页
计算机图形学明暗处理_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、大纲明暗处理介绍光源明暗处理OpenGL for shadingOpenGL for lighting范例Introduction of shading(1/2)Shading(明暗处理)真实感图形:必须考虑灯光与模型之间的关系灯光-材质相互关系(light-material interaction)目标:发展出灯光模型(lighting model)wireframeflat shadingphong shading明暗处理概念在计算机图形学当中,使用多边形来逼近光滑曲面,可以使用单一的颜色或者许多不同的颜色来渲染这些多边形,这称为明暗处理。在openGL中,用单一颜色处理的方式称为平面明暗

2、处理(Flat shading),而用许多不同颜色处理的方式称为光滑明暗处理(smooth shading),smooth shading也叫,Gourand Shading。在openGL中,我们可以调用函数 void glShadeModel(GLenum mode); Introduction of shading(2/2)Shading根据光源位置(light position,direction,color.)、材质属性(materials color,texture.)、表面的几何性质(normal.)计算出物体表面的色度以viewport上的图点为单位探讨主题:光源,光与材质的关

3、系,法向量对色度的影响xyz投影平面(projection plane)Viewport扫描线依序计算点的色度光与材质(1/2)眼睛之所以能看见物体,是因为物体自行发光物体反射光线模拟光线,物体,眼睛之间互动光线跟踪法(ray-tracing)辐射成像(radiosity)计算速度缓慢光与材质(2/2)光与物体的互动关系材质方面有三种属性镜射表面(specular surface):金属,镜子散射表面(diffuse surface):陶器半透明表面(translucent surface):毛玻璃Reflection(diffuse)inReflection(specular)transmi

4、ttedScattering & emissionabsorption光源(1/11)光源强度表示法三色理论以rgb三个成分强度(Ir,Ig,Ib)代表光源四种基本光源环境光源(ambient light)均匀散布于环境中的亮度,没有方向性,对所有物体的影响均相同例如,阴雨天看不见太阳,但仍有一定亮度点光源(point light)理想点光源:体积0,呈放射状用于产生强烈的对比效果聚光灯(spotlight)探照灯远距平行光源(distant light)太阳光光源(2/11)光源对物体颜色的影响,假设各光源的强度分别是:环境光源(ambient light):Ia点光源:Isp聚光灯:Iw平

5、行光: Ip则物体上某一点投射到眼睛(投影平面)的颜色将是F(Ia, Isp, Iw, Ip)问题是F()=?从光源与物体材质互动来找出F()即一简化模型反射模型:三种互动ambient light reflection, diffuse reflection, specular reflection环境光源反射,散射,镜射分别代表ambient color, diffuse color, specular color有时候也会加入深度效应(depth cue),及透明度光源(3/11)环境光源反射(ambient light reflection)通常假设有一环境光源强度为Ia打在表面上有部

6、份被吸收吸收比例:由ka(环境光源反射系数)决定环境光色反射系数(ambient reflection coefficient):与物体材质有关此系数可能是一向量NLR吸收光源(4/11)散射(diffuse reflection)物体表面粗糙导致光线反射没有一致的方向性(图6-14)散射平面,只能看到部份的光线NLR部份反射:入射角=反射角部份吸收(ambient color)理想表面真实对象表面(放大观察)光源(5/11)散射(diffuse reflection)(CONT)Lamberts law(考虑点光源):看到的部份光线量和L,N夹角的余旋函数(cos)成正比如果L,N的长度都是

7、1(即单位向量)再考虑散射系数(因为部份被吸收) 可得diffuse reflection termReflection(diffuse)inReflection(specular)transmittedScattering & emissionabsorptionNLRcos = L Ndiffuse reflection term :点光源光源(6/11)散射(diffuse reflection)(CONT)假设光线没有任何衰减考虑强度衰减:光线经过距离d之后,强度变弱的情形light-source attenuation光源强度x强度衰减比例(light-source attenuat

8、ion factor)光源强度衰减比例常数Ci使用者可自定,通常可设为光源(7/11)有颜色的平面与光源平面的颜色:diffuse color Od颜色的计算不含Od光源(8/11)深度效应(depth cueing)大气衰减效应(atmospheric attenuation )假设ambient term与diffuse term的和为则加上depth cueing之后的颜色为:depth-cue color通常是背景颜色光源(9/11)Specular Reflection(镜射)作用于反光平面金属,镜子,苹果表皮.Phong所提的近似模型观察者所看到光线强度取决于夹角不考虑物体颜色时,

9、镜射产生的强度镜射强光NLRv观察者v镜面反射方向R入射光线L平面法向量N观察者与光线反射方向之夹角n不同,代表不同材质镜射反射系数光源(10/11)夹角与n的关联:n越大,亮点越小,越亮,越集中如果R,V都是单位向量物体的specular color OsNLRv光源(11/11)眼睛看到的颜色:多重光源ambientdiffusespecular光线强度衰减系数大气层衰减效应背景色Shading(1/8)四种常见的shading方式之一flat shading (或称constant shading)只考虑ambient与diffuse reflection求得三角形(多边形)中某个点(例

10、如某顶点)的颜色强度之后,即以该颜色作为整个三角形(多边形)的颜色viewer不够真实图6.27Shading(2/8)四种常见的shading方式之二Interpolated shading(内插着色法)只考虑ambient与diffuse reflection以三个顶点颜色进行内插计算Shading(3/8)四种常见的shading方式之三最初内插着色法只用于单一三角形一般化之后,扩充至多边形,解决三角形接缝问题 即所谓的Gouraud Shading仍只考虑ambient与diffuse reflection法向量平均法 + 顶点颜色强度内差Shading(4/8)关于法向量(norma

11、l vector)平面法向量平面法向量 n如果知道平面方程式为则法向量 n为如果知道三个顶点坐标则法向量 n为外积P0P1P2法向量 nShading(5/8)关于法向量(normal vector)cont如果知道曲面方程为而法向量 n与切线垂直切线法向量 n法向量 n则切线为法向量 n法向量 n(2x,2y,2z)Shading(6/8)四种常见的shading方式之四Gouraud shading 颜色内插值Phong shading 法向量内插值考虑ambient与diffuse reflection + specular reflectionOpenGL for shading(1/

12、4)指定shading modelOpenGL支持两种shading modelGL_FLATFlat shading:以一个顶点的颜色做为整个多边形的颜色GL_SMOOTH(默认值)每一点的颜色各自独立计算以顶点颜色做内插(Gouraud shading)void glShadeModel(GLenum mode);mode可设为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();/下页继续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;/下页继续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环境中加入光源的步骤步骤1定义所有物体上每一个点的法向量可以调用

17、glNormal*设定顶点法向量步骤2建立光源调用glLight*建立光源的位置,方向,光度(包含ambient light, diffuse light & specular light),强度衰减系数(c1,c2,c3)用glEnable()将灯光开关打开步骤3选定lighting model是否加入global ambient light效应,是否处理正反两面,specular color 的计算与否.步骤4定义场景中物体的材质属性(material)设定物体的颜色(ambient,diffuse,specular color & shininess)OpenGL for lightin

18、g(2/11)OpenGL支持的法向量相关函数glNormal3* : 设定法向量后续调用glVertex3*设定的顶点,都会以该法向量做为顶点法向量glBegin(GL_POLYGON);glNormal3fv(n0);/ n0:三个元素的array,代表法向量(x,y,z)glVertex3fv(v0);/ v0:三个元素的array,代表顶点(x,y,z)glNormal3fv(n1);glVertex3fv(v1);glNormal3fv(n2);glVertex3fv(v2);glNormal3fv(n3);glVertex3fv(v3);glEnd(); glNormal3bsid

19、fv(const TYPE *v);/ v:三个元素的array glNormal3bsidf(TYPE nx, TYPE ny, TYPE nz);function prototypeOpenGL for lighting(3/11)法向量必须自行计算!在进行lighting calculation之前,法向量必须维持为单位法向量(长度为1)!解决之道:一开始就设成长度为1的单位法向量当物体完成scaling transformation之后,法向量长度会改变,必须调用glEnable(GL_NORMALIZE)重新改变法向量为单位法向量若scaling transformation是x,y

20、,z等比例缩放的话,则也可调用glEnable(GL_RESCALE_NORMAL)GL_RESCALE_NORMAL的计算比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);/下页继续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();/下页继续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)程序解析步骤一:设定Shading Model步骤二:设定光源void glShadeModel(GLenum mode);mode可设为GL_FLAT或GL_SMOOTH(逐点运算)glLightfv(GL_LIGHT0, GL_POSITION, light_position);light_position是一数组,定义如下:GLfloat light_position = 1.0, 1.

26、0, 1.0, 0.0 ;常数GL_LIGHT0是系统内定的光源名称常数(GL_LIGHT0, GL_LIGHT1, GL_LIGHT2.)OpenGL for lighting(8/11)程序解析关于光源函数 glLightifv(GLenum light, GLenum pname, TYPE *param);glLightif(GLenum light, GLenum pname, TYPE param);function prototype光源代号改变的参数代号设定的参数值光源代号: 从GL_LIGHT0 GL_LIGHT7改变的参数代号默认值meaningGL_AMBIENT(0.0

27、, 0.0, 0.0, 1.0)光的ambient强度GL_DIFFUSE(1.0, 1.0, 1.0, 1.0)或(0.0, 0.0, 0.0, 1.0)光的diffuse强度GL_SPECULAR(1.0, 1.0, 1.0, 1.0)或(0.0, 0.0, 0.0, 1.0)光的specular强度OpenGL for lighting(9/11)程序解析关于光源函数(cont)改变的参数代号默认值meaningGL_POSITION(0.0, 0.0, 0.0, 1.0)光源位置GL_CONSTANT_ATTENUATION1.0衰减系数GL_LINEAR_ATTENUATION0.0

28、衰减系数GL_QUADRATIC_ATTENUATION0.0衰减系数GL_SPOT_DIRECTION(0.0, 0.0, -1.0)光源方向GL_SPOT_EXPONENT0.0spotlight exponentGL_SPOT_CUTOFF180.0cutoff angleOpenGL for lighting(10/11)程序解析步骤三:设定light model glLightModelifv(GLenum pname, TYPE *param); glLightModelif(GLenum pname, TYPE param);设定光源模型。function prototype改变

29、的参数代号meaningGL_LIGHT_MODEL_AMBIENT环境中ambient强度GL_LIGHT_MODEL_LOCAL_VIEWER计算specular反射角的方式GL_LIGHT_MODEL_TWO_SIDE单面/双面打光GL_LIGHT_MODEL_COLOR_CONTROLspecular term是否单独计算改变的参数代号设定的参数值OpenGL for lighting(11/11)程序解析步骤四:设定物体材质 glMaterialifv(GLenum face, GLenum pname, TYPE *param); glMaterialif(GLenum face,

30、 GLenum pname, TYPE param);改变的参数代号meaningGL_AMBIENTambient colorGL_DIFFUSEdiffuse colorGL_AMBIENT_AND_DIFFUSEambient+diffuseGL_SPECULARspecular colorGL_SHININESSspecular指数项GL_EMISSION发光体GL_COLOR_INDEXES以索引方式存取颜色范例(1/28)定义光源的位置与颜色GLfloat light_ambient = 0.0, 0.0, 0.0, 1.0 ;/ 漫射强度GLfloat light_diffuse

31、 = 1.0, 1.0, 1.0, 1.0 ;/ 散射强度GLfloat light_specular = 1.0, 1.0, 1.0, 1.0 ;/镜射强度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*可供设定的参数代号glLight*可供设定的参数代号GL_AMBIENTGL_LINEAR_ATTENUATIONGL_DIFFUSEGL_QUADRATIC_ATTENUATIONGL_SPECULARGL_SPOT_DIRECTIONGL_POSITIONGL_SPOT_EXPONENTGL_CONSTANT_ATTENUATIONGL_SPOT_CUTOFF范例(2/28)定义光源的位置与颜色(CONT)光源强度衰减与距离平方成反比.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 ;/ 第一个光源glLightfv(GL_LIGHT0,GL_AMBIENT, light0_ambient);/ 第一个光源的漫射强度.GLfloat light1_ambient = 0.0, 0.0, 0.0, 1.0 ;/ 第二个光源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);/漫射强度glLightfv(GL_LIGHT1,GL_DIFFUSE, light1_diffuse);/ 散射强度glLightfv(GL_LIGHT1,GL_SPECULAR, light1_specular);/镜射强度glLightfv(GL_LIGHT1,GL_POSITION, light1_position);/位置g

36、lLightfv(GL_LIGHT1,GL_CONSTANT_ATTENUATION, 0.5);/ 强度衰减系数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);/ 开启第二个光源,程序最前面已经执行glEnable(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)单独移动光源(假设物体不动,但想改变光源的位置)static GLdouble spin=30.0;void init() ./* 内容与前相同 */. 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);/ 开启光源计算功能glEnable(GL_LIGHT0);/ 把灯光一GL_LIGHT0打开glEnable(GL_DEPTH_TES

41、T);/ 下页继续范例(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);/ 只旋转光源,及底下的cubeglLig

42、htfv (GL_LIGHT0, GL_POSITION, position);glTranslated (0.0, 0.0, 1.5);glDisable (GL_LIGHTING);/ 暂时不计算光源影响glColor3f (0.0, 1.0, 1.0);glutWireCube (0.1);/ 代表光源位置的cubeglEnable (GL_LIGHTING);/ 重新计算光源影响glPopMatrix ();/ 恢复gluLookAt()之后的状态glutSolidTorus (0.275, 0.85, 8, 15);glPopMatrix ();glFlush ();/ 下页继续范例

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:/ 鼠标左键if (state =GLUT_DOWN) / 按下spin = (spin + 30) % 360; glutPostRedisplay();/ 重画break;default: break;/ 下页继续范例(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)执行结果

46、范例(12/28)选择光源模型全局漫射光源(global ambient light)光源各自有自己的漫射强度,但global ambient light则是在光源之外,另外设定的场景漫射强度.GLfloat lmodel_ambient =0.2, 0.2, 0.2, 1.0;glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);.改变的参数代号meaningGL_LIGHT_MODEL_AMBIENT环境中ambient强度GL_LIGHT_MODEL_LOCAL_VIEWER计算specular反射角的方式GL_LIGHT_MODE

47、L_TWO_SIDE单面/双面打光GL_LIGHT_MODEL_COLOR_CONTROLspecular term是否单独计算范例(13/28)选择光源模型(cont)反射角的计算方式NLRv观察者v镜面反射方向R入射光线L平面法向量N观察者与光线反射方向之夹角理论上,对相同的viewport(即观察者所在位置)而言,物体上不同的顶点,其反射向量R的方向都不相同但是,当viewport位于无限远时,则物体上所有顶点的反射向量R都可视为相同/ viewport在有限距离内,计算时间长,颜色较精准glLightModelfi(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE

48、);/ viewport在无限远,计算时间短,颜色较不精准glLightModelfi(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_FALSE);范例(14/28)选择光源模型(cont)双面打光(Two-Sided Lighting)镜射项(specular term)分开计算(ambient+diffuse+specular+emission) 再套用texture mapping分开计算: 产生两组颜色(ambient+diffuse+emission) 套用texture mappingspecular term最后两组颜色再相加/ 开启双面打光glLightMode

49、lfi(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);/ 关闭双面打光glLightModelfi(GL_LIGHT_MODEL_TWO_SIDE,GL_FALSE);glLightModelfi(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);/ 分开计算glLightModelfi(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR);/ 合并范例(15/28)设定物体材质定义物体的diffuse color与ambient color真实物体: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);.改变的参数代号meaningGL_AMBIENTambient colorGL_DIFFUSEdiffuse colorGL_AMBIENT_AND_DIFFUSEambient+diffuseGL_SPECULARspecular colorGL_SHININESSspecular指数项GL_EMISSION发光体GL_COLOR_I

51、NDEXES以索引方式存取颜色范例(16/28)设定物体材质(cont)定义物体的specular color名词解释specular term=常数c*(物体specular color) * (光源specular强度)定义物体的明亮度:GL_SHININESS数值介于0.0, 128.0之间,数字越高物体越明亮.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)设定物体材质(cont)发光体:如场景中的台灯.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);/ 逐点着色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);/ 下页继续范例(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 ;/ 第二列的明亮系数GLfloat high_shininess = 100.0 ;

59、/ 第三列的明亮系数GLfloat mat_emission = 0.3, 0.2, 0.2, 0.0;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ 下页继续范例(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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论