




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机图形学第六章真实感图形的显示第1页,共103页,2023年,2月20日,星期四基本几何模型到真实感图形的绘制第2页,共103页,2023年,2月20日,星期四引言计算机图形学中真实感绘制包括两部分内容:物体的精确表示和场景中光照效果的逼真的物理描述。为可见物体的颜色和光照效果建立模型是一个非常复杂的过程,因为光照模型包含许多因素,如物体类型,物体相对于光源和其他物体的位置以及场景中所设置的光源属性等。一旦这些因素确定了,就可以通过光照模型来计算物体表面向空间给定方向辐射的光亮度。第3页,共103页,2023年,2月20日,星期四主要内容消隐光照模型纹理映射第4页,共103页,2023年,2月20日,星期四隐藏面和隐藏线的消除第5页,共103页,2023年,2月20日,星期四(b)(a)(c)如果不把隐藏的线或面消除,还可能发生对图的错误理解。为了使计算机生成的图能真实地反映这一情况,必须把隐藏的部分从图中消除。由于存在不透光的物体,因此阻挡了来自某些物体部分的光线到达观察者,这些物体部分成为隐藏部分,隐藏部分是不可见的。隐藏面和隐藏线的消除是计算机图形学中的一个基本问题。第6页,共103页,2023年,2月20日,星期四消隐的几个效果图
第7页,共103页,2023年,2月20日,星期四基于图像空间的方法隐藏面和隐藏线的消除有两种基本的算法用该表面上交点处的颜色填充该像素在和投影点到像素连线相交的表面中,找到离观察点最近的表面对于图像中的每一个像素:算法的简单描述如下:该算法多用于面消隐。以构成图像的每一个像素为处理单元,对场景中的所有表面,确定相对于观察点是可见的表面,用该表面的颜色填充该像素。第8页,共103页,2023年,2月20日,星期四基于物体空间的方法隐藏面和隐藏线的消除有两种基本的算法用可见表面的颜色填充相应的像素以构成图形;判定场景中的所有可见表面;对于三维场景中的每一个物体:算法的简单描述如下:该算法多用于线消隐,也用于面消隐。是以三维场景中的物体对象为处理单元,在所有对象之间进行比较,除去完全不可见的物体和物体上不可见的部分。第9页,共103页,2023年,2月20日,星期四假定:垂直投影下面讨论消隐算法时,都假定投影平面是oxy平面,投影方向为负z轴方向的垂直投影。隐藏线和隐藏面消除所讨论的对象是一个三维图形,消隐后要在二维空间中表示出来,因此消隐后显示的图形将和三维空间至二维空间的投影方式有关。第10页,共103页,2023年,2月20日,星期四6.1.1凸多面体的隐藏线消除多面体特点多个面每个面都有向外的法向量凸多面体特点法向量规则多面体不存在部分遮挡第11页,共103页,2023年,2月20日,星期四凸多面体是由若干个平面围成的物体。假设这些平面方程为
当某点P0(例如,物体的重心)位于物体“内部”时,有:平面法向量:(ai,bi,ci),必是指向物体外部,令pi(xi,yi,zi)为P0在平面i上的垂足,则有
aixi+biyi+cizi+di=0(ai,bi,ci)·(p0-pi)=(aix0+biy0+ciz0+di)-
(aixi+biyi+cizi+di)<0aix0+biy0+ciz0+di<0(i=1,2,…,n)第12页,共103页,2023年,2月20日,星期四视点与第i个面上一点连线方向为(li,mi,ni),即从视点指向一点,判断:
(ai,bi,ci)·(li,mi,ni)>0
平面i为自隐藏面。一般地,取视点在Z轴负无穷远点。这时,物体将被正投影到xy平面上。由于视线方向为(0,0,1),所以,ci>0所对应的面,为自隐藏面。任意两个自隐藏面的交线,为自隐藏线。第13页,共103页,2023年,2月20日,星期四6.1.3凹多面体的隐藏线消除特点全部被遮挡没有被遮挡部分被遮挡第14页,共103页,2023年,2月20日,星期四对于一条空间线段P1P2和一个多边形p,判断线段有没有被多边形遮挡。如果被遮挡,求出隐藏部分。第15页,共103页,2023年,2月20日,星期四没有交点
被完全遮挡
没被遮挡有交点
部分被遮挡
第16页,共103页,2023年,2月20日,星期四将投影的线段分成若干子线段将子线段与所有多边形进行求交求并集第17页,共103页,2023年,2月20日,星期四6.2面消隐第18页,共103页,2023年,2月20日,星期四6.2.1区域排序(画家算法)在图象空间中,将待显示的所有多边形按深度值从小到大排序,用前面可见多边形去切割后面的多边形,最终使得每个多边形要么是完全可见,要么是完全不可见
第19页,共103页,2023年,2月20日,星期四多边形裁剪双边裁剪——遇到交点向右拐第20页,共103页,2023年,2月20日,星期四1)进行初步深度排序,可按各多边形z最小值(或最大值、平均值)排序;2)选择当前深度最小(离视点最近)的多边形为裁剪多边形;3)用裁剪多边形对那些深度值更大的多边形进行裁剪4)比较裁剪多边形与各内部多边形的深度,检查裁剪多边形是否是离视点最近的多边形。若裁剪多边形深度大于某个内部多边形的深度,则恢复被裁剪的各多边形,选择新的裁剪多边形,回到3),否则做5);5)择选下一个深度最小的多边形作为裁剪多边形,从3)开始做,直到所有的多边形都处理过为止。在得到的多边形中,所有的内部多边形是不可见的,其余多边形均为可见多边形。第21页,共103页,2023年,2月20日,星期四6.2.2深度缓存算法Z-Buffer深度缓存数组ZB颜色属性数组CB本质:保留离视点近的不排序z缓冲器算法是最简单的消除隐藏面算法之一z缓冲器是一组存贮单元其单元个数和屏幕上象素的个数相同也和帧缓冲器的单元个数相同,它们之间一一对应。
屏幕帧缓存Z缓冲器
第22页,共103页,2023年,2月20日,星期四1)初始化ZB和CB,使得ZB(i,j)=Zmax,CB(i,j)=背景色,i=1,…,m;j=1,…,n;2)对多边形P,计算它在点(i,j)处的深度值zi,j,3)若zi,j<ZB(i,j),则ZB(i,j)=zi,j,CB(i,j)=多边形P的颜色;4)对每个多边形重复(2)、(3)两步,最终在CB中存放的就是消隐后的图形。第23页,共103页,2023年,2月20日,星期四如何求深度设某个多边形所在的平面方程为
ax+by+cz+d=0若c≠0,则z=(-ax-by-d)/c在点(xi,yi)处,有:
zi=(-d-axi-byi)/c而在点(xi+1,yi)处,有:
zi+1=(-d-a(xi+1)-byi)/c因为xi+1=xi+1,所以zi+1=zi-a/c(水平方向的相关性)
第24页,共103页,2023年,2月20日,星期四类似地可推出平面多边形内的点在垂直方向上的相互关系。设多边形一条边的方程为ax+by+c=0。XOY平面上:在y=yi点,xi=(-c-byi)/a;在yi+1点,因yi+1=yi+1。所以xi+1=xi-b/a(垂直方向的相关性)第25页,共103页,2023年,2月20日,星期四求深度算法1将多边形的边按其y最小值排序,搜索多边形中各顶点的y值,找出其中最小的值ymin和最大值ymax;2令扫描线y=ymin到ymax以增量为1变化。此时,(a)找出与当前扫描线相交的所有边,利用垂直相关性求出这些边与扫描线的交点,并将这些交点从小到大排序;(b)在相邻两交点之间选一点,判断其是否被多边形包含,如果被多边形包含,则利用多边形上点的水平相关性,求出两交点之间各点的深度值;重复(b),直到当前扫描线上所有在多边形内的点的深度都求出为止。第26页,共103页,2023年,2月20日,星期四优势不排序,只比较,效率高,便于硬件实现缺点两个缓存,太大第27页,共103页,2023年,2月20日,星期四6.2.3扫描线算法改进的Z-Buffer1)对每个多边形求取其顶点中所含的y的最小值ymin和最大值ymax,按ymin进行排序,建立活性多边形表,活性多边形表中包含与当前扫描线相交的多边形。2.)从上到下依次对每一条扫描线进行消隐处理,对每条扫描线上的点置初值,Z值Z(x)取为最大,颜色I(x)取为背景色。第28页,共103页,2023年,2月20日,星期四3)对每条扫描线y,按活化多边形表找出所有与当前扫描线相交的多边形。对每个活性多边形,求出扫描线在此多边形内的部分,对这些部分中每个象素x计算多边形在此处的Z值,若Z小于Z(x),则置Z(x)为Z,I(x)为多边形在此处的颜色值。4)当扫描线对活化多边形表中的所有多边形都处理完毕后,所得的I(x)即为显示的颜色,可进行显示并换下一条扫描线进行处理,即扫描线的y=y+1。此时应更新活性多边形表,将已完全处于扫描线上方的多边形,即ymax<y的多边形移出活性多边形表,将不在当前活性多边形表中的与新一条扫描线相交的多边形,即ymin=y的多边形加入活性多边形表。第29页,共103页,2023年,2月20日,星期四6.2.4区间扫描算法由于扫描线z缓冲器算法的运算量较大,下面的区间扫描线算法考虑了各个边的拓扑结构关系,运算量就少许多。第30页,共103页,2023年,2月20日,星期四每条扫描线被多边形边界在xoy平面上的投影分割成为一些小区间,从结构上看,这些区间上的象素的显示或隐藏性质应当一样的。因此,只须分析清楚每个区间上的显示与否的属性便可。于是,只要在区间上任意一点处,找出在该处z值最小的面。这个区间上的每个象素就用这个面颜色来显示。克服了扫描线z缓冲器算法在每个象素处计算多边形z值而工作量大的困难,这种区间上计算z值的做法叫区间扫描线算法。第31页,共103页,2023年,2月20日,星期四如下图所示,扫描线l与A、B、C三个投影多边形的边相交形成9个小区间。下面如何确定这些小区间的颜色呢?第32页,共103页,2023年,2月20日,星期四按下列情况进行讨论:小区间上没有任何多边形,如[d,e]段和扫描线l两头此时用背景色显示该小区间。当小区间只有一个多边形,如[a,b],[e,d]等,这时用此多边形的颜色便可显示该小区间。当小区间存在两个或两个以上的多边形,如图中的[f,g],必须通过深度测试判断哪个多边形是可见的,再显示此多边形的颜色。第33页,共103页,2023年,2月20日,星期四如果允许物体表面相互贯穿,那么还必须求出它们在xoz扫描平面上的交点,再进一步细分这些小区间。更进一步作深度判断哪个多边形是可见的。第34页,共103页,2023年,2月20日,星期四6.2.5Warnock算法这是一种分而治的算法,既适合于消去隐藏线又适合于隐藏面,其基本思想如下:首先观察整个窗口区域,如果窗口中只需显示一个多边形面,则可以直接显示出来,此时称窗口为单纯的,否则为非单纯的。例如:窗口内没有可见物体,则直接显示背景或窗口内只有一个多边形面颜色,则就是单纯的。若窗口内有两个多边形或非单纯的时候,则将窗口分为四部分,进一步判断它们是否单纯。不单纯时再细分,直到窗口单纯或窗口不能再分为止。如图5.13所示第35页,共103页,2023年,2月20日,星期四6.2.5Warnock算法第36页,共103页,2023年,2月20日,星期四6.2.5Warnock算法这过程可以用一棵四叉树来描述,有很好的效率。即使1024*1024的视图窗口,被细分十次后也成为一个象素面而不能再分。当然,算法中关键在窗口是否单纯的判断,这就要分析窗口与物体的所有投影后的多边形面之间的关系,如图5.14所示,多边形面与窗口的关系有4种类型:第37页,共103页,2023年,2月20日,星期四6.2.5Warnock算法(a)分离,是指多边形在窗口之外。(b)内含,是指多边形在窗口之内。(c)相交,是指多边形与窗口部分相交。(d)包围,是指多边形把窗口全部包含。第38页,共103页,2023年,2月20日,星期四6.2.5Warnock算法根据这四种情况,Warnock算法描述如下:步骤一:对每个窗口进行判断,若所有多边形没在某个窗口,则该窗口设为背景色。步骤二:若窗口内含一个多边形,则窗口中多边形部分着此多边形色,其余部分着背景色。步骤三:若窗口与一个多边形相交,同步骤二一样。步骤四:若窗口被一多边形包围,则全部着多边形颜色。步骤五:若窗口被若干多边形包围,并且所有多边形不交叉,则把距离视点近的多边形颜色给窗口着色。步骤六:若以上条件都不满足,那么继续细分窗口,并重复上述步骤。以上几个步骤中,步骤五是关键,要找出包围窗口的多边形中距离视点最近的一个多边形,需要作深度检测,具体实现时,可将面片根据它们距离视点的最小距离先进行深度排序,然后,再取最小深度的多边形的颜色作为窗口颜色。第39页,共103页,2023年,2月20日,星期四6.4光照模型
描绘一个三维物体更加逼真的方法是显示它的色彩、以及色彩在光照环境下的明暗变化。这种明暗描绘方法称为Shading。光照模型
物体表面颜色
与光源特性和物体表面特性(材质和颜色)第40页,共103页,2023年,2月20日,星期四第41页,共103页,2023年,2月20日,星期四第42页,共103页,2023年,2月20日,星期四6.4.1颜色模型和颜色应用1、光和颜色物体的颜色不仅取决于物体本身,还与光源,周围环境的颜色有关。如,红光照在物体上,使其带有红色成份,红色物体使其附近物体泛红等,不仅如此,物体颜色还与人们感觉心里系统有关。例如有些人看红色的物体时并不产生红色的感觉,这就我们常讲的色盲。第43页,共103页,2023年,2月20日,星期四6.4.1颜色模型和颜色应用2、CIE色度图对自然界的一种颜色c可以表示为:等号表示两边代表的光看起来完全相同,“+”号表示光的叠加,r、g、b为颜色配对中所需要的RGB三原色光的相对比例量,R、G、B为红、绿、蓝三原色光。第44页,共103页,2023年,2月20日,星期四6.4.1颜色模型和颜色应用1931年国际照明委员会CIE给出了任意可见光所需的三原色光的比例曲线,如下图所示。注意到图中对于500μm的光要用R、G、B线性组合表示时,r值应当为负,否则无法表示。这带来一个问题,即对于500μm的光如何用R、G、B实现。因为我们并不存在一种负的光强,即负的rR是不能实现的。因而有一些颜色不能通过将三原色混合起来得到并在CRT上显示。第45页,共103页,2023年,2月20日,星期四6.4.1颜色模型和颜色应用于是,CIE在1931规定了三种假想的标准原色,x、y、z以便能得到的颜色匹配的比例量全为正。注意:除了用红、绿、蓝三色混合成一般颜色外,还可以用补色青、品红、黄来构成三原色,即只要满足下列二条件的三种颜色均可作为原色:1、任何一种颜色可以用三种颜色混合而成;2、三种颜色中任意一种颜色不能由其余两种颜色混合而成。第46页,共103页,2023年,2月20日,星期四6.4.1颜色模型和颜色应用CIE用XYZ形成一个CIE—XYZ系统,该系统的光颜色匹配函数定义为如下的一个式子:第47页,共103页,2023年,2月20日,星期四6.4.1颜色模型和颜色应用对于同一颜色C的CIE_RGB的值(R,G,B)与CIE_XYZ的值可以通过以下形式相互转换:第48页,共103页,2023年,2月20日,星期四光的种类点光源直射光源分布式光源直射光源漫射光源第49页,共103页,2023年,2月20日,星期四第50页,共103页,2023年,2月20日,星期四物体表面材质材质的颜色是由它所反射的光的波长决定如果光线被投射至一个不透明的物体表面,则部分光线被反射,部分被吸收物体表面的材质类型决定了反射光的强弱表面光滑较亮的材质将反射较多的入射光,而较暗的表面则吸收较多的入射光。同样对于一个半透明物体的表面,部分入射光会被反射,而另一部分则被折射。第51页,共103页,2023年,2月20日,星期四物体表面特性反射系数漫反射(DiffuseReflection)系数镜面反射(SpecularReflection)系数物体表面:光源颜色和漫反射系数第52页,共103页,2023年,2月20日,星期四透射系数透射光线的能力表面方向外法向量第53页,共103页,2023年,2月20日,星期四6.4光照模型及其实现物体表面的色彩明暗与光源特性和物体表面特性密切相关。在现实世界中,光照射到物体上,光线可能被吸收、反射、和透射。被物体吸收的部分转化为其它的能量。反射和透射的光则进入我们的视觉系统,我们便看见物体。为此,我们需要了解已知物理形态和光源性质的条件下,计算物体的光照效果的数学模型——光照模型第54页,共103页,2023年,2月20日,星期四简单光照明模型假设物体不透明那么物体表面呈现的颜色仅由其反射光决定。反射光组成环境反射环境反射假定入射光均匀地从周围环境入射至景物表面并等量地向各个方向反射出去漫反射与镜面反射漫反射分量和镜面反射分量则表示特定光源照射在景物表面上产生的反射光。主要研究:漫射光线和透射光线第55页,共103页,2023年,2月20日,星期四光源称为发光体反射表面(如房屋的墙壁)则称为反射光源图:通常在一个不透明且不发光的物体表面所观察到的光线是其反射光,它由光源与其他物体表面的反射光所共同产生光源反射面第56页,共103页,2023年,2月20日,星期四在物体不透明的情况下,物体表面的颜色仅由其反射光决定。反射光有三种类型的分量组成:环境反射、漫反射和镜面反射。环境反射是入射光均匀地从周围环境入射到物体表面后等量地向各个方向反射的光。例如:透射厚厚云层的阳光,室内各物体之间光的多次反射结果也可以视作环境反射光。漫反射分量表示特定光源在景物表面的反射光中那些向空间各方向均匀反射出去的光,而镜面反射光为朝一定方向的反射光。这几种反射光是我们看见物体的关键。下面详细讨论这几种光的计算第57页,共103页,2023年,2月20日,星期四1、环境光不同的物体对环境光有不同的反射属性,记为Ka,若用Ia表示环境光的强度,于是物体某点的反射光强度为:注意到我们所接受的是Iambien的强度,也就是在图上要用Iambien表示物体上的点,Ka与物体有关,根据物体而定,Ia由环境光定,其越强自然使Iambien越强,符合我们的习惯。第58页,共103页,2023年,2月20日,星期四2、漫反射漫反射是物体并不光滑形成的,这种不光滑的物体叫漫反射体。如图5.22所示,其特点是反射光是由于表面从各个方向等强度地反射而成,因而从各个视角出发,物体表面呈现相同的亮度,所看到的物体表面某点明暗程度不随观测者的位置变化而变化。漫反射光的强度或某点的明暗程度服从Lambert漫反射模型第59页,共103页,2023年,2月20日,星期四2、漫反射其中Idiffuse是物体表面某点的漫反射光强,Id为点光源的光强度。Kd(0<K<1)表示物体表面该点对漫反射光的反射属性,Θ是入射光线与物体表面在该点出法线的夹角。第60页,共103页,2023年,2月20日,星期四2、漫反射这里具体计算是要注意的,令L是该点到光源的单位向量,
N为单位法向量,则:第61页,共103页,2023年,2月20日,星期四3.镜面反射光镜面反射光为朝一定方向的反射光。根据光的反射定律,反射光和入射光对称地分布于表面法向的两侧。对纯镜面,入射至表面面元上的光严格地遵循光的反射定律单向反射出去,反射角与入射角相等。
反射光入射光纯镜面
(a)第62页,共103页,2023年,2月20日,星期四一般光滑表面:表面实际上是有许多朝向不同的微小平面组成其镜面反射光分布于表面镜面反射方向的周围常采用余弦函数的幂次来模拟一般光滑表面的镜面反射光的空间分布一般光滑平面
(b)Nn大n小图8.4
镜面反射反射光入射光纯镜面
(a)N反射光入射光第63页,共103页,2023年,2月20日,星期四采用余弦函数的幂次来模拟一般光滑表面的镜面反射光的空间分布。Is为观察者接受到的镜面反射光亮度Ips为入射光的光亮度,θ为镜面反射方向和视线方向的夹角,介于0o到90o之间n为镜面反射光的会聚指数(与物体表面光滑度有关)ks为镜面反射系数(与材料性质和入射光波长有关)。
图8.4
镜面反射纯镜面
(a)一般光滑平面
(b)N反射光入射光N反射光入射光n大n小第64页,共103页,2023年,2月20日,星期四投向观察者的镜面反射光不仅决定于入射光,而且和观察者的观察方向有关。当视点取在镜面反射方向附近时,观察者接受到的镜面反射光较强,而偏离这一方向观察时,镜面反射光就会减弱甚至消失。视点相关性第65页,共103页,2023年,2月20日,星期四4、phong模型一个物体在一个场景中,若没有光的照射,我们肯定是看不见的,只有在某种光照下,反射光才能进入我们视觉系统,而光照下物体的反射光有三种类型,也就是说,进入我们视觉系统的反射光有三种类型。因此,物体某点上的反射光的强度应当是三种反射光的迭加。即第66页,共103页,2023年,2月20日,星期四当光源有多个时,则上式可写为:
ka
环境反射系数kd漫反射系数ks镜面反射系数∑表示对所有特定光源求和
Phong模型法向量的改变对光亮度计算影响大点的位置的改变对光亮度计算影响较小图Phong模型计算中涉及的各方向向量PVRNLiθ第67页,共103页,2023年,2月20日,星期四为避免光谱计算,直接用光栅图形显示器的RGB三基色颜色系统。即写成第68页,共103页,2023年,2月20日,星期四1)假设光源为理想点光源,且不考虑其辐射光强的空间分布。2)除了曲面的法向量外,曲面的所有几何信息均不予考虑。3)表面漫反射光亮度和镜面反射光亮度均被认为是对光源入射光的直接反射,且相互独立。Phong模型具有以下明显的特点第69页,共103页,2023年,2月20日,星期四4)表面镜面反射光亮度由一个经验模型来模拟,但当该光亮度达到显示器所能显示的最高色度时,其变化将被裁剪掉。5)用镜面高光指数n来模拟景物表面的光滑程度。镜面高光指数n的变化可使光源看上去变大或变小。6)镜面反射光的颜色被假定成光源的颜色,而与表面材质属性无关。7)周围环境对景物表面的影响,即环境光,被假设为一常数。Phong模型具有以下明显的特点第70页,共103页,2023年,2月20日,星期四Phong模型存在的问题
Phong光照明模型是真实感图形学中提出的第一个有影响的光照明模型,生成图象的真实度已经达到可以接受的程度;
是一个经验模型,还具有以下的一些问题:1)用Phong模型显示出的物体象塑料,没有质感
2)环境光是常量,没有考虑物体之间相互的反射光
3)镜面反射的颜色是光源的颜色,与物体材料无关4)镜面反射的计算在入射角很大时会产生失真
第71页,共103页,2023年,2月20日,星期四6.5OpenGL的光照处理从上面可见,要显示一张简单的曲面所涉及的内容和计算是相当复杂的,若再添加各种场景或增加几个光源,情况更加麻烦。现在OpenGL把相当复杂的工作已集成在相应地函数中,只须对参数的处理便可得到需要的光照模型,方便了我们的使用,下面就介绍如何使用OpenGL进行光照处理。第72页,共103页,2023年,2月20日,星期四6.5.1光源的定义光源有许多特性,如颜色、位置、方向等。不同特性的光源,作用在物体上的效果是不一样的。定义一个光源的主要工作就是定义它的各种特性,OpenGL通过光源特性的函数glLight*()来定义光源。VoidglLight{if}v(GLenumlight,GLenumpname,TYPE*param);其中light指定光源编号,在一个场景最多定义八个不同的光源,编号为GL-LIGHT0,GL-LIGHT1,…,GL-LIGHT7,参数pname指定光源特性的名称,即是什么种类的光。如下表取值,参数param为指向param所指属性值的指针,它可以指向一个数值,也可以指向一个值,具体有所定义的属性而定第73页,共103页,2023年,2月20日,星期四6.5.1光源的定义
表6.1pname参数的取值及意义GL_AMBIENT(0.0,.0.0,0.0,1.0)环境光的RGBA强度值GL_DIFFUSE(1.0,1.0,1.0,1.0)漫反射光的RGBA强度值GL_SPECULAR(1.0,1.0,1.0,1.0)镜面反射光RGBA强度值GL_POSITION(0.0,0.0,1.0,0.0)光源坐标(x,y,z,w)GL_SPOT_DIRECTION(0.0,0.0,-1.0)聚光灯投影方向(x,y,z)GL_SPOT_EXPONENT0.0聚光灯指数GL_SPOT_CUTOFF180.0聚光灯截止角度GL_CONSTANT_ATTENUATION1.0定长衰减因子GL_LINER_ATTENUATION0.0线性衰减因子GL_QUADRATIC_ATTENUATION0.0二次衰减因子第74页,共103页,2023年,2月20日,星期四聚光设置:一般情况下,光源光线是向四周发射,可以使用GL_DOT_CUTDFF来限制光线的范围,缺省是180.0。当然,除了指定光发散角度外,还需指定聚光状态下的方向,例如:glLlightf(GL_LIGHT0,GLSPOT_CUTOFF,45.0);//45角范围GLfloatspot_direction[]={-1.0,-1.0,0.0};glLightfv(GL_LIGHTO,GL_SPOT_DIRECTION,spot_direction)第75页,共103页,2023年,2月20日,星期四#include<GL/gl.h>
#include<GL/glu.h>
#include<GL/glaux.h>
voidmyinit(void);
voidCALLBACKmyReshape(GLsizeiw,GLsizeih);
voidCALLBACKdisplay(void);
voidmyinit(void)
{
GLfloatlight_position[]={1.0,1.0,1.0,0.0};
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
}
第76页,共103页,2023年,2月20日,星期四voidCALLBACKdisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
auxSolidSphere(1.0);
glFlush();
}
voidCALLBACKmyReshape(GLsizeiw,GLsizeih)
{
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();
}
第77页,共103页,2023年,2月20日,星期四voidmain(void)
{
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow("SimpleLighting");
myinit();
auxReshapeFunc(myReshape);
auxMainLoop(display);
}
第78页,共103页,2023年,2月20日,星期四6.5.2材质的定义OpenGL用材质来描述物体表面特性,通过制定物体表面对光的反射率来确定物体的颜色,设置材质属性的函数是:VoidglMaterial{if}(GLenumface,GLenumpname,TYPEparam);其中参数face是GL_FRONT,GL_BACK或GL_FRONT_AND_BACK指定当前材质作用物体的哪一面.第79页,共103页,2023年,2月20日,星期四6.5.2材质的定义参数pname设置材质的属性,由表5.3所示表5.3pname的取值及意义属性名称默认值意义GL_AMBIENT(0.2,0.2,0.2,1.0)对环境光的反射率GL_DIFFUSE(0.8,0.8,0.8,1.0)对漫反射的反射率GL_AMBIENT_AND_DIFFUSE对环境和漫反射的反射率GL_SPECULAR(0.0,.0,0.0,1.0)反射颜色GL_SHININESS0.0反射指数GL_EMISSION(0.0,0.0,0.0,1.0)辐射光色GL_COLOR_INDEX(0,1,1)环境散射和反射索引第80页,共103页,2023年,2月20日,星期四6.5.2材质的定义例如,将当前材质的散射和环境反射率设置为(0.1,0.5,0.8,1.0)GLfloatmat_amb_diff[]={0.1,0.5,0.8,1.0}glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff第81页,共103页,2023年,2月20日,星期四
光照明模型
光照效果第82页,共103页,2023年,2月20日,星期四
光照明模型
一个光照的球体第83页,共103页,2023年,2月20日,星期四光照产生的场景第84页,共103页,2023年,2月20日,星期四diffuseonlyq=1q=128q=64q=32q=16q=8q=4q=2第85页,共103页,2023年,2月20日,星期四第86页,共103页,2023年,2月20日,星期四#include<windows.h>#include<math.h>#include<GL/gl.h>#include<GL/glu.h>#include<GL/glaux.h>
GLfloatposition0[]={0.0f,1.5f,1.0f,1.0f};GLfloatposition1[]={0.0f,1.5f,0.0f,1.0f};GLfloatposition2[]={0.0f,2.0f,2.0f,1.0f};GLfloatposition3[]={0.0f,0.0f,2.0f,1.0f};
GLfloatmat_cylinder[]={0.0f,0.5f,0.75f,0.15f};GLfloatmat_sphere[]={1.0f,1.0f,1.0f,1.0f};GLfloatmat_box[]={0.0f,0.75f,0.0f,0.1f};GLfloatmat_emission[]={0.1f,0.1f,0.1f,0.0f};
第87页,共103页,2023年,2月20日,星期四voidCALLBACKdisplay(){ glPushMatrix(); glTranslatef(0.0,0.0,-5.0);
glLightfv(GL_LIGHT0,GL_POSITION,position3); //创建0号光源
glLightfv(GL_LIGHT1,GL_POSITION,position1); //创建1号光源
glPushMatrix(); glMaterialfv(GL_FRONT,GL_EMISSION,mat_sphere); //设置材质特性-EMISSION glTranslatef(position1[0],position1[1],position1[2]); auxSolidSphere(0.1);
glPopMatrix();
glPushMatrix(); glTranslatef(0.0,0.0,0.5);第88页,共103页,2023年,2月20日,星期四glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission); //设置材质特性-EMISSION glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_cylinder); //设置材质特性-DIFFUSE auxSolidCylinder(0.2,2.0); glPopMatrix();
glPushMatrix(); glTranslatef(0.0,-1.0,0.0); glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission); glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_box); auxSolidBox(2.2,0.1,3.0); glPopMatrix(); glPopMatrix();glFinish();}第89页,共103页,2023年,2月20日,星期四GLfloatlight0_diffuse[]={0.3f,0.3f,0.3f,1.0f};GLfloatlight1_diffuse[]={1.0f,1.0f,1.0f,1.0f};
voidCALLBACKmyReshape(intw,inth){
GLfloatmat_ambient[]={0.8f,0.8f,0.0f,0.15f};
GLfloatmat_specular[]={1.0f,1.0f,1.0f,0.15f};
GLfloatmat_shininess[]={64.0};
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
第90页,共103页,2023年,2月20日,星期四glEnable(GL_LIGHTING);//激活光照
glEnable(GL_LIGHT0); //激活0号光源
glLightfv(GL_LIGHT0,GL_DIFFUSE,light0_diffuse); //设置0号灯光属性
glEnable(GL_LIGHT1); //激活1号光源
glLightfv(GL_LIGHT1,GL_DIFFUSE,light1_diffuse); //设置1号光源属性
glDepthFunc(GL_LESS); //深度缓存设置
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLdouble)w/h,0.1f,10.0f);
glMatrixMode(GL_MODELVIEW); glLoadIdentity();}第91页,共103页,2023年,2月20日,星期四intmain(intargc,char**argv){
auxInitDisplayMode(AUX_SINGLE|AUX_RGB|AUX_DEPTH);
auxInitPosition(0,0,400,400);
auxInitWindow(argv[0]);
auxReshapeFunc(myReshape);
auxMainLoop(display); return(0);}第92页,共103页,2023年,2月20日,星期四6.6纹理映射在三维图形绘制中仅有光滑曲面显示是不够的,在一定的面上采用相应的纹理会增强真实感。因而,三维图形绘制中纹理映射是广泛使用的,进行纹理映射需完成以下几件事:1)定义纹理;2)控制滤波;3)说明映射方式;4)绘制场景,给出顶点的纹理坐标和几何坐标。第93页,共103页,2023年,2月20日,星期四第94页,共103页,2023年,2月20日,星期四6.6.1定义纹理一般情况下,纹理是单个图像,通常是二维的当然也有一维纹理和二维纹理进行图形绘制,调用以下函数定义二维纹理映射:VoidglTexImage2D(GLenumtarget,GLintlevel,GLintcomponents,GLsizeiwidth,GLsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels);其中target指定目标纹理,只能GL_TEXTURE_2D;Level表示多级分辨率的纹理图像的级数,若只有一种分辨率,level为0;Components是从1~4的数,1:选择R;2:选择RA;3:选择RGB;4:选择RGBA。Width,height是纹理大小;Border是指边界宽度,只能是0,1;Format描述映射格式,可以是以下符号常量Type表示数据类型,可以是以下常量Level用于指定不同分辨率的纹理,使用时要考虑纹理滤波的问题第95页,共103页,2023年,2月20日,星期四6.6.1定义纹理一维纹理定义的函数
voidglTexImage1D(GLenumtarget,GLintlevel,GLintcomponents,GLsizeiwidth,
GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels);
定义一个一维纹理映射。除了第一个参数target应设置为GL_TEXTURE_1D外,其余所有的参数与函数TexImage2D()的一致,不过纹理图像是一维纹素数组,其宽度值必须是2的幂,若有边界则为2m+2。
第96页,共103页,2023年,2月20日,星期四6.6.2控制纹理滤波1、滤波原指纹理图像是个方形图像把它映射到复杂的物体上,一般不能图像上的一个像素对应屏幕的一个象素。因此局部放大或缩小时就要定义合适的滤波方式voidglTexParameter{if}[v](GLenumtarget,GLenumpname,TYPEparam);第一个参数target可以是GL_TEXTURE_1D或GL_TEXTURE_2D,它指出是为一维或二维纹理说明参数;后两个参数的可能值见表12-1所示。
第97页,共103页,2023年,2月20日,星期四1、重复与循环纹理映射可以重复映射或缩限映射,重复映射对纹理可以在自己的坐标S,T方向重复。glTexParameterfv(GL_TEXTURE_2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 七台河市人民医院感染病护理安全操作考核
- 2025年土地开发项目节能评估报告(节能专)
- 呼伦贝尔市中医院胎盘滞留处理技能考核
- 中国玻璃纤维无纺针刺毡项目商业计划书
- 鄂尔多斯市人民医院呼吸科临床数据挖掘与科研转化能力考核
- 鄂尔多斯市人民医院辐照血液应用考核
- 2025中医院超声诊断符合率考核
- 邢台市人民医院骨盆骨折前后联合入路考核
- 长治市中医院难治性肾病综合征诊疗决策考核
- 中国植物藻类提取物项目商业计划书
- 《第十三届全国交通运输行业机动车驾驶教练员职业技能大赛理论题库(540题)》
- 医务人员安全防范教育培训
- 运动营养监管-洞察及研究
- 麻醉低氧血症临床处理与预防策略
- 2024年中国大唐集团有限公司招聘考试真题
- 医院培训课件:《狂犬病暴露后处置》
- 绿色低碳建筑设计 课件 第3章 建筑空间设计
- 前置仓模式下叮咚买菜供应链管理优化策略研究
- 收养送养抱养协议书
- 产后耻骨联合分离护理
- 无需赡养协议书
评论
0/150
提交评论