纹理映射.

Slides:



Advertisements
Similar presentations
2 和 5 的倍数的特征 运动热身 怎样找一个数的倍数? 从小到大写出 2 的倍数( 10 个): 写出 5 的倍数( 6 个) 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 , 20 5 , 10 , 15 , 20 , 25 , 30.
Advertisements

一、 一阶线性微分方程及其解法 二、 一阶线性微分方程的简单应用 三、 小结及作业 §6.2 一阶线性微分方程.
第五节 全微分方程 一、全微分方程及其求法 二、积分因子法 三、一阶微分方程小结. 例如 所以是全微分方程. 定义 : 则 若有全微分形式 一、全微分方程及其求法.
第五节 函数的微分 一、微分的定义 二、微分的几何意义 三、基本初等函数的微分公式与微分运算 法则 四、微分形式不变性 五、微分在近似计算中的应用 六、小结.
2.8 函数的微分 1 微分的定义 2 微分的几何意义 3 微分公式与微分运算法则 4 微分在近似计算中的应用.
2.5 函数的微分 一、问题的提出 二、微分的定义 三、可微的条件 四、微分的几何意义 五、微分的求法 六、小结.
外科学绪论 赣南医学院附属医院 江柏青. 外科学范畴 外科学发展简史 怎样学习外科学 外科基本原则.
§3.4 空间直线的方程.
3.4 空间直线的方程.
一、二阶行列式的引入 用消元法解二元线性方程组. 一、二阶行列式的引入 用消元法解二元线性方程组.
眩 晕 河南中医学院第一临床医学院 中医内科 李瑞红.
第三章 数据类型和数据操作 对海量数据进行有效的处理、存储和管理 3.1 数据类型 数据源 数据量 数据结构
第5章 定积分及其应用 基本要求 5.1 定积分的概念与性质 5.2 微积分基本公式 5.3 定积分的换元积分法与分部积分法
第三节 格林公式及其应用(2) 一、曲线积分与路径无关的定义 二、曲线积分与路径无关的条件 三、二元函数的全微分的求积 四、小结.
§5 微分及其应用 一、微分的概念 实例:正方形金属薄片受热后面积的改变量..
2-7、函数的微分 教学要求 教学要点.
§5 微分及其应用 一、微分的概念 实例:正方形金属薄片受热后面积的改变量..
第十章 真实感图形绘制 基本概念 简单光照模型 基于简单光照模型的多边形绘制.
第十章 真实感图形绘制 基本概念 简单光照模型 基于简单光照模型的多边形绘制.
Introduction of Computer Graphics
真实感图形 授课教师: 单位:.
高级计算机图形学 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 Telephone:
第三章 多维随机变量及其分布 §2 边缘分布 边缘分布函数 边缘分布律 边缘概率密度.
第六章 三维真实感物体显示技术 虚拟现实(Virtual Reality,简称VR)技术是一种逼真的模拟人在自然环境中视觉、听觉、运动等行为的人机界面技术。其目的是:不仅能够在多维空间仿真建模,而且能够帮助人们获取知识和形成新的概念,Mark Green给出了一个简明的虚拟现实应用系统模型,如图6.1所示。
Hadoop I/O By ShiChaojie.
Chapter 2. The Graphics Rendering Pipeline 图形绘制流水线
OpenGL (7) 靜宜大學資工系 蔡奇偉 副教授
物体识别 3D建图 semantic mapping
绘制圆与多边形 椭圆形 绘制椭圆形的方法是 drawOval(x ,y , width , height), 绘制实心椭圆形的方法是
纹理映射.
Introduction to OpenGL (2)
高级计算机图形学 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 Telephone:
数学模型实验课(三) 插值与三维图形.
多媒体技术 中南大学信息科学与工程学院 黄东军.
第七章 操作符重载 胡昊 南京大学计算机系软件所.
2.1.2 空间中直线与直线 之间的位置关系.
工业机器人技术基础及应用 主讲人:顾老师
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第二十二章 曲面积分 §1 第一型曲面积分 §2 第二型曲面积分 §3 高斯公式与斯托克斯公式.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
OpenGL几何变换程序.
第三章 空间向量与立体几何 3.1 空间向量及其运算 3.1.5空间向量运算的 坐标表示.
计算机图形学 Computer Graphics 高级图形绘制方法 —纹理及纹理映射.
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第六章 Excel的应用 一、Excel的单元格与区域 1、单元格:H8, D7, IV26等 2、区域:H2..D8, HS98:IT77
九年级 上册 27.3 位似(第1课时).
复习: 若A(x1,y1,z1) , B(x2,y2,z2), 则 AB = OB - OA=(x2-x1 , y2-y1 , z2-z1)
iSIGHT 基本培训 使用 Excel的栅栏问题
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
_13简单的GDI绘图操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
概 率 统 计 主讲教师 叶宏 山东大学数学院.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
第二节 函数的极限 一、函数极限的定义 二、函数极限的性质 三、小结 思考题.
义务教育课程标准试验教科书九年级 下册 投影和视图 珠海市金海岸中学 杜家堡 电话:
直线的倾斜角与斜率.
4.6 图形的位似     观察思考:这两幅图片有什么特征? 都是有好几张相似图形组成,每个对应顶点都经过一点.
第六章 Excel的应用 五、EXCEL的数据库功能 1、Excel的数据库及其结构 2、Excel下的数据排序 (1)Excel的字段名行
图片与视频数字化. 图片与视频数字化 图片分类 根据图片的构成元素来分 位图: 由像素组成,计算机按顺序存储每个像素点 的颜色信息的保存方式获得的图片。 位图放大后会模糊失真,存储空间相对较大。 矢量图: 由图元组成,通过数学公式计算获得的图片。 放大后不会失真,占用空间小。
基于列存储的RDF数据管理 朱敏
第四节 向量的乘积 一、两向量的数量积 二、两向量的向量积.
第三章 从概率分布函数的抽样 (Sampling from Probability Distribution Functions)
1.2轴对称的性质 八 年 级 数 学 备 课 组.
第三节 数量积 向量积 混合积 一、向量的数量积 二、向量的向量积 三、向量的混合积 四、小结 思考题.
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
位似.
§4.5 最大公因式的矩阵求法( Ⅱ ).
其解亦可表为向量形式.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
第三章 图形的平移与旋转.
Presentation transcript:

纹理映射

概述 如何表现物体表面的细节? 如何表现复杂场景? 如何绘制物体更具有真实感? 采用纹理映射技术

纹理(Texture) 纹理,既包括通常意义上物体表面呈现凹凸不平的沟纹,同时也包括在物体的光滑表面上的彩色图案。 纹理种类 颜色纹理-物体表面的细小结构,它可以是光滑表面的花纹或图案 几何纹理-物体表面是粗糙的 (如桔子表面的皱纹),是基于物体表面的微观几何形状的表面纹理

纹理(Texture) 按照维度,纹理可分为一维、二维和三维 一维纹理,如曲线上颜色 二维纹理,如平面、区域上颜色细节 三维纹理也称为体纹理(voxel),常见应用在医学和地球科学领域的渲染,在医学应用中,三维纹理用于表示一系列的断层计算成像系统(CT)或核磁共振(MRI)图像

纹理映射(Texture Mapping) 将场景中对象的点与纹理图中的点对应起来,以便于使用简单的几何图形产生丰富逼真的视觉效果图象。 纹理映射是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。 纹理映射 + 纹理图像 场景中物体 场景中立方体

绘制流水线 GPU 应用 几何 光栅化 3D 2D 顶点 Model & View Transform 光栅 Interpolate vertex Shade fragment Resolve visibility Removal faces 片元 Lighting GPU Texture mapping Projection Clipping Screen mapping

纹理定义 以数组形式存储纹理数据,每一个元素称为纹素(texel),即纹理元素。这个数组可以为一个连续的二维矩形纹理图案 纹理空间 纹理一般定义在单位正方形区域(0≤s≤1, 0≤t≤1 ),称为纹理空间。s和t为纹理坐标 s t 假如,几何对象的齐次坐标为(x, y, z, w),则 观察、投影、裁剪坐标变换

函数纹理的定义 任何定义在纹理空间的函数为纹理函数。 通过纹理函数生成纹理图像。 例如: 为奇数 为偶数 其中,a,b为颜色值 void makeCheckImage() { for (int i = 0; i < checkImageHeight; i++) { for (int j = 0; j < checkImageWidth; j++) { c = (((i & 0x8) == 0) ^ ((j & 0x8)) == 0) * 255; checkImage[i][j][0] = (GLubyte)c; checkImage[i][j][1] = (GLubyte)c; checkImage[i][j][2] = (GLubyte)c; } }

函数纹理的定义 其中,a为[0,1]内随机变量, pu和qv为频率系数。 void makeCloth() { double p = 50, q = 100; for (double u = 0.0; u <= 1.0; u += 0.001) for (double v = 0.0; v <= 1.0; v += 0.001) double a = double(rand()) / RAND_MAX; double f = a*(cos(p*u) + cos(q*v)); int i = round(u*1000 ); int j = round(v*1000 ); checkImage[i][j][0] = (GLubyte)f * 255; checkImage[i][j][1] = (GLubyte) f * 255; checkImage[i][j][2] = (GLubyte) (f * 255) % 255; }

纹理映射方法 以OpenGL为例,纹理映射过程: 1. 创建纹理对象,并为它指定一个纹理。 2. 确定纹理如何应用到每个像素上。 3. 启用纹理贴图。 4. 绘制场景,提供纹理和几何坐标。

创建一个纹理对象 创建纹理的函数 glGenTextures(GLSize n, Gluint *textureNames); n为产生n个未使用的对象值,纹理索引 textureNames为纹理名字数组 例如: GLuint texName1; GLuint texName2; glGenTextures(1, &texName1); glGenTextures(2, &texName2); glEnable(GL_TEXTURE_2D);

图片纹理的定义 选定一个图片作为纹理,需要载入。其函数:

读图像文件 void readImage(char* fname, int m) { FILE* pfile = NULL; fopen_s(&pfile, fname, "rb"); if (pfile == 0) exit(0); //读取图像大小 fseek(pfile, 0x0012, SEEK_SET); fread(&image[m].imagewidth, sizeof(image[m].imagewidth), 1, pfile); fread(&image[m].imageheight, sizeof(image[m].imageheight), 1, pfile); //计算像素数据长度 image[m].pixellength = image[m].imagewidth * 3; while (image[m].pixellength % 4 != 0) image[m].pixellength++; image[m].pixellength *= image[m].imageheight; //读取像素数据 image[m].pixeldata = (GLubyte*)malloc(image[m].pixellength); if (image[m].pixeldata == 0) exit(0); fseek(pfile, 54, SEEK_SET); fread(image[m].pixeldata, image[m].pixellength, 1, pfile); //关闭文件 fclose(pfile); }

图片纹理的定义 void glTexImage2D( GLenum target, // GL_TEXTURE_2D GLint level, //如提供多种分辨率纹理图像,则使用级数,若一种level=0 GLint  components, //内部格式1-R; 2-RA;3-RGB;4-RGBA GLsizei width, //必须是2的整数次方 GLsizei height, GLint border, // 纹理边界宽度 GLenum format, // 纹理映射的格式 GLenum type, // 数据类型 const GLvoid *pixels ); //图片像素 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image[i].imagewidth, image[i].imageheight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, image[i].pixeldata);

纹理图案定义 GLubyte checkImage[64][64][4]; Void makeCheck() { int I, j, c; for (I = 0; I < 64; i++) { for (j = 0; j < 64; j++) { c = (((i&0x8)==0)^((j&0x8))==0)*255; checkImage[i][j][0] = (Glubyte) c; checkImage[i][j][1] = (Glubyte) c; checkImage[i][j][2] = (Glubyte) c; checkImage[i][j][3] = (Glubyte) 255;} } glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);

绑定纹理对象 将把数据存储到这个纹理对象中。 glBindTexture(Glenum target, Gluint glTexImage*) 将把数据存储到这个纹理对象中。 如,glBindTexture(GL_TEXTURE_2D, texName1);

确定纹理坐标 纹理是一个二维的数组。 虽然这个数组是二维的, 但是可以映射到非二维的对象上,如球体或者其他的 3D 对象模型上。 在纹理坐标系中, 左下角是 (0,0), 右上角是 (1,1). (0,0) (0,1) (1,0) (1,1) glTexCoord2f(s, t); 纹理映射时,纹理坐标按照依次(0,0), (1,0), (1,1), (0,1), 其中的四个坐标只是代表的向量,并不是真实的坐标。

确定纹理坐标 纹理是一个二维的数组。 虽然这个数组是二维的, 但是可以映射到非二维的对象上,如球体或者其他的 3D 对象模型上。 例如,立方体纹理映射 (0,0) (0,1) (1,0) + P0 P1 P2 P3 选取立方体表面P0、P1、P2三个顶点,及与其对应的纹理空间的s和t值(0,0)、(0,1)和(1,1)代入公式, 解得立方体表面任意点P表达为(s,t)参数形式:

确定纹理坐标 + glBegin(GL_QUADS); //画四边形 glTexCoord2f(0.0, 0.0);  glVertex3f(-1.0, 0.0, 0.0); //左下角 glTexCoord2f(0.0, 1.0);  glVertex3f(-1.0, 1.0, 0.0); //右下角 glTexCoord2f(1.0, 1.0);  glVertex3f(0.0, 1.0, 0.0); // 右上角 glTexCoord2f(1.0, 0.0);  glVertex3f(0.0, 0.0, 0.0); // 左上角 glEnd(); (0,0) (0,1) (1,0) + P0 P1 P2 P3

确定纹理坐标 glBegin(GL_TRIANGLES); glTexCoord2f(0.5f, 1.0f); glVertex3fv(vertices[0]); glTexCoord2f(0.0f, 0.0f); glVertex3fv(vertices[3]); glTexCoord2f(1.0f, 0.0f); glVertex3fv(vertices[4]); glEnd(); (0,1.0) (0.5,1.0) (1.0,1.0) (0,0) (1.0,0)

纹理坐标 当纹理坐标s或t的取值位于[0,1]之外时,如何处理? 有两种处理方法: 重复(repeat) 截取(clamp) glTexParameter{if}(GLenum target, // 纹理目标1D,2D,3D… GLenum pname, // 设置放大器和缩小器 T param );

重复纹理 glBegin(GL_QUADS); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0f, 1.0f); glEnd(); t (0,0) (1,1) s

纹理坐标 glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, -1.0f); glTexCoord2f(2.0f, 0.0f); glVertex2f(1.0f, -1.0f); glTexCoord2f(2.0f, 2.0f); glVertex2f(1.0f, 1.0f); glTexCoord2f(0.0f, 2.0f); glVertex2f(-1.0f, 1.0f); glEnd();

截取纹理 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, -1.0f); glTexCoord2f(2.0f, 0.0f); glVertex2f(1.0f, -1.0f); glTexCoord2f(2.0f, 2.0f); glVertex2f(1.0f, 1.0f); glTexCoord2f(0.0f, 2.0f); glVertex2f(-1.0f, 1.0f); glEnd(); 使用取自边界的纹理单元

纹理过滤 将纹理映射到多边形上, 实际上是将纹理的图像数据空间映射到帧缓冲图像空间上。 当把纹理坐标映射到纹素数组时,正好得到对应纹素的中心位置的情况很少出现。纹理图像被映射到多边形上可能会造成失真。 解决方法: 点采样(Point sampling)-从纹素数组中取这样一个纹素,该纹素的位置最佳逼近通过光栅化模块计算输出的纹理坐标。也叫做nearest filtering 这是将最接近像素中心的那个纹理单元进行放大或缩小,用点采样容易产生走样误差。

纹理过滤 线性滤波方法(linear filtering) –对靠近像素中心的一块2X2纹理单元取加权平均值,并把该值作为纹理坐标映射到纹素数组时的纹素值。 这种方法计算量要比点采样大,但效果好。 glTexParameter{if}(GLenum target, // 纹理目标1D,2D,3D… GLenum pname, // 设置放大器和缩小过滤器 T param //采样方式 ); //线性过滤 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //点采样的纹理单元放大或缩小 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

使用纹理 开启纹理映射 glEnable(GL_TEXTURE_2D); 设置贴图纹理的函数-纹理图像与物体颜色的组合 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); OpenGL纹理的使用分三步: 1) 将纹理装入内存; 2)将纹理发送给OpenGL管道; 3)给顶点指定纹理坐标。