Download presentation
Presentation is loading. Please wait.
1
高级计算机图形学 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 Telephone:0551-3603484
2018/9/19 高级计算机图形学 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 Telephone: Homepage: 中国科学技术大学 视觉计算与可视化实验室
2
第八章 离散技术 离散数据最重要的用途之一就是表 面绘制。 8.6 映射方法 8.7 纹理映射 8.8 OpenGL中的纹理映射
计算机图形学 2018/9/19 第八章 离散技术 离散数据最重要的用途之一就是表 面绘制。 8.6 映射方法 8.7 纹理映射 8.8 OpenGL中的纹理映射 8.9 纹理生成 1.计算机图形就是计算机生成的图片.
3
8.6 映射方法 图形显示卡可以每秒钟显示多达一千万个多边形,但这个速度仍不能满足模拟许多自然现象和天然物质的要求: 云 草 地貌 树皮
计算机图形学 2018/9/19 8.6 映射方法 图形显示卡可以每秒钟显示多达一千万个多边形,但这个速度仍不能满足模拟许多自然现象和天然物质的要求: 云 草 地貌 树皮 毛发 水波与火焰 1.计算机图形就是计算机生成的图片. 越来越复杂的模型不是唯一的解决方法! 3
4
8.6 映射方法 例:橙子的建模 用橙色的球表示橙子太简单。 用更复杂形状代替球没有表示出表面的特性。
计算机图形学 2018/9/19 8.6 映射方法 例:橙子的建模 用橙色的球表示橙子太简单。 用更复杂形状代替球没有表示出表面的特性。 为了模拟所有的微凹,需要相当多的多边形。 可以将真实橙子的照片“粘贴”到简单的几何模型上。 以上过程就是纹理映射,结果可能仍然不令人满意, 因为所得曲面是光滑的,需要改变局部形状,可以采用 凹凸映射。 1.计算机图形就是计算机生成的图片. 4
5
8.6 映射方法 三种映射方法 纹理映射利用图像填充多边形。 环境映射(反射映射)利用环境的图像进行纹理映射。 可以模拟高度镜面曲面。
计算机图形学 2018/9/19 8.6 映射方法 三种映射方法 纹理映射利用图像填充多边形。 环境映射(反射映射)利用环境的图像进行纹理映射。 可以模拟高度镜面曲面。 凹凸映射在生成显示结果的过程中可以改变法向量。 1.计算机图形就是计算机生成的图片. 5
6
8.6 映射方法 纹理映射的图案 具有固定样式的图案。 经常用于填充多边形的规则图案。 通过过程纹理生成的图案。
计算机图形学 2018/9/19 8.6 映射方法 纹理映射的图案 具有固定样式的图案。 经常用于填充多边形的规则图案。 通过过程纹理生成的图案。 通过数字化处理后得到的图像。 1.计算机图形就是计算机生成的图片. 6
7
计算机图形学 2018/9/19 8.6 映射方法 纹理映射 1.计算机图形就是计算机生成的图片. 环境映射 凹凸映射 7
8
8.6 映射方法 三种映射的共同点 作为片元处理的一部分。 改变单个片元的明暗值。 都与存储为一维、二维或三维数字图像的贴图有关。
计算机图形学 2018/9/19 8.6 映射方法 三种映射的共同点 作为片元处理的一部分。 改变单个片元的明暗值。 都与存储为一维、二维或三维数字图像的贴图有关。 保持低的几何复杂性,但能产生复杂几何的视觉效果。 都可能产生走样误差。 1.计算机图形就是计算机生成的图片. 8
9
8.6 映射方法 映射技术是在绘制流水线的最后阶段实现的,非常有效,这样可以减少了许多不必要的映 射。 9 计算机图形学 2018/9/19
8.6 映射方法 映射技术是在绘制流水线的最后阶段实现的,非常有效,这样可以减少了许多不必要的映 射。 1.计算机图形就是计算机生成的图片. 9
10
第八章 离散技术 8.6 映射方法 8.7 纹理映射 8.8 OpenGL中的纹理映射 8.9 纹理生成 10 计算机图形学
2018/9/19 第八章 离散技术 8.6 映射方法 8.7 纹理映射 8.8 OpenGL中的纹理映射 8.9 纹理生成 1.计算机图形就是计算机生成的图片. 10
11
8.7 纹理映射 以数组形式存储在处理器内存里的二维图像称为纹理, 此时数组元素称为纹素(texel),可以由应用程序生成,
计算机图形学 2018/9/19 8.7 纹理映射 以数组形式存储在处理器内存里的二维图像称为纹理, 此时数组元素称为纹素(texel),可以由应用程序生成, 也可以将照片扫描输入。 把离散数组看成一个连续的二维矩形区域纹理图案 T(s,t),独立变量s和t是纹理坐标一般把纹理坐标缩放到 [0,1]区间。 1.计算机图形就是计算机生成的图片. 11
12
计算机图形学 2018/9/19 8.7 纹理映射 把图像映射到曲面上是一个非常复杂的 任务。 1.计算机图形就是计算机生成的图片. 12
13
8.7 纹理映射 涉及到的坐标系 参数坐标系可以用来建立曲线、曲面。 纹理坐标系用来识别要被映射的图像上的点。
计算机图形学 2018/9/19 8.7 纹理映射 涉及到的坐标系 参数坐标系可以用来建立曲线、曲面。 纹理坐标系用来识别要被映射的图像上的点。 世界坐标系从概念上说,就是映射发生的地方。 屏幕坐标系最终图像生成的地方。 1.计算机图形就是计算机生成的图片. 13
14
计算机图形学 2018/9/19 8.7 纹理映射 纹理映射框架 1.计算机图形就是计算机生成的图片. 14
15
8.7 纹理映射 映射函数 考虑从纹理坐标到曲面上一点的映射。 直观地看,需要如下函数 x=x(s,t) y=y(s,t) z=z(s,t)
计算机图形学 2018/9/19 8.7 纹理映射 映射函数 考虑从纹理坐标到曲面上一点的映射。 直观地看,需要如下函数 x=x(s,t) y=y(s,t) z=z(s,t) w=w(s,t) 实际采用的是间接方法。 1.计算机图形就是计算机生成的图片. 15
16
8.7 纹理映射 逆映射 给定对象上的一个点,我们想知道它对应 于纹理中的哪个点。 此时需要如下形式的映射 s = s(x,y,z,w)
计算机图形学 2018/9/19 8.7 纹理映射 逆映射 给定对象上的一个点,我们想知道它对应 于纹理中的哪个点。 此时需要如下形式的映射 s = s(x,y,z,w) t = t(x,y,z,w) 这样的函数一般是很难求出来的。 1.计算机图形就是计算机生成的图片. 16
17
8.7 纹理映射 实际困难 假设要计算中心在(xs, ys)的一个矩形像素的颜色。 中心点对应于对象上的点(x,y,z) 。
计算机图形学 2018/9/19 8.7 纹理映射 实际困难 假设要计算中心在(xs, ys)的一个矩形像素的颜色。 中心点对应于对象上的点(x,y,z) 。 如果对象是弯曲的,那么矩形像素的原像是一个曲 边四边形。 这个曲边四边形在纹理上的原像才是对当前矩形像 素的颜色有贡献的纹理元素。 1.计算机图形就是计算机生成的图片. 17
18
8.7 纹理映射 纹理坐标到屏幕坐标的映射 xs=xs(s,t) ys=ys(s,t) (xs,ys)表示颜色缓存中的某个位置。 18
计算机图形学 2018/9/19 8.7 纹理映射 纹理坐标到屏幕坐标的映射 xs=xs(s,t) ys=ys(s,t) (xs,ys)表示颜色缓存中的某个位置。 1.计算机图形就是计算机生成的图片. 18
19
计算机图形学 2018/9/19 8.7 纹理映射 走样现象 1.计算机图形就是计算机生成的图片. 19
20
8.7 纹理映射 用在纹理原像上对应区域的明暗效果的平均值赋给 当前像素很难实现,也不是完美的。
计算机图形学 2018/9/19 8.7 纹理映射 用在纹理原像上对应区域的明暗效果的平均值赋给 当前像素很难实现,也不是完美的。 右图经上述处理后也得不到所需要的结果,但这个 问题来自于低分辨率的局限。 对于规则纹理,这种效果非常明显。 1.计算机图形就是计算机生成的图片. 20
21
8.7 纹理映射 映射的确定 考虑由参数方程定义的曲面 p(u,v)=(x(u,v),y(u,v),z(u,v))。
计算机图形学 2018/9/19 8.7 纹理映射 映射的确定 考虑由参数方程定义的曲面 p(u,v)=(x(u,v),y(u,v),z(u,v))。 通常采用如下形式从纹理元素对应到曲面上的 点 u = as + bt + c, v = ds + et + f, 只要ae ≠bd, 上述映射是可逆的。 1.计算机图形就是计算机生成的图片. 21
22
8.7 纹理映射 没有考虑曲面的弯曲为了填充曲面,纹理在 不同方向进行了不同拉伸。 22 计算机图形学 2018/9/19
8.7 纹理映射 没有考虑曲面的弯曲为了填充曲面,纹理在 不同方向进行了不同拉伸。 1.计算机图形就是计算机生成的图片. 22
23
8.7 纹理映射 两步映射 首先把纹理映射到一个简单的中间曲面上 例如:映射到圆柱上 然后从中间对象到实际对象的映射。 23 计算机图形学
2018/9/19 8.7 纹理映射 两步映射 首先把纹理映射到一个简单的中间曲面上 例如:映射到圆柱上 然后从中间对象到实际对象的映射。 1.计算机图形就是计算机生成的图片. 23
24
8.7 纹理映射 圆柱映射 高为h,半径为r圆柱的参数方程是 映射函数: 从纹理坐标到圆柱面上没有变形。 适合于构造与无底的圆柱面拓朴同构
计算机图形学 2018/9/19 8.7 纹理映射 圆柱映射 高为h,半径为r圆柱的参数方程是 x = r cos(2πu) y = r sin(2πu) , 0 ≤ u,v≤ 1 z = v/h 映射函数: s = u t = v 从纹理坐标到圆柱面上没有变形。 适合于构造与无底的圆柱面拓朴同构 的曲面上的纹理。 1.计算机图形就是计算机生成的图片. 24
25
计算机图形学 2018/9/19 8.7 纹理映射 1.计算机图形就是计算机生成的图片. 25
26
计算机图形学 2018/9/19 8.7 纹理映射 1.计算机图形就是计算机生成的图片. 26
27
8.7 纹理映射 球面映射 半径为r的球的参数方程 类似于地图绘制中的映射肯定有变形。 常用在环境映射中。 x = r cos(2πu)
计算机图形学 2018/9/19 8.7 纹理映射 球面映射 半径为r的球的参数方程 x = r cos(2πu) y = r sin(2πu)cos(2πv), 0 ≤ u,v≤ 1 z = r sin(2πu)sin(2πv) 类似于地图绘制中的映射肯定有变形。 常用在环境映射中。 1.计算机图形就是计算机生成的图片. 27
28
8.7 纹理映射 立方体映射适合应用于正交投影中,也用 在环境映射中。 28 计算机图形学 2018/9/19
8.7 纹理映射 立方体映射适合应用于正交投影中,也用 在环境映射中。 1.计算机图形就是计算机生成的图片. 28
29
第八章 离散技术 8.6 映射方法 8.7 纹理映射 8.8 OpenGL中的纹理映射 8.9 纹理生成 29 计算机图形学
2018/9/19 第八章 离散技术 8.6 映射方法 8.7 纹理映射 8.8 OpenGL中的纹理映射 8.9 纹理生成 1.计算机图形就是计算机生成的图片. 29
30
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 1.计算机图形就是计算机生成的图片. 30
31
8.8 OpenGL中的纹理映射 应用纹理步骤如下: 指定纹理 读入或生成图像 给每个顶点赋纹理坐标。 由应用程序建立适当的映射函数
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 应用纹理步骤如下: 指定纹理 读入或生成图像 赋给纹理 激活纹理映射功能 给每个顶点赋纹理坐标。 由应用程序建立适当的映射函数 参数环绕(wrapping)、滤波(filtering) 1.计算机图形就是计算机生成的图片. 31
32
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 纹理映射 1.计算机图形就是计算机生成的图片. 32
33
8.8 OpenGL中的纹理映射 纹理映射示例 纹理(下方)是 256 ×256 的图像, 它被映射到一个矩 形上,经透视投影
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 纹理映射示例 纹理(下方)是 256 ×256 的图像, 它被映射到一个矩 形上,经透视投影 后的结果显示在上 方。 1.计算机图形就是计算机生成的图片. 33
34
8.8 OpenGL中的纹理映射 纹理映射与OpenGL流水线 图像与几何对象分别经过不同的流水线,在
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 纹理映射与OpenGL流水线 图像与几何对象分别经过不同的流水线,在 片段处理时合二为一,“复杂的”纹理并不影响几 何的复杂性。 1.计算机图形就是计算机生成的图片. 34
35
8.8 OpenGL中的纹理映射 指定纹理图像 利用CPU内存中的纹理元素数组定义纹理图像
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 指定纹理图像 利用CPU内存中的纹理元素数组定义纹理图像 GLubyte my_texels[512][512]; 定义纹理图像所用的像素图 扫描图像 由应用程序代码创建 激活纹理映射 glEnable(GL_TEXTURE_2D); 1.计算机图形就是计算机生成的图片. 35
36
8.8 OpenGL中的纹理映射 glTexImage2D(target,level,iformat,w,h,
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 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:指向纹素数组的指针,描述纹理图像及边框。 1.计算机图形就是计算机生成的图片. 36
37
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 转化纹理图像 glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,512,512,0, GL_RGB,GL_UNSIGNED_BYTE,my_texels); OpenGL需要纹理的尺寸(不包括可选的边框宽度)为2的幂次 (OpenGL2.0以上无此限制),如果不是2的幂次,可用下述函数进行转化: int gluScaleImage(GLenum format, GLint widthin, GLint heightin,GLenum typein, const void *datain, GLint widthout, GLint heightout, GLenum typeout, void *dataout); datain源图像 dataout目标图像 当放缩时图像被插值和滤波 1.计算机图形就是计算机生成的图片. 37
38
8.8 OpenGL中的纹理映射 映射纹理 基于参数纹理坐标,是状态量,内部表示为四维
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 映射纹理 基于参数纹理坐标,是状态量,内部表示为四维 (s,t,r,q)。取值于[0,1],维数小于4时,默认有t=r=0, q=1, glTexCoord*()指定每个顶点对应的纹理坐标。 1.计算机图形就是计算机生成的图片. 38
39
8.8 OpenGL中的纹理映射 典型代码 glBegin(GL_POLYGON);
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 典型代码 glBegin(GL_POLYGON); glColor3f(r0, g0, b0); // if no shading used glNormal3f(u0, v0, w0); // if shading used glTexCoord2f(s0, t0); glVertex3f(x0, y0, z0); glColor3f(r1, g1, b1); glNormal3f(u1, v1, w1); glTexCoord2f(s1, t1); glVertex3f(x1, y1, z1); . glEnd(); 1.计算机图形就是计算机生成的图片. 39
40
8.8 OpenGL中的纹理映射 OpenGL应用双线性插值从给定的纹理坐标中 求出适当的纹素。 可以只应用纹理的一部分方法是只应用纹理
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 OpenGL应用双线性插值从给定的纹理坐标中 求出适当的纹素。 可以只应用纹理的一部分方法是只应用纹理 坐标的一部分,如最大纹理坐标为(0.5,0.5)。 1.计算机图形就是计算机生成的图片. 40
41
8.8 OpenGL中的纹理映射 对于四边形,从纹理坐标到顶点的对应是比较 直接的。 对于一般的多边形,程序员必须决定如何给顶
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 对于四边形,从纹理坐标到顶点的对应是比较 直接的。 对于一般的多边形,程序员必须决定如何给顶 点赋纹理坐标可能会出现变形。 1.计算机图形就是计算机生成的图片. 41
42
8.8 OpenGL中的纹理映射 OpenGL中有许多参数来确定纹理的应用方式wrapping。
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 OpenGL中有许多参数来确定纹理的应用方式wrapping。 参数确定当s、t的值超出[0,1]区间后的处理方法。 filter模式允许用区域平均方法来代替点采样方法。 mimmapping技术使得能以不同的分辨率应用纹理 环境参数确定纹理映射与明暗处理的交互作用。 1.计算机图形就是计算机生成的图片. 42
43
8.8 OpenGL中的纹理映射 Wrapping模式 钳位(截断)模式: 若s,t>1就取1,若s,t<0就取0
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 Wrapping模式 钳位(截断)模式: 若s,t>1就取1,若s,t<0就取0 重复:应用s,t模1的值 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP) GL_TEXTURE_WRAP_T, GL_REPEAT) 1.计算机图形就是计算机生成的图片. 43
44
8.8 OpenGL中的纹理映射 纹理的放大和缩小 放大:多个像素覆盖一个纹素 缩小:多个纹素覆盖一个像素 44 计算机图形学
2018/9/19 8.8 OpenGL中的纹理映射 纹理的放大和缩小 放大:多个像素覆盖一个纹素 缩小:多个纹素覆盖一个像素 1.计算机图形就是计算机生成的图片. 44
45
8.8 OpenGL中的纹理映射 点采样:最近纹素的纹理值。 线性滤波:最近点邻域(2 x 2)纹素加权平均的纹理值。 45 计算机图形学
2018/9/19 8.8 OpenGL中的纹理映射 点采样:最近纹素的纹理值。 线性滤波:最近点邻域(2 x 2)纹素加权平均的纹理值。 1.计算机图形就是计算机生成的图片. 45
46
8.8 OpenGL中的纹理映射 滤波模式的指定 glTexParameteri(target, type, mode)
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 滤波模式的指定 glTexParameteri(target, type, mode) glTexParameteri(GL_TEXTURE_2D, GL_TEXURE_MAG_FILTER, GL_NEAREST); GL_TEXURE_MIN_FILTER, GL_LINEAR); 线性滤波需要一个额外的纹素边框来在边界 处进行滤波,即border = 1。 1.计算机图形就是计算机生成的图片. 46
47
8.8 OpenGL中的纹理映射 Mipmap对纹理位图进行预先滤波,降低分辨率。 可以减小对于非常小的要加纹理的对象的插值误差。
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 Mipmap对纹理位图进行预先滤波,降低分辨率。 可以减小对于非常小的要加纹理的对象的插值误差。 在纹理定义时声明mipmap的层次, level=0,1,… glTexImage2D( GL_TEXTURE_2D, level, width, height,… ) 1.计算机图形就是计算机生成的图片. 47
48
8.8 OpenGL中的纹理映射 GLubyte image0[64][64][3]; GLubyte image1[32][32][3];
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 GLubyte image0[64][64][3]; GLubyte image1[32][32][3]; … GLubyte image5[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); 1.计算机图形就是计算机生成的图片. 48
49
8.8 OpenGL中的纹理映射 有无mipmap的对比 无mipmap 有mipmap 49 计算机图形学 2018/9/19
1.计算机图形就是计算机生成的图片. 无mipmap 有mipmap 49
50
8.8 OpenGL中的纹理映射 自动生成mipmap GLU中提供了mipmap建立界面,可以从给定图 像建立起所有的mipmap纹理
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 自动生成mipmap GLU中提供了mipmap建立界面,可以从给定图 像建立起所有的mipmap纹理 gluBuild2DMipmaps(…) 缩小滤波器参数: GL_NEAREST_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR 1.计算机图形就是计算机生成的图片. 50
51
8.8 OpenGL中的纹理映射 示例 线性滤波 点采样 mipmapped 后的点取样 mipmapped 的线性滤波 51 计算机图形学
2018/9/19 8.8 OpenGL中的纹理映射 示例 线性滤波 点采样 mipmapped 后的点取样 1.计算机图形就是计算机生成的图片. mipmapped 的线性滤波 51
52
8.8 OpenGL中的纹理映射 控制纹素和片段颜色如何融合 glTexEnv{fi}[v](GL_TEXTURE_ENV,
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 控制纹素和片段颜色如何融合 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设置融合颜色 1.计算机图形就是计算机生成的图片. 52
53
8.8 OpenGL中的纹理映射 透视校正提示 纹理坐标与颜色插值要么是关于屏幕空间线性确定的, 或者要应用深度/透视值(较慢) 。
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 透视校正提示 纹理坐标与颜色插值要么是关于屏幕空间线性确定的, 或者要应用深度/透视值(较慢) 。 在多边形边界上,走样现象非常明显。 glHint(GL_PERSPECTIVE_CORRECTION_HINT, hint) 其中hint可取值 GL_DONT_CARE, GL_NICEST, GL_FASTEST 1.计算机图形就是计算机生成的图片. 53
54
8.8 OpenGL中的纹理映射 自动生成纹理坐标 OpenGL能自动生成纹理坐标coord: 纹理坐标,
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 自动生成纹理坐标 OpenGL能自动生成纹理坐标coord: 纹理坐标, 可取GL_S, GL_T, GL_R, 或GL_Q pname: 纹理坐标的生成函数,取 GL_TEXTURE_GEN_MODE GL_OBJECT_PLANE, GL_EYE_PLANE param:当pname为 GL_TEXTURE_GEN_MODE时, 取GL_OBJECT_LINEAR GL_EYE_LINEAR GL_SPHERE_MAP:用于环境映射 否则应为数组,由纹理生成平面的系数组成 1.计算机图形就是计算机生成的图片. 54
55
8.8 OpenGL中的纹理映射 自动生成纹理坐标(续)
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 自动生成纹理坐标(续) 指定平面a x + b y + c z + d w = 0根据顶点(x,y,z,w)到 平面的距离生成纹理坐标(s,t),由于ax+by+cz+dw与该距离成 比例,有 s = asx + bsy + csz + dsw t = atx + bty + ctz + dtw GLfloat planes[]={0.5,0.0,0.0,0.5}; /* s=x/2+1/2 */ GLfloat planes[]={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); 1.计算机图形就是计算机生成的图片. 55
56
8.8 OpenGL中的纹理映射 纹理对象 纹理也是状态的一部分,每类纹理(指1D,2D,3D)
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 纹理对象 纹理也是状态的一部分,每类纹理(指1D,2D,3D) 只有一个当前纹理,如果不同的对象具有不同的纹理, 那么OpenGL需要从处理器内存向纹理内存传送大量 数据。 最新版本的OpenGL提供了纹理对象功能每个纹理 对象是一个图像。 纹理内存可以保存多个纹理对象。 1.计算机图形就是计算机生成的图片. 56
57
8.8 OpenGL中的纹理映射 产生n个未使用的纹理对象名称。 检查一个纹理名称是否被使用。
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 产生n个未使用的纹理对象名称。 void glGenTextures(GLsizei n, GLuint *textureNames); 检查一个纹理名称是否被使用。 GLboolean glIsTexture(GLuint textureName); 创建或切换纹理对象,target为GL_TEXTURE_2D等。 void glBindTexture(GLenum target, GLuint textureName); 删除纹理对象。 void glDeleteTextures(GLsizei n, const GLuint *textureNames); 1.计算机图形就是计算机生成的图片. 57
58
8.8 OpenGL中的纹理映射 纹理映射过程 应用纹理框架 在纹理对象中指定纹理 设置纹理滤波方式 设置纹理函数 设置纹理的wrap模式
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 纹理映射过程 应用纹理框架 在纹理对象中指定纹理 设置纹理滤波方式 设置纹理函数 设置纹理的wrap模式 设置可选的透视校正提示 绑定纹理对象 激活纹理映射功能 为每个顶点指定纹理坐标 纹理坐标可以自动生成 1.计算机图形就是计算机生成的图片. 58
59
8.8 OpenGL中的纹理映射 多重纹理 通常一个几何对象上只有一个纹理,有许多渲 染效果需要多次应用纹理。
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 多重纹理 通常一个几何对象上只有一个纹理,有许多渲 染效果需要多次应用纹理。 例:已有纹理的表面上有其它物体的阴影,此时需要给 阴影加上纹理。 多重纹理的工作流程 1.计算机图形就是计算机生成的图片. 59
60
8.8 OpenGL中的纹理映射 初始化时,定义了两个纹理对象object0和object1
计算机图形学 2018/9/19 8.8 OpenGL中的纹理映射 初始化时,定义了两个纹理对象object0和object1 glActiveTexture(GL_TEXTURE0); /* unit 0 */ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, object0); glTexEnvironment(…); /* how to apply texture 0 */ glActiveTexture(GL_TEXTURE1); /* unit 1 */ glBindTexture(GL_TEXTURE_2D, object1); glTexEnvironment(…); /* how to apply texture 1 */ 每个纹理单元使用不同的纹理坐标 GLfloat point[3], s, t, ss, tt; glMultiTexCoord2f(GL_TEXTURE0, s, t); glMultiTexCoord2f(GL_TEXTURE1, ss, tt); glVertex3fv(point); 1.计算机图形就是计算机生成的图片. 60
61
第八章 离散技术 8.6 映射方法 8.7 纹理映射 8.8 OpenGL中的纹理映射 8.9 纹理生成 61 计算机图形学
2018/9/19 第八章 离散技术 8.6 映射方法 8.7 纹理映射 8.8 OpenGL中的纹理映射 8.9 纹理生成 1.计算机图形就是计算机生成的图片. 61
62
8.9 纹理生成 纹理的用处 不用生成大量的几何对象就可以为对象表面提供 复杂的特征信息。 高端图形系统可以实时地处理二维纹理映射。
计算机图形学 2018/9/19 8.9 纹理生成 纹理的用处 不用生成大量的几何对象就可以为对象表面提供 复杂的特征信息。 高端图形系统可以实时地处理二维纹理映射。 GPU中配有大量的纹理内存 纹理图案生成 二维纹理的缺陷 三维纹理 1.计算机图形就是计算机生成的图片. 62
63
第八章 离散技术 8.6 映射方法 8.7 纹理映射 8.8 OpenGL中的纹理映射 8.9 纹理生成 63 计算机图形学
2018/9/19 第八章 离散技术 8.6 映射方法 8.7 纹理映射 8.8 OpenGL中的纹理映射 8.9 纹理生成 1.计算机图形就是计算机生成的图片. 63
Similar presentations