纹理映射.

Slides:



Advertisements
Similar presentations
颈部肿块鉴别诊断 颈部肿块分类 炎症:急慢性;特异性非特异性感染 外伤:血肿、假性动脉瘤 肿瘤: 良恶性:良性多见 恶性:原发性、转移性; 畸形:血管瘤、囊肿.
Advertisements

头颈部影像诊断 第三军医大学西南医院放射科 陆明. 头颈部 眼 耳 鼻窦 鼻窦 咽 喉 腮腺 甲状腺和甲状旁腺.
第二十九章 医学原虫 一、教学目的 熟悉:溶组织内阿米巴、阴道毛滴虫的生活史、致病 性、实验诊断与防治原则;间日疟原虫的生活史。 应用:疟疾的发作、复发、再燃及凶险型疟疾的发生 机制和临床表现;疟原虫的实验诊断与防治原则。 了解 : 溶组织内阿米巴、阴道毛滴虫、间日疟原虫的 红內期形态。 二、教学方法.
颈椎病. 颈椎病也叫颈椎综合征,是颈椎的骨关节、 椎间盘及其周围软组织的损伤、退变,导致颈 神经根、椎动脉、颈交感神经甚至颈段脊髓受 到刺激或损害而出现的临床症候群,本病好发 年龄为 40—60 岁。好发人群为长期伏案工作的 白领、电脑操作者和机关工作人员。
集团公司火力发电厂热工自动控 制系统的投入情况和问题分析 东北所热自室. 自动控制系统是机组热工专业管理水 平和设备状态的集中体现,一台机组 的自动投入率和自动调节品质体现了 机组的整体水平。同时,自动控制效 果的优劣,也是机组节能降耗目标的 实现手段和基础。
群体性心因性反应 英德市疾病预防控制中心 孙蕊蕊 2010 年 11 月. 一、何谓群体性心因性反应  群体性心因性反应:又称群发性癔症,是一 种精神或心理因素引起的的一种在临床上只 有精神或神经系统症状为主,而没有任何可 以检出的器质性病变。意识不丧失,易受心 理暗示影响,使病情加重或减轻。
颈椎病.  概述  西医认识  病因病机  临床表现  针灸治疗  预防调护 主要内容.
第六十八章 腰腿痛和颈肩痛 长江大学临床医学院 外科教研室.  腰腿痛是指下腰、腰骼、骸骼、臀部等处的 疼痛,可伴有一侧或两侧下肢痛、马尾神经 症状。  颈肩痛是指颈、肩、肩脚等处疼痛,有时伴 有一侧或两侧上肢痛、颈脊髓损害症状。
1 不孕症 第一临床医学院妇科教研室 陶莉莉 2 目的要求 掌握不孕症定义和辨证论治 熟悉不孕症的病因病机 熟悉不孕症的西医病因及诊断检查步骤 熟悉不孕症辨病辨证相结合治疗的思路 和研究现状。
外科学绪论 赣南医学院附属医院 江柏青. 外科学范畴 外科学发展简史 怎样学习外科学 外科基本原则.
第 39 、 40 章 泌尿、男性生殖系统结核与肿 瘤病人的护理 一、肾结核. 肾结核的流行病学 1. 多见于 20 ~ 40 岁青壮年 2. 男女之比 2 ∶ 岁以下的儿童少见 4. 单侧肾结核占 90% 肾结核是由结核杆菌引起的慢性、进行性、破坏性病变。
第四节 关 格 第四节 关 格 医科大学附属中医医院外科教研室 高昌杰 病 名 关格首载于《内经》,或指脉象或言 病机。《伤寒论》将小便不通和吐逆 为主症者称为关格。巢元方等则以大 小便俱不通为关格。至南宋时期,张 锐综合仲景与巢氏之说,提出关格病 上有吐逆,下有大小便不通。近代对 本病的认识逐渐统一于仲景,故本书.
医科大学附属中医医院内科教研室. 一、腰痛定义 二、腰痛历史沿革 三、腰痛病因病机 四、腰痛范围 五、腰痛诊断 六、辨证要点 七、治疗原则 八、分型论治 九、其他疗法 十、复习思考题 十一、临床病案.
肺癌. 概述 w 定义  肺癌或称支气管肺癌,是由于正气内虚, 邪毒外侵,痰浊内聚,气滞血瘀, 阻结于 肺,肺失肃降所致,以咳嗽、咯血、胸 痛发热、气急为主要临床表现的肺部恶 性肿瘤。
抗菌药物合理用药指标 2011年11月24日.
膝关节半月板损伤.
医疗纠纷的 防范和处理 医务部 林星方.
“非工伤”、“重大疾病”、“住院津贴” 三项保障活动调整内容介绍 中国职工保险互助会北京办事处 2015年6月.
急性会厌炎 主讲人:卢冬莉.
骨与关节感染病人的护理 护理系外科教研室 岑晓勇.
上海交大医学院耳鼻咽喉科学系 新华教研室 向明亮
眩 晕 河南中医学院第一临床医学院 中医内科 李瑞红.
抗菌药物临床应用管理规定.
脊柱结核 三峡大学仁和医院 郑之和.
类风湿性关节炎的中医治疗 广州中医药大学第一附属医院 陈纪藩.
证券交易模拟 第2讲 交易规则与盘面术语.
台大體育概況及課程大綱 黃欽永 教授 台灣大學體育室.
第四讲:创新思维方式 一、创新思维的方法 二、禁锢创新的心理状态及其排除方法 主讲:黄伟雄教授.
子 宫 肌 瘤 中国医科大学附属盛京医院 栾南南.
颈肩腰腿痛疾病的预防 汕头市中医院 林创坚.
钞坑安置区项目简介.
计算机图形技术 余 莉
医疗纠纷原因分析和防范 医务科 张海良.
骨与关节结核 外科学教研室.
我的社區_觀塘 第三課.
圖為宜蘭縣五結鄉的冬山河親水公園,以「水」為主題,提供居民一個休閒的良好去處,是臺灣良好的親水遊憩典範。
法 师 带 观 修 互 动 答 题 法 师 答 疑. 法 师 带 观 修 互 动 答 题 法 师 答 疑.
荆门市农业水价综合改革 工作情况汇报 湖北省荆门市水务局 二0一六年九月.
急腹症相关CT解剖 天铁医院放射中心 王献忠.
紧抓PPP项目为招标代理机构 带来的转型发展机遇
腰椎間盤突出症.
脊柱结核.
Chapter 3. Visual Appearance 视觉外观
第十章 真实感图形绘制 基本概念 简单光照模型 基于简单光照模型的多边形绘制.
中 医 内 科 学 第二章 第五节 眩晕.
“落地”问题的探讨 计算思维能力培养 西安交通大学 2012 年全国高等院校计算机基础教育研究会学术年会 冯博琴 ”
消化系统测试病例 昆明医学院第一附属医院医学影像专业.
中 医 内 科 学 第三章 第三节 呕吐.
真实感图形 授课教师: 单位:.
员工合理化建议攻略 (2013版) 中心合理化建议项目组 王喜丰.
劳动关系 第十二讲 主讲教师:于米          学时:32.
第六章 三维真实感物体显示技术 虚拟现实(Virtual Reality,简称VR)技术是一种逼真的模拟人在自然环境中视觉、听觉、运动等行为的人机界面技术。其目的是:不仅能够在多维空间仿真建模,而且能够帮助人们获取知识和形成新的概念,Mark Green给出了一个简明的虚拟现实应用系统模型,如图6.1所示。
Chapter 2. The Graphics Rendering Pipeline 图形绘制流水线
OpenGL (7) 靜宜大學資工系 蔡奇偉 副教授
急腹症相关CT解剖 天铁医院放射中心 王献忠.
知识点7---矩阵初等变换的应用 1. 求矩阵的秩 2. 求矩阵的逆 3. 解矩阵方程.
OpenGL使用简介.
程式設計 博碩文化出版發行.
Introduction to OpenGL (2)
Chapter 5 Attributes of Output Primitives (图元的属性)
機械製造期末報告- 加工切削 組員:高德全4A 林威成4A 陳柏源4A
计算机图形学 Computer Graphics 高级图形绘制方法 —纹理及纹理映射.
本节内容 文件读写 视频提供:昆山爱达人信息技术有限公司.
重庆市第一0四中学 王继军.
集中保管有價證券 提存帳簿劃撥作業介紹 (發行人版)
已填完.
淺析「標槍運動」技術 指導老師 : 林新龍博士 研究生 : 侯曉寧.
纹理映射.
自由曲线与曲面(II) 计算机科学与技术.
其解亦可表为向量形式.
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) 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 );

重复纹理 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(); 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纹理的使用分三步: 将纹理装入内存,将纹理发送给OpenGL管道,给顶点指定纹理坐标。