三维图形程序设计5_第1页
三维图形程序设计5_第2页
三维图形程序设计5_第3页
三维图形程序设计5_第4页
三维图形程序设计5_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、三维图形程序设计1Face三维图形程序设计5三维图形程序设计2Chap5 纹理映射Chap4引例:1、绘制一面砖墙的应用: 就可以用一幅真实的砖墙图像或照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。 如果不用纹理映射的方法,则墙上的每一块砖都必须作为一个独立的多边形来画。2、透视投影方式观察墙面 纹理映射能够保证在变换多边形时,多边形上的纹理图案也随之变化。例如,以透视投影方式观察墙面时,离视点远的砖块的尺寸就会缩小,而离视点 较近的就会大些。纹理映射将图像映射到物体模型表面,模拟物体表面细节,称为纹理映射(Texture Mapping)stxyz图像:即纹理几何屏幕纹理是什么?

2、 纹理是一个数组,其中的数据是颜色、辉度或者颜色和alpha值。 纹理数组中的值通常被称为纹理单元(纹素)。纹理映射的步骤? 定义纹理 定义纹理的数据, 维数, 多重性(多分辨率), 边界值指定纹理的映射方式 激活纹理映射 glEnable() v.s glDisable() GL_TEXTURE_1D GL_TEXTURE_2D GL_TEXTURE_3D确定纹理坐标和几何坐标的关系-绘制场景 引例:看看教材上一个最简单的纹理映射执行效果:2个位置不同的立方体在其表面贴上一个自生成的贴图引例:看看教材上一个最简单的纹理映射引例:看看教材上一个最简单的纹理映射定义纹理纹理可以是一维、二维或三维

3、的多重纹理映射为纹理定义多种分辨率;在距离观察位置远时,映射低分辨率的纹理图像;距离近时,映射高分辨率的纹理图像;为纹理设置边界实际应用中需要多种纹理拼接;为纹理设置边界超出0.0,1.0 纹理参数范围的边界border, 通常为1个像素宽;通过线性平均,实现纹理图像 间的光滑过渡。定义纹理定义一维纹理纹理只在某一方向上变化,而在另一个方向上没有变化,相当于高度为1的二维纹理使用glTexImage1D( )函数定义一维纹理函数原型void glTexImage1D( GLenum target, GLint internalFormat, GLsizei width, GLint borde

4、r, GLenum format, GLenum type, const GLvoid *pixel)glTexImage1D()函数参数说明target 设置为GL_TEXTURE_1Dlevel 是使用多重纹理映射时的分辨率级数,若只有一个分辨率,该值为0internalFormat 表明纹理映射方式,取值为14之间的整数值,或者是38个符号常量之一(实际就是纹理单元中所存储的内容)width 给定纹理尺寸,必须是2的幂次方2m(m为非负整数,如果有边界width 为2m+b )border指定边界宽度b(为0或1)format 指定纹理的数据格式(纹素的数据格式)(_COLOR,_IND

5、EX, _RGB, _RGBA, _RED, _ALPHA)type 指定纹理的数据类型( GL_BYTE, GL_SHORT,GL_INT, GL_FLOAT, GL_UNSIGNED_INT)pixel为纹理图像数组的指针,指定纹理图像及其边界定义纹理定义二维纹理使用glTexImage2D()函数定义二维纹理函数原型void glTexImage2D( GLenum target, GLint internalFormat, GLsizei width, GLsizei heigth, GLint border, GLenum format, GLenum type, const GLv

6、oid *pixel)参数说明target 设置为GL_TEXTURE_2Dwidth和 heigth 给定二维纹理的尺寸,必须为2m+2b( width和 heigth 可分别对应不同的m值)width和 heigth为0,纹理映射无效定义三维纹理常用于医学和地质学应用程序中。 在医学应用程序中,三维纹理可以用于表示一系 列的CT图像 地质程序中,三维纹理可以模拟岩石层定义纹理定义三维纹理使用glTexImage3D()函数定义三维纹理函数原型void glTexImage3D(GLenum target, GLint internalFormat, GLsizei width, GLsiz

7、ei heigth , GLsizei depth, GLint border, GLenum format ,GLenum type, const GLvoid *texels)参数说明target 必须设置为GL_TEXTURE_3Dwidth 、 heigth 、depth给定三维纹理的尺寸,必须为2m+2b(三个参数可分别对应不同的m值)texels为三维纹理图像数组的指针定义纹理 通常在纹理对象的帮助下来使用纹理,因为它可以极大的提高纹理使用的性能。步骤: 1、生成纹理对象的名称 2、将纹理对象与纹理数据关联(即创建纹理对象) 3、检查是否有足够的空间来存储所有纹理对象(可以多个),

8、否则通过设置优先级,来保证最常用的纹理对象驻留在工作集中。 4、重新绑定纹理对象,使之成为当前对象。纹理对象 操作纹理对象所涉及到的函数(4个) glGenTextures(n,*textureNames); glIsTexture(textureName); glBindTexture(target,textureName); glDeleteTextures(n,*textureNames);纹理对象1、如果名字首次使用,将新建纹理对象2、如果为已经创建的,则使之为当前化3、如果为0,停用纹理对象定义纹理定义多重纹理映射事先指定一系列分辨率逐渐减小的纹理图像;OpenGL会根据所映射的物体

9、尺寸自动选择使用哪个分辨率的纹理图;需要额外的计算,增加计算时间;但可避免场景中小物体移动时纹理的闪烁mipmap: 为提示纹理映射的质量,通过指定一系列预先经过滤波生成的、分辨率递减的纹理图。优点:根据物体的大小,自动确定将使用哪个纹理图像,避免出现晃动和闪烁现象缺点:增加计算量和纹理所需的存储空间mipmap1、纹理尺寸 例:64162、如何确定在变化中使用哪一级mipmap =log2(:缩放因子, :mipmap等级)32 816 48 24 12 11 1总结定义纹理 glGenTextures(1,&texName); glBindTextrue(GL_TEXTURE_2D,tex

10、Name); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width, height, 0,GL_RGBA,GL_UNSIGNED_BYTE,bmpImage); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,32,32, 0,GL_RGBA,GL_UNSIGNED_BYTE,bmpImage32); glTexImage2D(GL_TEXTURE_2D,1,GL_RGBA,16,16, 0,GL_RGBA,GL_UNSIGNED_BYTE,bmpImage16); glTexImage2D(GL_TEXTURE_2D,2,GL_RGB

11、A,8,8, 0,GL_RGBA,GL_UNSIGNED_BYTE,bmpImage8); glTexImage2D(GL_TEXTURE_2D,3,GL_RGBA,4,4, 0,GL_RGBA,GL_UNSIGNED_BYTE,bmpImage4); glTexImage2D(GL_TEXTURE_2D,4,GL_RGBA,2,2, 0,GL_RGBA,GL_UNSIGNED_BYTE,bmpImage2);glTexImage2D(GL_TEXTURE_2D,5,GL_RGBA,1,1, 0,GL_RGBA,GL_UNSIGNED_BYTE,bmpImage1);mipmap如何动态控制m

12、ipmap的等级glTexParamteri(GL_TEXTURE_2D,GL_TEXTURE_BASS_LEVEL,2);glTexParamteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL, 5);glTexParamteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_LOD,1);glTexParamteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_LOD,4);要使用的分辨率最高的纹理的等级要使用的分辨率最低的纹理的等级的最小值的最大值6416 32 8 41 0 1 4进一步讨论mipmap 除了前面由程序员自行定义各分

13、辨率级的map外,OpenGL还提供由程序自行生成mipmap的函数。 使用前提: 程序员要提供0级别纹理(即分辨率最高的那一级) 使用结果: 得到最小直到11的mipmap gluBuild1DMipmaps(target,internalFormat,width,format, type,*texels); gluBuild2DMipmaps(target,internalFormat,width,height, format,type,*texels); gluBuild3DMipmaps(target,internalFormat,width,height, depth,format,

14、type,*texels);滤波(过滤) 一般来说,纹理图像为正方形或长方形。但当它映射到一个多边形或曲面上并变换到屏幕坐标时,纹理的单个纹素很少对应于屏幕图像上的象素。根据所用变换和所用纹理映射,屏幕上单个象素可以对应于一个纹素的一小部分(即放大)或一大批纹素(即缩小)。下面用函数glTexParameter*()说明放大和缩小的方法: glTexParameter*(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameter*(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

15、三维图形程序设计24只使用一个mipmapGL_NEAREST_MIPMAP_NEARESTGL_LINEAR_MIPMAP_NEAREST使用两个mipmapGL_NEAREST_MIPMAP_LINEARGL_LINEAR_MIPMAP_LINEAR纹理的重复和截取 纹理坐标 0,1,超出范围,将进行截取或重复 重复可以简单重复,也可以进行镜像 边框的处理:如果使用的纹理有边框或者指定了纹理边框 的颜色,则是否以及如何使用边框颜色将取 决于两者:环绕模式和过滤方法纹理的重复和截取 过滤方式为GL_NEAREST: 如果环绕模式为GL_GLAMP_TO_BORDER,将使用最近的边 框或边框

16、常量颜色 过滤方式为GL_LINEAR: 1、环绕模式为GL_NEAREST:忽略边框 2、环绕模式为GL_CLAMP:将边框用于加权平均 3、环绕模式为GL_CLAMP_TO_EDGE:忽略边框 4、环绕模式为GL_GLAMP_TO_BORDER:将使用最近的边 框或边框常量颜色指定纹理坐标 纹理坐标通常可定义成一、二、三或四维形式,称为s,t,r和q坐标,以区别于物体坐标(x, y, z, w)和其他坐标。一维纹理常用s坐标表示,二维纹理常用(s, t)坐标表示,三维坐标用(s,t,r),q坐标象w一样,一般值都设置为1,主要用于建立齐次坐标。OpenGL坐标定义的函数是:void glTexCoord1234sifdv(TYPE coords); eg: glTexCoord2f(0.0,1.0); glVertex3f(0.0,1.0,-3.0);#include #pragma comment(lib, glaux.lib)AUX_RGBImageRec *LoadBMP(char *Filename) FILE *File=NULL; if (!Filename) return NULL; File=fopen(Filename,r); if (File)fclose(File);return aux

温馨提示

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

评论

0/150

提交评论