计算机图形学(第六章真实感图形的显示).ppt

上传人:小飞机 文档编号:6432761 上传时间:2023-10-30 格式:PPT 页数:103 大小:2.41MB
返回 下载 相关 举报
计算机图形学(第六章真实感图形的显示).ppt_第1页
第1页 / 共103页
计算机图形学(第六章真实感图形的显示).ppt_第2页
第2页 / 共103页
计算机图形学(第六章真实感图形的显示).ppt_第3页
第3页 / 共103页
计算机图形学(第六章真实感图形的显示).ppt_第4页
第4页 / 共103页
计算机图形学(第六章真实感图形的显示).ppt_第5页
第5页 / 共103页
点击查看更多>>
资源描述

《计算机图形学(第六章真实感图形的显示).ppt》由会员分享,可在线阅读,更多相关《计算机图形学(第六章真实感图形的显示).ppt(103页珍藏版)》请在三一办公上搜索。

1、第6章 三维真实感物体显示技术,基本几何模型到真实感图形的绘制,引 言,计算机图形学中真实感绘制 包括两部分内容:物体的精 确表示和场景中光照效果的 逼真的物理描述。为可见物 体的颜色和光照效果建立模 型是一个非常复杂的过程,因为光照模型包含许多因素,如物体类型,物体相对于光源和其他物体的位置以及场景中所设置的光源属性等。一旦这些因素确定了,就可以通过光照模型来计算物体表面向空间给定方向辐射的光亮度。,主要内容消隐光照模型纹理映射,隐藏面和隐藏线的消除,如果不把隐藏的线或面消除,还可能发生对图的错误理解。,为了使计算机生成的图能真实地反映这一情况,必须把隐藏的部分从图中消除。,由于存在不透光的

2、物体,因此阻挡了来自某些物体部分的光线到达观察者,这些物体部分成为隐藏部分,隐藏部分是不可见的。,隐藏面和隐藏线的消除是计算机图形学中的一个基本问题。,消隐的几个效果图,基于图像空间的方法,隐藏面和隐藏线的消除有两种基本的算法,用该表面上交点处的颜色填充该像素,在和投影点到像素连线相交的表面中,找到离观察点最近的表面,对于图像中的每一个像素:,算法的简单描述如下:,该算法多用于面消隐。,以构成图像的每一个像素为处理单元,对场景中的所有表面,确定相对于观察点是可见的表面,用该表面的颜色填充该像素。,基于物体空间的方法,隐藏面和隐藏线的消除有两种基本的算法,用可见表面的颜色填充相应的像素以构成图形

3、;,判定场景中的所有可见表面;,对于三维场景中的每一个物体:,算法的简单描述如下:,该算法多用于线消隐,也用于面消隐。,是以三维场景中的物体对象为处理单元,在所有对象之间进行比较,除去完全不可见的物体和物体上不可见的部分。,假定:垂直投影,下面讨论消隐算法时,都假定投影平面是oxy平面,投影方向为负z轴方向的垂直投影。,隐藏线和隐藏面消除所讨论的对象是一个三维图形,消隐后要在二维空间中表示出来,因此消隐后显示的图形将和三维空间至二维空间的投影方式有关。,6.1.1 凸多面体的隐藏线消除,多面体特点多个面每个面都有向外的法向量凸多面体特点法向量规则多面体不存在部分遮挡,凸多面体是由若干个平面围成

4、的物体。假设这些平面方程为 当某点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)0,aix0+biy0+ciz0+di 0(i=1,2,,n),视点与第i个面上一点连线方向为(li,mi,ni),即从视点指向一点,判断:(ai,bi,ci)(li,mi,ni)0平面 i为自隐藏面。一般地,取视点在Z轴负无穷远点。这时,物体将被正投影到x

5、y平面上。由于视线方向为(0,0,1),所以,ci0所对应的面,为自隐藏面。任意两个自隐藏面的交线,为自隐藏线。,6.1.3 凹多面体的隐藏线消除,特点全部被遮挡没有被遮挡部分被遮挡,对于一条空间线段P1P2和一个多边形p,判断线段有没有被多边形遮挡。如果被遮挡,求出隐藏部分。,没有交点被完全遮挡没被遮挡有交点 部分被遮挡,将投影的线段分成若干子线段将子线段与所有多边形进行求交求并集,6.2 面消隐,6.2.1 区域排序(画家算法),在图象空间中,将待显示的所有多边形按深度值从小到大排序,用前面可见多边形去切割后面的多边形,最终使得每个多边形要么是完全可见,要么是完全不可见,多边形裁剪双边裁剪

6、遇到交点向右拐,1)进行初步深度排序,可按各多边形z最小值(或最大值、平均值)排序;2)选择当前深度最小(离视点最近)的多边形为裁剪多边形;3)用裁剪多边形对那些深度值更大的多边形进行裁剪4)比较裁剪多边形与各内部多边形的深度,检查裁剪多边形是否是离视点最近的多边形。若裁剪多边形深度大于某个内部多边形的深度,则恢复被裁剪的各多边形,选择新的裁剪多边形,回到3),否则做5);5)择选下一个深度最小的多边形作为裁剪多边形,从3)开始做,直到所有的多边形都处理过为止。在得到的多边形中,所有的内部多边形是不可见的,其余多边形均为可见多边形。,6.2.2 深度缓存算法Z-Buffer,深度缓存数组 ZB

7、颜色属性数组 CB本质:保留离视点近的不排序,z缓冲器算法是最简单的消除隐藏面算法之一z缓冲器是一组存贮单元其单元个数和屏幕上象素的个数相同也和帧缓冲器的单元个数相同,它们之间一一对应。,屏幕 帧缓存 Z缓冲器,1)初始化ZB和CB,使得ZB(i,j)=Z max,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中存放的就是消隐后的图形。,如何求深度设某个多边形所在的平面方程为 ax+by+cz

8、+d=0 若c0,则 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(水平方向的相关性),类似地可推出平面多边形内的点在垂直方向上的相互关系。设多边形一条边的方程为 ax+by+c=0。XOY平面上:在y=yi点,xi=(-c-byi)/a;在yi+1点,因yi+1=yi+1。所以xi+1=xi-b/a(垂直方向的相关性),求深度算法,1将多边形的边按其y最小值排序,搜索多边形中各顶点的y值,找出其中最小的值ymin和最大值

9、ymax;2令扫描线y=ymin到ymax以增量为1变化。此时,(a)找出与当前扫描线相交的所有边,利用垂直相关性求出这些边与扫描线的交点,并将这些交点从小到大排序;(b)在相邻两交点之间选一点,判断其是否被多边形包含,如果被多边形包含,则利用多边形上点的水平相关性,求出两交点之间各点的深度值;重复(b),直到当前扫描线上所有在多边形内的点的深度都求出为止。,优势不排序,只比较,效率高,便于硬件实现缺点两个缓存,太大,6.2.3 扫描线算法,改进的Z-Buffer1)对每个多边形求取其顶点中所含的y的最小值ymin和最大值ymax,按ymin进行排序,建立活性多边形表,活性多边形表中包含与当前

10、扫描线相交的多边形。2.)从上到下依次对每一条扫描线进行消隐处理,对每条扫描线上的点置初值,Z值Z(x)取为最大,颜色I(x)取为背景色。,3)对每条扫描线y,按活化多边形表找出所有与当前扫描线相交的多边形。对每个活性多边形,求出扫描线在此多边形内的部分,对这些部分中每个象素x计算多边形在此处的Z值,若Z小于Z(x),则置Z(x)为Z,I(x)为多边形在此处的颜色值。4)当扫描线对活化多边形表中的所有多边形都处理完毕后,所得的I(x)即为显示的颜色,可进行显示并换下一条扫描线进行处理,即扫描线的y=y+1。此时应更新活性多边形表,将已完全处于扫描线上方的多边形,即ymaxy的多边形移出活性多边

11、形表,将不在当前活性多边形表中的与新一条扫描线相交的多边形,即ymin=y的多边形加入活性多边形表。,6.2.4 区间扫描算法,由于扫描线z缓冲器算法的运算量较大,下面的区间扫描线算法考虑了各个边的拓扑结构关系,运算量就少许多。,每条扫描线被多边形边界在xoy平面上的投影分割成为一些小区间,从结构上看,这些区间上的象素的显示或隐藏性质应当一样的。因此,只须分析清楚每个区间上的显示与否的属性便可。于是,只要在区间上任意一点处,找出在该处z值最小的面。这个区间上的每个象素就用这个面颜色来显示。克服了扫描线z缓冲器算法在每个象素处计算多边形z值而工作量大的困难,这种区间上计算z值的做法叫区间扫描线算

12、法。,如下图所示,扫描线l与A、B、C三个投影多边形的边相交形成个小区间。下面如何确定这些小区间的颜色呢?,按下列情况进行讨论:小区间上没有任何多边形,如d,e段和扫描线l两头此时用背景色显示该小区间。当小区间只有一个多边形,如a,b,e,d等,这时用此多边形的颜色便可显示该小区间。当小区间存在两个或两个以上的多边形,如图中的f,g,必须通过深度测试判断哪个多边形是可见的,再显示此多边形的颜色。,如果允许物体表面相互贯穿,那么还必须求出它们在xoz扫描平面上的交点,再进一步细分这些小区间。更进一步作深度判断哪个多边形是可见的。,6.2.5 Warnock算法,这是一种分而治的算法,既适合于消去

13、隐藏线又适合于隐藏面,其基本思想如下:首先观察整个窗口区域,如果窗口中只需显示一个多边形面,则可以直接显示出来,此时称窗口为单纯的,否则为非单纯的。例如:窗口内没有可见物体,则直接显示背景或窗口内只有一个多边形面颜色,则就是单纯的。若窗口内有两个多边形或非单纯的时候,则将窗口分为四部分,进一步判断它们是否单纯。不单纯时再细分,直到窗口单纯或窗口不能再分为止。如图5.13所示,6.2.5 Warnock算法,6.2.5 Warnock算法,这过程可以用一棵四叉树来描述,有很好的效率。即使1024*1024的视图窗口,被细分十次后也成为一个象素面而不能再分。当然,算法中关键在窗口是否单纯的判断,这

14、就要分析窗口与物体的所有投影后的多边形面之间的关系,如图5.14所示,多边形面与窗口的关系有种类型:,6.2.5 Warnock算法,(a)分离,是指多边形在窗口之外。(b)内含,是指多边形在窗口之内。(c)相交,是指多边形与窗口部分相交。(d)包围,是指多边形把窗口全部包含。,6.2.5 Warnock算法,根据这四种情况,Warnock算法描述如下:步骤一:对每个窗口进行判断,若所有多边形没在某个窗口,则该窗口设为背景色。步骤二:若窗口内含一个多边形,则窗口中多边形部分着此多边形色,其余部分着背景色。步骤三:若窗口与一个多边形相交,同步骤二一样。步骤四:若窗口被一多边形包围,则全部着多边形

15、颜色。步骤五:若窗口被若干多边形包围,并且所有多边形不交叉,则把距离视点近的多边形颜色给窗口着色。步骤六:若以上条件都不满足,那么继续细分窗口,并重复上述步骤。以上几个步骤中,步骤五是关键,要找出包围窗口的多边形中距离视点最近的一个多边形,需要作深度检测,具体实现时,可将面片根据它们距离视点的最小距离先进行深度排序,然后,再取最小深度的多边形的颜色作为窗口颜色。,6.4 光照模型,描绘一个三维物体更加逼真的方法是显示它的色彩、以及色彩在光照环境下的明暗变化。这种明暗描绘方法称为Shading。光照模型 物体表面颜色 与 光源特性 和 物体表面特性(材质和颜色),颜色模型和颜色应用,1、光和颜色

16、物体的颜色不仅取决于物体本身,还与光源,周围环境的颜色有关。如,红光照在物体上,使其带有红色成份,红色物体使其附近物体泛红等,不仅如此,物体颜色还与人们感觉心里系统有关。例如有些人看红色的物体时并不产生红色的感觉,这就我们常讲的色盲。,颜色模型和颜色应用,2、CIE色度图 对自然界的一种颜色c可以表示为:等号表示两边代表的光看起来完全相同,“”号表示光的叠加,r、g、b为颜色配对中所需要的RGB三原色光的相对比例量,R、G、B为红、绿、蓝三原色光。,颜色模型和颜色应用,1931年国际照明委员会CIE给出了任意可见光所需的三原色光的比例曲线,如下图所示。注意到图中对于500m的光要用R、G、B线

17、性组合表示时,r值应当为负,否则无法表示。这带来一个问题,即对于500m的光如何用R、G、B实现。因为我们并不存在一种负的光强,即负的rR是不能实现的。因而有一些颜色不能通过将三原色混合起来得到并在CRT上显示。,颜色模型和颜色应用,于是,CIE在1931规定了三种假想的标准原色,x、y、z以便能得到的颜色匹配的比例量全为正。注意:除了用红、绿、蓝三色混合成一般颜色外,还可以用补色青、品红、黄来构成三原色,即只要满足下列二条件的三种颜色均可作为原色:1、任何一种颜色可以用三种颜色混合而成;2、三种颜色中任意一种颜色不能由其余两种颜色混合而成。,颜色模型和颜色应用,CIE用XYZ形成一个CIEX

18、YZ系统,该系统的光颜色匹配函数定义为如下的一个式子:,颜色模型和颜色应用,对于同一颜色C的CIE_RGB的值(R,G,B)与CIE_XYZ的值可以通过以下形式相互转换:,光的种类,点光源 直射光源分布式光源 直射光源漫射光源,物体表面材质,材质的颜色是由它所反射的光的波长决定如果光线被投射至一个不透明的物体表面,则部分光线被反射,部分被吸收物体表面的材质类型决定了反射光的强弱表面光滑较亮的材质将反射较多的入射光,而较暗的表面则吸收较多的入射光。同样对于一个半透明物体的表面,部分入射光会被反射,而另一部分则被折射。,物体表面特性,反射系数漫反射(Diffuse Reflection)系数镜面反

19、射(Specular Reflection)系数,物体表面:光源颜色和漫反射系数,透射系数 透射光线的能力表面方向 外法向量,6.4光照模型及其实现,物体表面的色彩明暗与光源特性和物体表面特性密切相关。在现实世界中,光照射到物体上,光线可能被吸收、反射、和透射。被物体吸收的部分转化为其它的能量。反射和透射的光则进入我们的视觉系统,我们便看见物体。为此,我们需要了解已知物理形态和光源性质的条件下,计算物体的光照效果的数学模型光照模型,简单光照明模型,假设物体不透明那么物体表面呈现的颜色仅由其反射光决定。反射光组成环境反射环境反射假定入射光均匀地从周围环境入射至景物表面并等量地向各个方向反射出去漫

20、反射与镜面反射漫反射分量和镜面反射分量则表示特定光源照射在景物表面上产生的反射光。,主要研究:漫射光线和透射光线,光源称为发光体反射表面(如房屋的墙壁)则称为反射光源,图:通常在一个不透明且不发光的物体表面所 观察到的光线是其反射光,它由光源与其他物体表面的反射光所共同产生,在物体不透明的情况下,物体表面的颜色仅由其反射光决定。反射光有三种类型的分量组成:环境反射、漫反射和镜面反射。环境反射是入射光均匀地从周围环境入射到物体表面后等量地向各个方向反射的光。例如:透射厚厚云层的阳光,室内各物体之间光的多次反射结果也可以视作环境反射光。漫反射分量表示特定光源在景物表面的反射光中那些向空间各方向均匀

21、反射出去的光,而镜面反射光为朝一定方向的反射光。这几种反射光是我们看见物体的关键。下面详细讨论这几种光的计算,1、环境光,不同的物体对环境光有不同的反射属性,记为Ka,若用Ia表示环境光的强度,于是物体某点的反射光强度为:注意到我们所接受的是Iambien的强度,也就是在图上要用 Iambien表示物体上的点,Ka与物体有关,根据物体而定,Ia由环境光定,其越强自然使Iambien越强,符合我们的习惯。,2、漫反射,漫反射是物体并不光滑形成的,这种不光滑的物体叫漫反射体。如图5.22所示,其特点是反射光是由于表面从各个方向等强度地反射而成,因而从各个视角出发,物体表面呈现相同的亮度,所看到的物

22、体表面某点明暗程度不随观测者的位置变化而变化。漫反射光的强度或某点的明暗程度服从Lambert漫反射模型,2、漫反射,其中 Idiffuse是物体表面某点的漫反射光强,Id为点光源的光强度。K d(0K1)表示物体表面该点对漫反射光的反射属性,是入射光线与物体表面在该点出法线的夹角。,2、漫反射,这里具体计算 是要注意的,令L是该点到光源的单位向量,N为单位法向量,则:,3.镜面反射光 镜面反射光为朝一定方向的反射光。根据光的反射定律,反射光和入射光对称地分布于表面法向的两侧。对纯镜面,入射至表面面元上的光严格地遵循光的反射定律单向反射出去,反射角与入射角相等。,一般光滑表面:表面实际上是有许

23、多朝向不同的微小平面组成其镜面反射光分布于表面镜面反射方向的周围常采用余弦函数的幂次来模拟一般光滑表面的镜面反射光的空间分布,图 8.4 镜面反射,反射光,采用余弦函数的幂次来模拟一般光滑表面的镜面反射光的空间分布。Is 为观察者接受到的镜面反射光亮度Ips为入射光的光亮度,为镜面反射方向和视线方向的夹角,介于0o到90o之间n为镜面反射光的会聚指数(与物体表面光滑度有关)ks为镜面反射系数(与材料性质和入射光波长有关)。,投向观察者的镜面反射光不仅决定于入射光,而且和观察者的观察方向有关。当视点取在镜面反射方向附近时,观察者接受到的镜面反射光较强,而偏离这一方向观察时,镜面反射光就会减弱甚至

24、消失。,视点相关性,4、phong模型,一个物体在一个场景中,若没有光的照射,我们肯定是看不见的,只有在某种光照下,反射光才能进入我们视觉系统,而光照下物体的反射光有三种类型,也就是说,进入我们视觉系统的反射光有三种类型。因此,物体某点上的反射光的强度应当是三种反射光的迭加。即,当光源有多个时,则上式可写为:ka 环境反射系数kd漫反射系数ks镜面反射系数表示对所有特定光源求和,Phong模型,法向量的改变对光亮度计算影响大,点的位置的改变对光亮度计算影响较小,为避免光谱计算,直接用光栅图形显示器的RGB三基色颜色系统。即写成,1)假设光源为理想点光源,且不考虑其辐射光强的空间分布。2)除了曲

25、面的法向量外,曲面的所有几何信息均不予考虑。3)表面漫反射光亮度和镜面反射光亮度均被认为是对光源入射光的直接反射,且相互独立。,Phong模型具有以下明显的特点,4)表面镜面反射光亮度由一个经验模型来模拟,但当该光亮度达到显示器所能显示的最高色度时,其变化将被裁剪掉。5)用镜面高光指数n来模拟景物表面的光滑程度。镜面高光指数n的变化可使光源看上去变大或变小。6)镜面反射光的颜色被假定成光源的颜色,而与表面材质属性无关。7)周围环境对景物表面的影响,即环境光,被假设为一常数。,Phong模型具有以下明显的特点,Phong 模型存在的问题,Phong光照明模型是真实感图形学中提出的第一个有影响的光

26、照明模型,生成图象的真实度已经达到可以接受的程度;,是一个经验模型,还具有以下的一些问题:,1)用Phong模型显示出的物体象塑料,没有质感,2)环境光是常量,没有考虑物体之间相互的反射光,3)镜面反射的颜色是光源的颜色,与物体材料无关,4)镜面反射的计算在入射角很大时会产生失真,6.5 OpenGL的光照处理,从上面可见,要显示一张简单的曲面所涉及的内容和计算是相当复杂的,若再添加各种场景或增加几个光源,情况更加麻烦。现在OpenGL把相当复杂的工作已集成在相应地函数中,只须对参数的处理便可得到需要的光照模型,方便了我们的使用,下面就介绍如何使用OpenGL进行光照处理。,651光源的定义,

27、光源有许多特性,如颜色、位置、方向等。不同特性的光源,作用在物体上的效果是不一样的。定义一个光源的主要工作就是定义它的各种特性,OpenGL通过光源特性的函数glLight*()来定义光源。Void glLighti fv(GLenum light,GLenum pname,TYPE*param);,其中light 指定光源编号,在一个场景最多定义八个不同的光源,编号为GL-LIGHT0,GL-LIGHT1,GL-LIGHT7,参数pname指定光源特性的名称,即是什么种类的光。如下表取值,参数param为指向param所指属性值的指针,它可以指向一个数值,也可以指向一个值,具体有所定义的属性

28、而定,651光源的定义,表6.1 pname参数的取值及意义,聚光设置:一般情况下,光源光线是向四周发射,可以使用GL_DOT_CUTDFF来限制光线的范围,缺省是180.0。当然,除了指定光发散角度外,还需指定聚光状态下的方向,例如:glLlightf(GL_LIGHT0,GLSPOT_CUTOFF,45.0);/45角范围GLfloat spot_direction=-1.0,-1.0,0.0;glLightfv(GL_LIGHTO,GL_SPOT_DIRECTION,spot_direction),#include#include#include void myinit(void);vo

29、id CALLBACK myReshape(GLsizei w,GLsizei h);void CALLBACK display(void);void myinit(void)GLfloat light_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);,void CALLBACK display(void)glClear(GL

30、_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);auxSolidSphere(1.0);glFlush();void CALLBACK myReshape(GLsizei w,GLsizei 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);elseglOrtho(-1.5*(GLfloat)w/(GLfl

31、oat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,-10.0,10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();,void main(void)auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);auxInitPosition(0,0,500,500);auxInitWindow(Simple Lighting);myinit();auxReshapeFunc(myReshape);auxMainLoop(display);,652材质的定义,OpenGL用材质来描述物体表面特性,通过

32、制定物体表面对光的反射率来确定物体的颜色,设置材质属性的函数是:Void glMateriali f(GLenum face,GLenum pname,TYPE param);其中参数face是GL_FRONT,GL_BACK或GL_FRONT_AND_BACK指定当前材质作用物体的哪一面.,652材质的定义,参数pname设置材质的属性,由表5.3所示 表5.3 pname的取值及意义,652材质的定义,例如,将当前材质的散射和环境反射率设置为(0.1,0.5,0.8,1.0)GLfloat mat_amb_diff=0.1,0.5,0.8,1.0glMaterialfv(GL_FRONT_

33、AND_BACK,GL_AMBIENT_AND_ DIFFUSE,mat_amb_diff,光照明模型,光照效果,光照明模型,一个光照的球体,光照产生的场景,#include#include#include#include#include GLfloat position0=0.0f,1.5f,1.0f,1.0f;GLfloat position1=0.0f,1.5f,0.0f,1.0f;GLfloat position2=0.0f,2.0f,2.0f,1.0f;GLfloat position3=0.0f,0.0f,2.0f,1.0f;GLfloat mat_cylinder=0.0f,0.

34、5f,0.75f,0.15f;GLfloat mat_sphere=1.0f,1.0f,1.0f,1.0f;GLfloat mat_box=0.0f,0.75f,0.0f,0.1f;GLfloat mat_emission=0.1f,0.1f,0.1f,0.0f;,void CALLBACK display()glPushMatrix();glTranslatef(0.0,0.0,-5.0);glLightfv(GL_LIGHT0,GL_POSITION,position3);/创建0号光源glLightfv(GL_LIGHT1,GL_POSITION,position1);/创建1号光源gl

35、PushMatrix();glMaterialfv(GL_FRONT,GL_EMISSION,mat_sphere);/设置材质特性-EMISSIONglTranslatef(position10,position11,position12);auxSolidSphere(0.1);glPopMatrix();glPushMatrix();glTranslatef(0.0,0.0,0.5);,glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);/设置材质特性-EMISSIONglMaterialfv(GL_FRONT,GL_DIFFUSE,mat_c

36、ylinder);/设置材质特性-DIFFUSEauxSolidCylinder(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();,GLfloat light0_diffuse=0.3f,0.3f,0.3f,

37、1.0f;GLfloat light1_diffuse=1.0f,1.0f,1.0f,1.0f;void CALLBACK myReshape(int w,int h)GLfloat mat_ambient=0.8f,0.8f,0.0f,0.15f;GLfloat mat_specular=1.0f,1.0f,1.0f,0.15f;GLfloat mat_shininess=64.0;glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv

38、(GL_FRONT,GL_SHININESS,mat_shininess);,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_C

39、OLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0f,(GLdouble)w/h,0.1f,10.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();,int main(int argc,char*argv)auxInitDisplayMode(AUX_SINGLE|AUX_RGB|AUX_DEPTH);auxInitPosition(0,0,400,400);auxInitWindow(argv0)

40、;auxReshapeFunc(myReshape);auxMainLoop(display);return(0);,66纹理映射,在三维图形绘制中仅有光滑曲面显示是不够的,在一定的面上采用相应的纹理会增强真实感。因而,三维图形绘制中纹理映射是广泛使用的,进行纹理映射需完成以下几件事:1)定义纹理;2)控制滤波;3)说明映射方式;4)绘制场景,给出顶点的纹理坐标和几何坐标。,661定义纹理,一般情况下,纹理是单个图像,通常是二维的当然也有一维纹理和二维纹理进行图形绘制,调用以下函数定义二维纹理映射:Void glTexImage2D(GLenum target,GLint level,GLin

41、t components,GLsizei width,GLsizei height,GLint border,GLenum format,GLenum type,const GLvoid*pixels);其中target指定目标纹理,只能GL_TEXTURE_2D;Level表示多级分辨率的纹理图像的级数,若只有一种分辨率,level为0;Components是从14的数,1:选择R;2:选择RA;3:选择RGB;4:选择RGBA。Width,height是纹理大小;Border是指边界宽度,只能是0,1;Format描述映射格式,可以是以下符号常量Type 表示数据类型,可以是以下常量Lev

42、el用于指定不同分辨率的纹理,使用时要考虑纹理滤波的问题,661定义纹理,一维纹理定义的函数void glTexImage1D(GLenum target,GLint level,GLint components,GLsizei width,GLint border,GLenum format,GLenum type,const GLvoid*pixels);定义一个一维纹理映射。除了第一个参数target应设置为GL_TEXTURE_1D外,其余所有的参数与函数TexImage2D()的一致,不过纹理图像是一维纹素数组,其宽度值必须是2的幂,若有边界则为2m+2。,662控制纹理滤波,1、滤

43、波原指纹理图像是个方形图像把它映射到复杂的物体上,一般不能图像上的一个像素对应屏幕的一个象素。因此局部放大或缩小时就要定义合适的滤波方式void glTexParameterifv(GLenum target,GLenum pname,TYPE param);第一个参数target可以是GL_TEXTURE_1D或GL_TEXTURE_2D,它指出是为一维或二维纹理说明参数;后两个参数的可能值见表12-1所示。,1、重复与循环纹理映射可以重复映射或缩限映射,重复映射对纹理可以在自己的坐标S,T方向重复。glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAR

44、_S,GL_REPEAT);glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAR_T,GL_REPEAT);对于约简映射,有glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAR_S,GL_CLAMP);glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAR_T,GL_CLAMP);,662控制纹理滤波,2、,前者是放大滤波,后者是缩小滤波,glTexParameter*(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexP

45、arameter*(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);,若选择GL_NEAREST则采用坐标最靠近象素中心的纹素,这有可能使图像走样;若选择GL_LINEAR则采用最靠近象素中心的四个象素的加权平均值。GL_NEAREST所需计算比GL_LINEAR要少,因而执行得更快,但GL_LINEAR提供了比较光滑的效果。,663 映射方式,定义纹理映射方式是指认定纹理图像映射到目标及以获得最终RGBA值的方式。OpenGL提供了三种纹理映射方式,一种是简单地把纹理地颜色作为最终地颜色来使用,这叫刻纸方式;另一种是使用纹理来调节目标区地颜色,

46、以获得最终的颜色;最后是使用纹理颜色和目标区颜色相融合。这些细节可以用设置纹理环境的方式来控制。,663 映射方式,OpenGL通过一下命令设置纹理环境:Void glTexEnvi f(GLenum target,GLenum pname,TYPE param);Void glTexEnvi fv(GLenum target,GLenum pname,TYPE params);在函数中,参数target必须取GL_TEXTURE_ENV;pname指定被设置参数不符号常量,若是GL_TEXTURE_ENV_MODE,则param可以式GL_DECAL,GL_MODULATE,或GL_BLEN

47、D,说明纹理值在原来颜色不同的处理方式。pname是GL_TEXTURE_ENV_COLOR时,param是包含4个浮点数(R,G,B,A)的数组,这些值只在采用GL_BLEND纹理系数时才采用。,664 纹理坐标定义,纹理图像是方形的,纹理坐标可包含1-4个坐标,即s,t,r,g坐标,它们区别于对象的x,y,z,w坐标,也不同于计算坐标u,v。对于一维纹理,使用s坐标,二维纹理使用s,t坐标,当前纹理坐标的设置由下列函数来完成Void glTexCoard1 2 3 4s i f dv(TYPE coorde)该函数设置当前纹理坐标,然后调用glVertext()所产生的顶点都赋予当前的纹理

48、。,665 纹理坐标的自动生成,有时不需要为对象的每个顶点赋予纹理坐标,可以使用下列函数来自动 生成纹理坐标:void glTexGeni f dv(GLenum coord,GLenum pname,TYPE param)在该函数中,参数coord的取值为GL_S,GL_T,GL_R或GL_Q,它指明 是否生成s,t,r,或g纹理坐标。Pname参数的取值为GL_TEXTURE_GEN _MODE,GL_OBTECT_PLANE或GL_EYE_PLANE,第三个参数param是一个定义纹理产生参数的指针,其值取决于第二个参数pname的设置,当pname为GL_TEXTURE_GEN_MODE时,param是一个常量,即GL_OBJECT_LINEAR、GL_EYE_LINEAR或GL_SPHERE_MAP,它们决定用哪一个函数来产生纹理坐标。对于pname的其它可能值,param是一个指向参数数组的指针。纹理图像映射到固体物体上,使用物体坐标指定参考较合适.GL_OBJECT_LINEAR.移动的物体上生成动态的等高线时,使用眼坐标GL_EYE_LINEAR较合适.球形环境映射用GL_SPHERE_MAP较合适.,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号