第五章 纹理映射基础
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
也可以定义一维或三维纹理,函数分别是 GLTexImage1D()和GLTexImage3D()
2.2 控制纹理
控制纹理:控制纹理图像的纹理如何对应到屏幕上的像素, 怎样通过纹理贴图实现纹理缩放和纹理重复等 函数: void glTexParameter{if}[v](GLenum target, GLenum pname,TYPE param) 该函数控制设置几个纹理参数,这些参数绑定到当前的纹 理状态,可以通过glBindTexture设置为当前状态 target——指定的纹理目标 pname——将要设置的纹理参数 param——pname所指定的参数值
GL_LINEAR线性过滤: 将纹理坐标周围的纹理单元的加权平均值 应用到这个纹理坐标上(线性插补) 特点:纹理被拉伸时出现"失真",但是, 和最邻近过滤相比,这种"失真"更真实, 没有人工操作的痕迹
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR)
GL_REPEAT:在纹理坐标超过1.0的方向上对纹 理进行重复
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT)
2.5 分配纹理坐标
几何坐标决定顶点在屏幕上绘制的位置,纹理坐标 决定纹理图像中哪个像素赋予该顶点 纹理坐标:定义成一,二,三四维坐标,称为s,t,r,q 坐标,以区别于几何坐标(x,y,z,w) 一维纹理用s坐标表示,二维纹理用(s,t)坐标表 示,q坐标像w一样,一般取值为1 ,用于建立齐次坐 标
2)使用glMultiTexCoord*()函数为每个顶点 指定多个纹理坐标,分别用于不同的纹理单位
void glMultiTexCoord{1234}{sifd}[v](GLenum texUnit, TYPE coords) 该函数将参数coords中的纹理坐标数据(s,t,r,q)用 于坐标单位texUnit. texUnit所使用的枚举值与 glActiveTexture()函数相同
第五章 纹理映射基础
邱航 qiuhang@ 电子科技大学计算机科学与工程学院 电子科技大学数字媒体技术研究所
本章内容
第一节 纹理映射概述 第二节 OpenGL纹理映射 第三节 多重纹理
第一节 纹理映射概述
纹理映射:将图像数据应用到几何图元上 用于真实感图像制作,可以方便的制作出 极具真实感的图形而不必花过多时间来 虑物体的表面细节 纹理加载过程可能影响程序运行速度,当 纹理图像很大时,尤为明显
glIsTexture(GLuint textureName) 判断一个纹理名称是否处于实际使用 中. 如果一个纹理名称由glGenTextures()函 数返回,但它还没有绑定,那么glIsTexture() 返回GL_FALSE
创建和使用纹理对象
void glBindTexture(GLenum target,GLuint textureName) 用于创建和使用纹理对象 1)如果textureName是个非0无符号整数,且第一次 在这个函数中使用这个值,函数则创建一个新的纹理对象, 并把这个名字分配给它 2)如果textureName是以前已经创建过的纹理对象, 这个纹理对象就成为活动的纹理对象,然后调用修改纹理图 像或其他属性的函数时,将修改当前纹理对象内容和属性 3)如果textureName为0,则停止使用纹理对象,并 返回到无名称的默认纹理
GL_NEAREST最邻近过滤: 最简单和最快速的过滤方法 不管文理里坐标落入哪个纹理单元,这个 纹理单元的颜色就作为这个片段的纹理颜 色 特征:当纹理拉伸到特别大时,会出现大 片斑驳状像素
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST)
target: 当纹理对象被创建时,用来指定维数, 即GL_TEXTURE_1D, GL_TEXTURE_2D,
GL_TEXTURE_3D或GL_TEXTURE_CUBE_MAP
清除纹理对象
void glDeleteTextures(GLsizei n, const Glint *textureNames) 删除n个纹理对象,名称由textureNames数组 元素提供,被释放的纹理对象名称以后可以被重 新使用. 如果当前绑定的纹理对象被删除,这个绑定 将恢复到默认的纹理
【注意】 在GL_NEAREST过滤模式中,环绕模式不 起作用,因为纹理贴图总是对齐到纹理贴图 中的一些特定的纹理单元 GL_CLAMP_TO_EDGE:简单地忽略边缘 的纹理采样,不把它们包括在平均值中 GL_CLAMP_TO_BORDER:在纹理坐标 在0.0到1.0的范围之外时只使用边界纹理单 元
2.4 纹理函数
glTexEnv*():可以使用纹理图像对物体表 面进行颜色调整,也可以把纹理图像颜色 与物体表面原先的颜色进行组合
void glTexEnv{if}(GLenum target, GLenum pname,TYPE param) void glTexEnv{if}v(GLenum target, GLenum pname,TYPE *param) 设置当前的纹理函数,target是GL_TEXTURE_ENV 或GL_TEXTURE_FILTER_CONTROL.
纹理环绕
纹理环绕:处理纹理坐标被指定在[0.0,1.0]之外的 情况 使用glTexParameter函数可以为每个坐标
(GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T, GL_TEXTURE_WRAP_R)分别设置环绕模式
四种环绕模式: GL_REPEAT,GL_CLAMP GL_CLAMP_TO_EDGE GL_CLAMP_TO_BORDER
纹理映射基本步骤
1)创建纹理对象,并为它指定一个纹理 2)确定这个纹理如何应用到每个像素上 3)启用纹理贴图功能 4)绘制场景,提供纹理坐标和几何图形坐标
第二节 OpenGL纹理映射 OpenGL纹理映射
指定纹理 控制纹理 纹理对象 纹理函数 分配纹理坐标
2.1 指定纹理
二维纹理定义函数:
第三节 多重纹理
多重纹理 存在一系列纹理单位,每个纹理单位执行单独的纹理 操作,并把结果传递给下一个纹理单位,直到所有纹理单 位的操作完成为止 能够实现一些高级的渲染技巧:光照效果,贴花,合成和 细节纹理等
例:多重纹理技术模拟的静态光照
多重纹理的步骤
1)对于每个纹理单位,建立纹理状态,包括纹理图 像,过滤器,纹理坐标生成和纹理矩阵等,使用 glActiveTexture()函数更改当前纹理单位 void glActiveTexture(GLenum texUnit) 选择可以由纹理函数进行修改的当前纹理单 位. texUnit是符号常量,形式为GL_TEXTUREi, 其中i的范围从0至k-1,k是纹理单位的最大数量
void glTexCoord{1234}{sifd}[v](TYPE coords) 设置当前纹理坐标,此后调用glVertex*()所产 生的顶点都赋予当前的纹理坐标 1)对于glTexCoord1*(),s设置为给定值,t,r设置为0, q设置为1 2)对于glTexCoord2*(),s,t设置为给定值,r设置为0, q设置为1 3)对于glTexCoord3*(),s,t,r设置为给定值,q设置为1 4)对于glTexCoord4*(),可以给定所有坐标
width——纹理图像的宽度 height——纹理图像的高度 border——边框的宽度
大小必须是(2的整数次方+2b),b是边框宽度
format——像素数据格式,可以是GL_COLOR_INDEX, GL_RGB,GL_GREEN,GL_BLUE,GL_RED,GL_ALPHA, GL_LUMINANCE,GL_LUMINANCE_ALPHA type——每个纹理单元值的数据类型,可以是GL_BYTE, GL_UNSIGNED_BYTE,GL_SHORT, GL_UNSIGNED_SHORT,GL_INT,GL_UNSIGNED_INT, GL_FLOAT,GL_BITMAP或其中一种像素包装类型 pixels——纹理像素数据,描述纹理图像本身和它的边界
GL_CLAMP:将纹理坐标大于1.0的设置为1.0, 小于0.0的设置为0.0
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_CLAMP) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_CLAMP)
glTexImage2D(GLenum target,GLint level, GLint internalFormat,GLsizei width, GLsizei height,GLint border, GLenum format,GLenum type, const GLvoid *pixels) target——指定的纹理目标,说明是几维纹理,在这里应为 GL_TEXTURE_2D level——细节层,如果提供了多种分辨率的纹理贴图,才使 用level参数,否则,设置为0 internalFormat——图像数据的内部格式,是一个从1到4的 整数,指出选择了RGBA中哪些分量用于 调整和混合
命名纹理对象
纹理对象的名称:用非0无符号整数表示 为了避免重命名,使用glGenTextures()函数 来提供未使用的纹理对象名称
void glGenTextures(GLsizei n,GLuint *textureNames) 在数组textureNames中返回n个当前未使用的值, 表示纹理对象的名称,返回值不一定使连续整数 textureNames中的名字被标记为已使用,但它 们只有在第一次被绑定时才获得纹理状态和维属性
2.3 纹理对象
纹理对象:用于存储纹理数据,以便随时 使用 是应用纹理最快的方法,能大幅度提高程 序的性能(因为使用一个原有的纹理对象比 使用glTexImage*D()函数重新载入一幅纹 理图像要快得多)
纹理对象使用步骤
(1)生成纹理名称 (2)把纹理对象绑定到纹理数据上,包括图像 数组和纹理属性 (3)绑定和重新绑定纹理对象,使它们的数据 当前可以用于渲染纹理模型 (4)清除纹理对象
基本过滤
纹理过滤:根据一个拉伸或收缩的纹理贴 图计算颜色片段的过程 使用glTexParameter函数可以设置: 放大过滤器(GL_TEXTURE_MAG_FILTER) 缩小过滤器(GL_TEXTURE_MIN_FILTER) (GL_TEXTURE_MIN_FILTER) 两种基本的纹理过滤方法: 最邻近过滤(GL_NEAREST) 线性过滤(GL_LINEAR)
多重纹理实例
�