版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1离散数据最重要的用途之一就是表面绘制。第八章
离散技术8.6映射方法8.7纹理映射8.8OpenGL中的纹理映射8.9纹理生成28.6映射方法图形显示卡可以每秒钟显示多达一千万个多边形,但这个速度仍不能满足模拟许多自然现象和天然物质的要求:云草地貌树皮毛发水波与火焰
越来越复杂的模型不是唯一的解决方法!38.6映射方法例:橙子的建模用橙色的球表示橙子太简单。用更复杂形状代替球没有表示出表面的特性。为了模拟所有的微凹,需要相当多的多边形。可以将真实橙子的照片“粘贴”到简单的几何模型上。以上过程就是纹理映射,结果可能仍然不令人满意,因为所得曲面是光滑的,需要改变局部形状,可以采用凹凸映射。48.6映射方法三种映射方法纹理映射利用图像填充多边形。环境映射(反射映射)利用环境的图像进行纹理映射。可以模拟高度镜面曲面。凹凸映射在生成显示结果的过程中可以改变法向量。58.6映射方法纹理映射的图案具有固定样式的图案。经常用于填充多边形的规则图案。通过过程纹理生成的图案。通过数字化处理后得到的图像。68.6映射方法纹理映射环境映射凹凸映射78.6映射方法三种映射的共同点作为片元处理的一部分。改变单个片元的明暗值。都与存储为一维、二维或三维数字图像的贴图有关。保持低的几何复杂性,但能产生复杂几何的视觉效果。都可能产生走样误差。88.6映射方法映射技术是在绘制流水线的最后阶段实现的,非常有效,这样可以减少了许多不必要的映射。9第八章
离散技术8.6映射方法8.7纹理映射8.8OpenGL中的纹理映射8.9纹理生成108.7纹理映射以数组形式存储在处理器内存里的二维图像称为纹理,此时数组元素称为纹素(texel),可以由应用程序生成,也可以将照片扫描输入。把离散数组看成一个连续的二维矩形区域纹理图案T(s,t),独立变量s和t是纹理坐标一般把纹理坐标缩放到[0,1]区间。118.7纹理映射把图像映射到曲面上是一个非常复杂的任务。128.7纹理映射涉及到的坐标系参数坐标系可以用来建立曲线、曲面。纹理坐标系用来识别要被映射的图像上的点。世界坐标系从概念上说,就是映射发生的地方。屏幕坐标系最终图像生成的地方。138.7纹理映射纹理映射框架148.7纹理映射映射函数考虑从纹理坐标到曲面上一点的映射。直观地看,需要如下函数x=x(s,t)y=y(s,t)z=z(s,t)w=w(s,t)实际采用的是间接方法。158.7纹理映射逆映射给定对象上的一个点,我们想知道它对应于纹理中的哪个点。此时需要如下形式的映射s=s(x,y,z,w)t=t(x,y,z,w)这样的函数一般是很难求出来的。168.7纹理映射实际困难假设要计算中心在(xs,ys)的一个矩形像素的颜色。中心点对应于对象上的点(x,y,z)。如果对象是弯曲的,那么矩形像素的原像是一个曲边四边形。这个曲边四边形在纹理上的原像才是对当前矩形像素的颜色有贡献的纹理元素。178.7纹理映射纹理坐标到屏幕坐标的映射xs=xs(s,t)ys=ys(s,t)(xs,ys)表示颜色缓存中的某个位置。188.7纹理映射走样现象198.7纹理映射用在纹理原像上对应区域的明暗效果的平均值赋给当前像素很难实现,也不是完美的。右图经上述处理后也得不到所需要的结果,但这个问题来自于低分辨率的局限。对于规则纹理,这种效果非常明显。208.7纹理映射映射的确定考虑由参数方程定义的曲面p(u,v)=(x(u,v),y(u,v),z(u,v))。通常采用如下形式从纹理元素对应到曲面上的点u=as+bt+c,v=ds+et+f,只要ae≠bd,上述映射是可逆的。218.7纹理映射没有考虑曲面的弯曲为了填充曲面,纹理在不同方向进行了不同拉伸。228.7纹理映射两步映射首先把纹理映射到一个简单的中间曲面上例如:映射到圆柱上然后从中间对象到实际对象的映射。238.7纹理映射圆柱映射高为h,半径为r圆柱的参数方程是x=rcos(2πu)y=rsin(2πu),0≤u,v≤1z=v/h映射函数:s=ut=v从纹理坐标到圆柱面上没有变形。适合于构造与无底的圆柱面拓朴同构的曲面上的纹理。248.7纹理映射258.7纹理映射268.7纹理映射球面映射半径为r的球的参数方程x=rcos(2πu)y=rsin(2πu)cos(2πv),0≤u,v≤1z=rsin(2πu)sin(2πv)类似于地图绘制中的映射肯定有变形。常用在环境映射中。278.7纹理映射立方体映射适合应用于正交投影中,也用在环境映射中。28第八章
离散技术8.6映射方法8.7纹理映射8.8OpenGL中的纹理映射8.9纹理生成298.8OpenGL中的纹理映射308.8OpenGL中的纹理映射应用纹理步骤如下:指定纹理
读入或生成图像赋给纹理激活纹理映射功能给每个顶点赋纹理坐标。
由应用程序建立适当的映射函数指定纹理
参数环绕(wrapping)、滤波(filtering)318.8OpenGL中的纹理映射纹理映射328.8OpenGL中的纹理映射纹理映射示例纹理(下方)是256×256的图像,它被映射到一个矩形上,经透视投影后的结果显示在上方。338.8OpenGL中的纹理映射纹理映射与OpenGL流水线图像与几何对象分别经过不同的流水线,在片段处理时合二为一,“复杂的”纹理并不影响几何的复杂性。348.8OpenGL中的纹理映射指定纹理图像利用CPU内存中的纹理元素数组定义纹理图像GLubytemy_texels[512][512];定义纹理图像所用的像素图扫描图像由应用程序代码创建激活纹理映射glEnable(GL_TEXTURE_2D);358.8OpenGL中的纹理映射glTexImage2D(target,level,iformat,w,h,border,format,type,texels);target:纹理的类型,如GL_TEXTURE_2D。level:用于mipmapping,0表示单分辨率纹理图像。iformat:纹素的分量格式,GL_RGB,GL_RGBA等。width和height:pixels的宽度和高度,2m+2b,b为边框宽。border:边框宽度,0(没有边框)或1。format:图像数据pixels的格式,GL_RGB,GL_RGBA等。type:pixels分量的数据类型,GL_BYTE,GL_INT等。pixels:指向纹素数组的指针,描述纹理图像及边框。368.8OpenGL中的纹理映射转化纹理图像
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,512,512,0,GL_RGB,GL_UNSIGNED_BYTE,my_texels);OpenGL需要纹理的尺寸(不包括可选的边框宽度)为2的幂次(OpenGL2.0以上无此限制),如果不是2的幂次,可用下述函数进行转化:
intgluScaleImage(GLenumformat,GLintwidthin,GLintheightin,GLenumtypein,constvoid*datain,GLintwidthout,GLintheightout,GLenumtypeout,void*dataout);datain源图像dataout目标图像当放缩时图像被插值和滤波378.8OpenGL中的纹理映射映射纹理基于参数纹理坐标,是状态量,内部表示为四维(s,t,r,q)。取值于[0,1],维数小于4时,默认有t=r=0,q=1,glTexCoord*()指定每个顶点对应的纹理坐标。388.8OpenGL中的纹理映射典型代码glBegin(GL_POLYGON);glColor3f(r0,g0,b0);//ifnoshadingusedglNormal3f(u0,v0,w0);//ifshadingusedglTexCoord2f(s0,t0);glVertex3f(x0,y0,z0);glColor3f(r1,g1,b1);glNormal3f(u1,v1,w1);glTexCoord2f(s1,t1);glVertex3f(x1,y1,z1);..glEnd();398.8OpenGL中的纹理映射OpenGL应用双线性插值从给定的纹理坐标中求出适当的纹素。可以只应用纹理的一部分方法是只应用纹理坐标的一部分,如最大纹理坐标为(0.5,0.5)。408.8OpenGL中的纹理映射对于四边形,从纹理坐标到顶点的对应是比较直接的。对于一般的多边形,程序员必须决定如何给顶点赋纹理坐标可能会出现变形。418.8OpenGL中的纹理映射OpenGL中有许多参数来确定纹理的应用方式wrapping。参数确定当s、t的值超出[0,1]区间后的处理方法。filter模式允许用区域平均方法来代替点采样方法。mimmapping技术使得能以不同的分辨率应用纹理环境参数确定纹理映射与明暗处理的交互作用。428.8OpenGL中的纹理映射Wrapping模式钳位(截断)模式:若s,t>1就取1,若s,t<0就取0重复:应用s,t模1的值glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP)glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT)438.8OpenGL中的纹理映射纹理的放大和缩小放大:多个像素覆盖一个纹素缩小:多个纹素覆盖一个像素448.8OpenGL中的纹理映射点采样:最近纹素的纹理值。线性滤波:最近点邻域(2x2)纹素加权平均的纹理值。458.8OpenGL中的纹理映射滤波模式的指定
glTexParameteri(target,type,mode)glTexParameteri(GL_TEXTURE_2D,GL_TEXURE_MAG_FILTER,GL_NEAREST);glTexParameteri(GL_TEXTURE_2D,GL_TEXURE_MIN_FILTER,GL_LINEAR);线性滤波需要一个额外的纹素边框来在边界处进行滤波,即border=1。468.8OpenGL中的纹理映射Mipmap对纹理位图进行预先滤波,降低分辨率。可以减小对于非常小的要加纹理的对象的插值误差。在纹理定义时声明mipmap的层次,level=0,1,…glTexImage2D(GL_TEXTURE_2D,level,width,height,…)478.8OpenGL中的纹理映射GLubyteimage0[64][64][3];GLubyteimage1[32][32][3];…GLubyteimage5[1][1][3];glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,64,64,GL_RGB,GL_UNSIGNED_BYTE,image0);…glTexImage2D(GL_TEXTURE_2D,5,GL_RGB,1,1,GL_RGB,GL_UNSIGNED_BYTE,image5);glTexParameteri(GL_TEXTURE_2D,GL_TEXURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);488.8OpenGL中的纹理映射有无mipmap的对比无mipmap有mipmap498.8OpenGL中的纹理映射自动生成mipmapGLU中提供了mipmap建立界面,可以从给定图像建立起所有的mipmap纹理gluBuild2DMipmaps(…)缩小滤波器参数:GL_NEAREST_MIPMAP_NEARESTGL_NEAREST_MIPMAP_LINEARGL_LINEAR_MIPMAP_NEARESTGL_LINEAR_MIPMAP_LINEAR508.8OpenGL中的纹理映射示例点采样mipmapped后的点取样线性滤波mipmapped的线性滤波518.8OpenGL中的纹理映射控制纹素和片段颜色如何融合glTexEnv{fi}[v](GL_TEXTURE_ENV,mode,param);GL_TEXTURE_ENV_MODE设置模式GL_MODULATE:与计算的明暗效果调制在一起GL_BLEND:与环境颜色融合在一起GL_REPLACE:只应用纹理的颜色GL_DECAL:与GL_REPLACE类似应用GL_TEXTURE_ENV_COLOR设置融合颜色528.8OpenGL中的纹理映射透视校正提示纹理坐标与颜色插值要么是关于屏幕空间线性确定的,或者要应用深度/透视值(较慢)。在多边形边界上,走样现象非常明显。glHint(GL_PERSPECTIVE_CORRECTION_HINT,hint)其中hint可取值
GL_DONT_CARE,GL_NICEST,GL_FASTEST538.8OpenGL中的纹理映射自动生成纹理坐标OpenGL能自动生成纹理坐标coord:纹理坐标,可取GL_S,GL_T,GL_R,或GL_Qpname:纹理坐标的生成函数,取GL_TEXTURE_GEN_MODEGL_OBJECT_PLANE,GL_EYE_PLANEparam:当pname为GL_TEXTURE_GEN_MODE时,取GL_OBJECT_LINEARGL_EYE_LINEARGL_SPHERE_MAP:用于环境映射否则应为数组,由纹理生成平面的系数组成548.8OpenGL中的纹理映射自动生成纹理坐标(续)指定平面ax+by+cz+dw=0根据顶点(x,y,z,w)到平面的距离生成纹理坐标(s,t),由于ax+by+cz+dw与该距离成比例,有
s=asx+bsy+csz+dswt=atx+bty+ctz+dtwGLfloatplanes[]={0.5,0.0,0.0,0.5};/*s=x/2+1/2*/GLfloatplanes[]={0.0,0.5,0.0,0.5};/*t=y/2+1/2*/glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);glTexGenfv(GL_S,GL_OBJECT_LINEAR,planes);glTexGenfv(GL_T,GL_OBJECT_LINEAR,planes);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);558.8OpenGL中的纹理映射纹理对象纹理也是状态的一部分,每类纹理(指1D,2D,3D)只有一个当前纹理,如果不同的对象具有不同的纹理,那么OpenGL需要从处理器内存向纹理内存传送大量数据。最新版本的OpenGL提供了纹理对象功能每个纹理对象是一个图像。纹理内存可以保存多个纹理对象。568.8OpenGL中的纹理映射产生n个未使用的纹理对象名称。voidglGenTextures(GLsizein,GLuint*textureNames);检查一个纹理名称是否被使用。GLbooleanglIsTexture(GLuinttextureName);创建或切换纹理对象,target为GL_TEXTURE_2D等。voidglBindTexture(GLenumtarget,GLuinttextureName);删除纹理对象。voidglDeleteTextures(GLsizein,constGLuint*textureNames);578.8OpenGL中的纹理映射纹理映射过程应用纹理框架在纹理对象中指定纹理设置纹理滤波方式设置纹理函数设置纹理的wrap模式设置可选的透视校正
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中生物 重点强化练43 人类遗传病及其调查实验
- 高中化学 加练 第十二章 微题型110 沉淀溶解平衡
- 基本不等式(一)-高一上学期数学课时作业人教版A版(含解析)
- 村庄混凝土道路施工方案(3篇)
- 槽形梁施工方案(3篇)
- 洛阳水源井施工方案(3篇)
- 清洗外墙施工方案模板(3篇)
- 瓷砖上墙施工方案(3篇)
- 病人咯血的应急预案(3篇)
- 私域营销的方案(3篇)
- 工艺纪律检查方案
- 江苏盐城东台市2026年专职网格员招聘考试试卷-含答案解析
- 2026年CCAA国家注册审核员考试(有机产品认证基础)复习题及答案
- 汽车维修管理制度大全
- 2026年初级注册安全工程师《安全生产专业实务(其他安全)》真题试卷(附答案解析)
- 药剂师招聘笔试题试题集详解
- 胆南星临床应用现状
- 原材料采购价格监督制度
- 方言词汇调查条目表
- 疼痛管理与康复医学
- 国企集团公司各岗位廉洁风险点防控表格(廉政)范本
评论
0/150
提交评论