计算机图形学CG.ppt
1,第11章 真实感图形的绘制,2,本章目标,掌握真实感图形绘制的主要内容光照、纹理、阴影等重点掌握光照方程、基本纹理映射及多边形绘制学会使用OpenGL的相关函数,3,第11章 真实感图形的绘制,简单光照模型多边形绘制方法纹理映射阴影,4,11.1 简单光照模型,光作用反射透射(透明物体)被物体吸收转化为热能假设物体不透明,即没有透射光光种类环境光、漫反射光和镜面反射光,只有反射光和透射光决定物体的颜色,5,11.1 简单光照模型,11.1.1 环境光(Ambient light)在物体和周围环境之间多次反射后,最终达到平衡时的一种光,又称为背景光光强(度):空间上分布均匀,即任何位置和方向光强度一样,亮度值记为Ia反射系数:与物体表面性质有关,决定物体表面呈现的亮度,记为Ka光照模型方程 Ie=Ka Ia Ie为物体表面呈现的亮度,Ka=0.4 Ka=0.8,6,11.1 简单光照模型,11.1.2 漫反射(Diffuse Reflection)点光源:向周围所有方向发射等强度的光漫反射光是由物体表面的粗糙不平引起的,它均匀地向各个方向传播,与视点无关漫反射光在空间均匀分布,反射光强 I 与入射光的入射角 的余弦成正比,即:其中,Kd 是漫反射系数(01之间的常数),与物体表面性质有关;Ip 是入射光(光源)的光强;是入射光的入射角,即入射光与物体表面法向量之间的夹角,7,11.1 简单光照模型,向量表示的计算设物体表面在照射点 P 处的单位法向量为N,P 到点光源的单位向量为L,则上式可表达为如下的向量形式:,如果有多个光源,则可以把各个光源的漫反射光照效果进行叠加:,8,11.1 简单光照模型,环境光与漫反射光结合方程:例子:,9,11.1 简单光照模型,11.1.3 镜面反射光和冯(Phong)反射模型高光(high light):光滑物体表面在点光源的照射下形成一块特别亮的区域镜面反射(Specular Reflection)物体表面对入射光的反射遵循反射定律(1)反射光与入射光位于表面法向两侧(2)理想反射面而言:入射角反射角观察者在反射方向上看到反射光最强,10,11.1 简单光照模型,Phong模型(非理想反射面),计算公式:,Ks是物体表面镜面反射系数,它与入射角和波长有关;是视线与反射方向的夹角;n 为镜面高光系数,用来模拟镜面反射光在空间中的汇聚程度,它是一个反映物体表面光泽度的常数;近似地描述了镜面反射光的空间分布。,11,11.1 简单光照模型,简化Phong模型,S,S,L,N,R都是单位向量,12,11.1 简单光照模型,镜面参数 n的影响效果,n=15 n=5 n=1,n 常规取值 5-20,13,11.1 简单光照模型,局部光照方程结合环境光、漫反射光及镜面反射光当光源与视点无穷远时,对表面上任意一点而言,L和V固定不变,H只需计算一次,14,11.1 简单光照模型,11.1.4 光的衰减光在传播过程中,能量会衰减传播过程光源到物体表面的传播,使入射光强度变弱物体表面到人眼的传播,使人接受到物体表面的反射光强度减弱光到物体表面的衰减考虑衰减的方程,15,11.1 简单光照模型,物体表面到人眼过程中的衰减深度暗示技术(Depth Cueing)使据视点远的点比近的点暗一些亮度计算前参考面 n=Nf;后参考面 n=Nb(规范化视见体内)分别赋比例因子Sf和Sb(Sf Sb)给点物体上的一点的深度N0,比例因子S0,16,11.1 简单光照模型,亮度计算光照方程计算出的I按比例S0与熔合亮度Idc混合若Sf=1,Sb=0,Idc=0时(1)当物体位于前参考面前,I=I(2)当物体位于后参考面后,I=0(3)N0在Nb和Nf间时,I=S0I,亮度部分衰减,17,11.1 简单光照模型,13.1.5 产生颜色前面的光照模型仅用于白光,只能产生灰度彩色模型计算选择合适模型(如RGB、HSV等)为颜色的三个分量分别建立光照方程RGB模型光源的颜色IpR,IpG,IpB,环境光的颜色IaR,IaG,IaB表面反射系数(1)环境反射:KaR,KaG,KaB(2)漫反射:KdR,KdG,KdB(3)镜面反射:KsR,KsG,KsB,18,11.1 简单光照模型,彩色光照方程(模型),19,11.1 简单光照模型,11.1.6 多个光源 如果场景中有m个光源,那么物体上任一点的亮度应该为m个光源的贡献之和 在RGB彩色模型中,分别为R、G和B。注意:I可能会超出系统允许的最大亮度值,处理方法(1)截去超出部分,设置为最大值(2)首先计算出所有亮度值,再进行变换(如缩放变换)使其落在系统规定范围之内,20,11.1 简单光照模型,11.1.7 OpneGL光照函数(1)OpenGL 光组成 在OpenGL简单光照模型中的几种光分为:环境光(Ambient Light)、漫射光(Diffuse Light)、镜面光(Specular Light)。(2)创建光源(Light Source)void glLightifv(GLenum light,GLenum pname,TYPE param)创建具有某种特性的光源。其中第一个参数light指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、.、GL_LIGHT7。第二个参数pname指定光源特性,这个参数的辅助信息见表11-1-7-1所示。最后一个参数设置相应的光源特性值。,21,11.1 简单光照模型,函数glLight*()参数pname及param说明,22,11.1 简单光照模型,(3)启动光照 在OpenGL中,必须明确指出光照是否有效或无效。如果光照无效,则只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源等复杂计算,那么显示的图形就没有真实感要使光照有效,首先得启动光照,即:glEnable(GL_LIGHTING);若使光照无效,则调用 gDisable(GL_LIGHTING)可关闭当前光照。然后,必须使所定义的每个光源有效。glEnable(GL_LIGHT0);其它光源类似,只是光源号不同而已,23,11.1 简单光照模型,(4)例:简单光照#include#include#pragma comment(lib,glaux.lib)void myinit(void)GLfloat light_position=1.0,1.0,1.0,0.1;GLfloat light_color=1.0,0.0,0.0,1.0;glLightfv(GL_LIGHT0,GL_POSITION,light_position);glLightfv(GL_LIGHT0,GL_AMBIENT,light_color);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_color);glLightfv(GL_LIGHT0,GL_SPECULAR,light_color);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_DEPTH_TEST);,void display(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);auxSolidSphere(1.0);/绘制球体 glFlush();,24,11.1 简单光照模型,void myReshape(int w,int h)glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w=h)glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);else glOrtho(-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,-10.0,10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();,25,11.1 简单光照模型,void main(void)glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(250,250);glutInitWindowPosition(300,300);glutCreateWindow(Simple Lighting);myinit();glutReshapeFunc(myReshape);glutDisplayFunc(display);glutMainLoop();,26,11.1 简单光照模型,(5)聚光 定位光源可以定义成聚光灯形式,即将光的形状限制在一个圆锥内。一、定义聚光源位置。因为聚光源也是定向光源,所以他的位置同一般定向光一样。如:GLfloat light_position=1.0,1.0,1.0,1.0;glLightfv(GL_LIGHT0,LIGHT_POSITION,light_position);,27,11.1 简单光照模型,二、定义聚光截止角 参数GL_SPOT_CUTOFF给定光锥的轴与中 心线的夹角,也可说成是光锥顶角的一半。缺省时,这个参数为180.0,即顶角为360度,光向所有的方向发射,因此聚光关闭。一般在聚光启动情况下,聚光截止角限制在0.0,90.0之间,如下面一行代码设置截止角为45度:glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,45.0);,28,11.1 简单光照模型,三、定义聚光方向 聚光方向决定光锥的轴,它齐次坐标定义,其缺省值为(0.0,0.0,-1.0),即指向Z负轴。聚光方向也要进行几何变换,其结果保存在视点坐标中。定义如下:GLfloat spot_direction=-1.0,-1.0,0.0,-1;glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spot_direction);四、定义聚光指数 参数GL_SPOT_EXPONENT控制光的集中程度,光锥中心的光强最大,越靠边的光强越小,缺省时为0。如:glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,2.0);,29,11.1 简单光照模型,(6)例:多光源,#include#include#pragma comment(lib,glaux.lib)/*初始化光源、材质等*/void myinit(void)GLfloat mat_ambient=0.2,0.2,0.2,1.0;GLfloat mat_diffuse=0.8,0.8,0.8,1.0;GLfloat mat_specular=1.0,1.0,1.0,1.0;GLfloat mat_shininess=50.0;GLfloat light0_diffuse=0.0,0.0,1.0,1.0;GLfloat light0_position=1.0,1.0,1.0,0.0;GLfloat light1_ambient=0.2,0.2,0.2,1.0;GLfloat light1_diffuse=1.0,0.0,0.0,1.0;GLfloat light1_specular=1.0,0.6,0.6,1.0;GLfloat light1_position=-3.0,-3.0,3.0,1.0;GLfloat spot_direction=1.0,1.0,-1.0;glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);/转下页,30,11.1 简单光照模型,/接上页 glLightfv(GL_LIGHT0,GL_DIFFUSE,light0_diffuse);glLightfv(GL_LIGHT0,GL_POSITION,light0_position);glLightfv(GL_LIGHT1,GL_AMBIENT,light1_ambient);glLightfv(GL_LIGHT1,GL_DIFFUSE,l ight1_diffuse);glLightfv(GL_LIGHT1,GL_SPECULAR,light1_specular);glLightfv(GL_LIGHT1,GL_POSITION,light1_position);glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,30.0);glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,spot_direction);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);glDepthFunc(GL_LESS);glEnable(GL_DEPTH_TEST);,31,11.1 简单光照模型,void display(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();glTranslated(-3.0,-3.0,3.0);/光源1位置 glDisable(GL_LIGHTING);glColor3f(1.0,0.0,0.0);auxWireCube(0.1);/绘制光源1 glEnable(GL_LIGHTING);glPopMatrix();auxSolidSphere(2.0);glFlush();,32,11.1 简单光照模型,void myReshape(GLsizei w,GLsizei h)glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w=h)glOrtho(-5.5,5.5,-5.5*(GLfloat)h/(GLfloat)w,5.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);else glOrtho(-5.5*(GLfloat)w/(GLfloat)h,5.5*(GLfloat)w/(GLfloat)h,-5.5,5.5,-10.0,10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();,void main(void)glutInitDisplayMode(GLUT_SINGLE GLUT_RGBA);glutInitWindowSize(250,250);glutInitWindowPosition(300,300);glutCreateWindow(Multi_lights);myinit();glutReshapeFunc(myReshape);glutDisplayFunc(display);glutMainLoop();,33,第11章 真实感图形的绘制,简单光照模型多边形绘制方法纹理映射阴影,34,11.2 多边形绘制方法,11.2.1 均匀着色(Flat Shading)方法任取多边形上一点,利用光照明方程计算出它的颜色用这个颜色填充整个多边形适合于如下情况光源在无穷远处,LN 相等视点在无穷远处,HN 相等多边形是物体表面的精确表示特点优点:每个多边形只需计算一次光照明方程,速度快缺点:相邻多边形颜色过渡不光滑,35,11.2 多边形绘制方法,11.2.2 光滑着色(Smooth Shading)采用插值方法Gouraud(高洛德)方法用多边形顶点的颜色进行插值生成中间点的颜色Phone(冯)方法对顶点的法向量进行插值计算出中间点的法向量,36,11.2 多边形绘制方法,11.2.3 Gouraud 着色方法(颜色插值方法)主要步骤1、计算多边形的单位法向量2、计算多边形顶点的单位法向量(共享顶点的多边形法向量的平均值)3、利用光照明方程计算顶点颜色4、对多边形顶点颜色进行双线性插值,获得多边形内部各点的颜色,37,11.2 多边形绘制方法,(1)计算多边形顶点的单位法向量 近似取顶点v的法向量为共享该顶点的多边形单位法向量的平均值,38,11.2 多边形绘制方法,(2)内部点颜色计算:双线性插值 已知P1(x1,y1)、P2(x2,y2)、P3(x3,y3),颜色分别为I1、I2和I3。A(xA,yA)和B(xB,yB)为交点,P(x,y)为AB上一点,计算P点的颜色,39,11.2 多边形绘制方法,增量法优化计算IA,IB,IP(1)扫描线 y 递增为 y+1,IA和IB的增量分别为IA和IB(2)当x递增一个单位(P点沿扫描线右移一个单位)时,IP的增量为IP,40,11.2 多边形绘制方法,11.2.3 Phong 着色方法(法向插值着色方法)方法:通过对多边形顶点法向量进行插值,获得多边形内 部各点的法向量,再利用光照方程计算各点的亮度主要步骤:1、计算多边形单位法向量2、计算多边形顶点单位法向量(以上两步同Gouraud着色方法)3、对多边形顶点法向量进行双线性插值,获得内部各点的法向量4、利用光照明方程计算多边形内部各点颜色,41,11.2 多边形绘制方法,法向量双线性插值,42,11.2 多边形绘制方法,法向量双线性插值计算优化(1)扫描线 y 递增为 y+1,NA和NB的增量分别为NA和NB(2)当x递增一个单位(P点沿扫描线右移一个单位)时,NP的增量为NP,43,第11章 真实感图形的绘制,简单光照模型多边形绘制方法纹理映射阴影,44,11.3 纹理映射,背景光照模型只能生成光滑的物体表面自然界中的物体表面具有丰富的细节,如木纹、桔子凹凸表面、沙砾路面丰富的表面细节难以用计算机图形方法生成采用将图片贴到物体表面上的方法绘制,樱桃木,桔子凹凸面,沙砾路面,45,11.3 纹理映射,纹理(Texture)纹理是物体表面的细小结构,它可以是光滑表面的花纹、图案,即颜色纹理(2D)纹理也可以是物体表面的三维结构纹理还可以是粗糙的表面(如桔子表面的皱纹),称为几何纹理,是基于物体表面的微观几何形状的表面纹理,46,11.3 纹理映射,纹理(续)纹理空间:纹理图案所在空间,记为st坐标系(一般是平面)纹素(texel):纹理最小单元,位置由纹理坐标(s,t)标识两种来源数字图像,用二维数组表示数学公式定义得纹理函数,47,11.3 纹理映射,纹理映射(Texture Mapping)将一块纹理图案映射到物体表面上,产生物体表面的细节颜色计算方法用表面上点对应的纹素值代替该点的漫反射系数纹理与物体表面的对应关系纹理坐标:s,t变化范围0,1,P,T,48,11.3 纹理映射,实例:圆柱面映射 圆柱面上的点对应的纹理坐标,s,t,y,x,z,r,h,49,11.3 纹理映射,实例:球面映射 和变化范围分别0,360和-90,90(1)(2)球面垂直向外映射到柱面上,再将柱面展开到矩形上,50,11.3 纹理映射,实例:圆环面映射R是环的主半径,r是次半径;和变化范围0,360,R,r,对应的纹理坐标,51,11.3 纹理映射,OpenGL函数纹理映射是一个相当复杂的过程,最基本的执行纹理映射所需的步骤。基本步骤如下:一、定义纹理;二、控制滤波;三、说明映射方式;四、激活纹理;五、绘制图形,即给出顶点的纹理坐标和几何坐标。注意:纹理映射只能在RGBA方式下执行,不能运用于颜色表方式。,52,11.3 纹理映射,一、定义纹理 二维纹理定义的函数:void glTexImage2D(GLenum target,GLint level,Glint components,GLsizei width,glsizei height,GLint border,GLenum format,GLenum type,const GLvoid*pixels);target是常数GL_TEXTURE_2D;level表示多级分辨率的纹理图像的级数,若只有一种分辨率,则level设为0;components是一个从1到4的整数,指出选择了R、G、B、A中的哪些分量用于调整和混合,1表示选择了R分量,2表示选择了R和A两个分量,3表示选择了R、G、B三个分量,4表示选择了R、G、B、A四个分量;,53,11.3 纹理映射,width和height给出了纹理图像的长度和宽度;border为纹理边界宽度,它通常为0,width和height必须是2m+2b,这里m是整数,长和宽可以有不同的值,b是border的值。纹理映射的最大尺寸依赖于OpenGL,但它至少必须是使用64x64(若带边界为66x66),若width和height设置为0,则纹理映射有效地关闭;参数format和type描述了纹理映射的格式和数据类型,参数format可以是GL_RGB、GL_RGBA、GL_RED、GL_GREEN、GL_BLUE、GL_ALPHA、GL_LUMINANCE或GL_LUMINANCE_ALPHA;参数type是GL_BYPE、GL_UNSIGNED_BYTE、GL_SHORT、GL_UNSIGNED_SHORT、GL_INT、GL_UNSIGNED_INT、GL_FLOAT或GL_BITMAP;参数pixels包含了纹理图像数据,这个数据描述了纹理图像本身和它的边界。,54,11.3 纹理映射,二、控制滤波;void glTexParameterifv(GLenum target,GLenum pname,TYPE param);参数target可以是GL_TEXTURE_1D或GL_TEXTURE_2DPname和param,55,11.3 纹理映射,三、设置纹理映射方式可以用纹理中的值来取代多边形(曲面)原来的颜色,或用纹理图像中的颜色与多边形(曲面)原来的颜色进行混合。void glTexEnvifv(GLenum target,GLenum pname,TYPE param);参数target必须是GL_TEXTURE_ENV;若参数pname是GL_TEXTURE_ENV_MODE,则参数param可以是GL_DECAL、GL_MODULATE或GL_BLEND,以说明纹理值怎样与原来表面颜色的处理方式;若参数pname是GL_TEXTURE_ENV_COLOR,则参数param是包含四个浮点数(分别是R、G、B、a分量)的数组,这些值只在采用GL_BLEND纹理函数时才有用。,56,11.3 纹理映射,四、激活纹理;glEnable(GL_TEXTURE_2D);五、定义纹理坐标在绘制纹理映射图形时,不仅要给每个顶点定义几何坐标,而且也要定义纹理坐标。void glTexCoord1234sifdv(TYPE coords);设置当前纹理坐标,此后调用glVertex*()所产生的顶点都赋予当前的纹理坐标。,57,11.3 纹理映射,例:简单纹理映射,#include#include#define nRows 128#define nCols 128GLubyte Image3*nRows*nCols;/生成黑白棋盘格图像数据void makeCheckerboard(void)long count=0;for(int i=0;i nRows;i+)for(int j=0;j nCols;j+)GLubyte c=(i/8)+(j/8)%2)*255;Imagecount+=c;Imagecount+=c;Imagecount+=c;,58,11.3 纹理映射,/纹理初始化void myinit(void)glClearColor(0.0,0.0,0.0,0.0);makeCheckerboard();glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);/GL_REPEAT glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);/GL_CLAMP glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,nRows,nCols,0,GL_RGB,GL_UNSIGNED_BYTE,Image);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);glEnable(GL_TEXTURE_2D);,59,11.3 纹理映射,/绘制图形void drawRect()/正方形glBegin(GL_POLYGON);glTexCoord2f(1,0);glVertex3f(-2,2,0);glTexCoord2f(1,1);glVertex3f(2,2,0);glTexCoord2f(0,1);glVertex3f(2,-2,0);glTexCoord2f(0,0);glVertex3f(-2,-2,0);glEnd();,60,11.3 纹理映射,#define nH 30#define nC 30void drawClinder(float r,float h)/绘制圆柱面 float dh=(float)h/nH;float dc=2*3.14/nC;float xnC+1,znC+1,y1,y2;float snC+1,t1,t2;for(int j=0;j=nC;j+)xj=r*sin(j*dc);zj=r*cos(j*dc);sj=j*dc/3.14/2;for(int i=0;i=nH;i+)if(i!=0)y1=y2;t1=t2;y2=i*dh-0.5*h;t2=(y1+0.5*h)/h;if(i=0)continue;for(j=0;jnC;j+)glBegin(GL_POLYGON);glTexCoord2f(sj,t1);glVertex3f(xj,y1,zj);glTexCoord2f(sj+1,t1);glVertex3f(xj+1,y1,zj+1);glTexCoord2f(sj+1,t2);glVertex3f(xj+1,y2,zj+1);glTexCoord2f(sj,t2);glVertex3f(xj,y2,zj);glEnd();,61,11.3 纹理映射,void drawTorus(float r,float R)/绘制圆环 float dh=6.28/nH;float dc=6.28/nC;float s;for(int i=0;inC;i+)for(int j=0;jnH;j+)glBegin(GL_POLYGON);s=i*dc/6.28;float sx=r*cos(j*dh);float sx1=r*cos(j*dh+dh);glTexCoord2f(s,j*dh/6.28);glVertex3f(R+sx)*sin(i*dc),r*sin(j*dh),(R+sx)*cos(i*dc);glTexCoord2f(s,(j+1)*dh/6.28);glVertex3f(R+sx1)*sin(i*dc),r*sin(j*dh+dh),(R+sx1)*cos(i*dc);s=(i+1)*dh/3.14/2;glTexCoord2f(s,(j*dh+dh)/6.28);glVertex3f(R+sx1)*sin(i+1)*dc),r*sin(j*dh+dh),(R+sx1)*cos(i+1)*dc);glTexCoord2f(s,(j*dh)/6.28);glVertex3f(R+sx)*sin(i+1)*dc),r*sin(j*dh),(R+sx)*cos(i+1)*dc);glEnd();,62,11.3 纹理映射,void display(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glClearDepth(1);glPushMatrix();glRotatef(60.0,1.0,0.0,0.0);/drawRect();drawClinder(2,4);/drawTorus(1,2);glPopMatrix();glFlush();,void myReshape(GLsizei w,GLsizei h)float a=3.5;glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w=h)glOrtho(-a,a,-a*(float)h/(float)w,a*(float)h/(float)w,-a,a);else glOrtho(-a*Lfloat)w/(float)h,a*(float)w/(float)h,-a,a,-a,a);glMatrixMode(GL_MODELVIEW);glLoadIdentity();,63,11.3 纹理映射,void main(void)glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(250,250);glutInitWindowPosition(300,300);glutCreateWindow(“TextureMapping);myinit();glutReshapeFunc(myReshape);glutDisplayFunc(display);glutMainLoop();,64,第11章 真实感图形的绘制,简单光照模型多边形绘制方法纹理映射阴影,65,11.4 阴影,阴影(Shadow)光源不能直接照射到的区域特点位于阴影区域中的物体表面被位于它和光源间的物体所遮挡对光源而言,不可见面即是位于阴影中的物体表面生成算法与消隐算法本质上一致,66,11.4 阴影,具有阴影效果的光照模型光源对位于阴影中的点的亮度(颜色)没有贡献模型(1)多光源(2)颜色分量,67,11.4 阴影,Z缓冲器阴影算法步骤(1)将图形变换到以光源为原点的 坐标系,利用Z缓冲器消隐算法 按光线方向对图形消隐,把距 光源最近的物体表面上点的深度值保存在Z缓冲器中(称为阴影缓冲器)(2)利用Z缓冲器消隐算法按视线方向对图形消隐,将得到的每个可见点变换到第 i 个光源的坐标系中,若它在光源坐标系中的深度值小于阴影缓冲器中相应单元的值,则该可见点位于阴影中(Si0),否则(Si 1),再用光照模型计算颜色特点:算法简单,计算量小,能处理复杂景物;缺点是每个光源需要1个Z缓冲器,需要的存储空间大,68,小结,光照模型环境光、漫反射光和镜面反射光光照模型方程多边形绘制颜色插值和法向插值纹理映射基本概念及一般曲面映射关系阴影基于Z缓冲消隐的实现算法,