3D图形学课纹理映射技术

2020-03-01 162浏览

  • 1.3D 游戏图形学 第六章 真实感图形绘制 —— 纹理映射技术 浙江理工大学 数字媒体技术系
  • 2.• 提出问题 – 真实感图形绘制: • 计算机图形输出设备上绘制出能够以假乱真的景象。 – 如何表现物体表面的丰富细节 ? •更精细的几何; •更精确的光照计算; 计算量太大 ! 可以采用纹理映射技术 ! 纹理映射技术是真实感图形的重要绘制技术之一 .
  • 3.“All it takes is for the rendered image to look right” —— Jim Blinn
  • 4.Example
  • 5.Example
  • 6.提要 • 纹理映射的基本理论 – 基本概念 – 实现纹理映射的基本过程 – 纹理几何映射关系处理 • 纹理映射的实现 – 纹理映射的 OpenGL 实现 • 高级纹理映射技术介绍 – 纹理优化处理技术 – 多层纹理映射 – 凸凹纹理映射 – 环境映照技术
  • 7.What is texture mapping? 纹理是指包含组成图像的所有像素信息的集
  • 8.“All it takes is for the rendered image to look right” —— Jim Blinn • 纹理贴图是一个用图像、函数或其它数据源来改变表 面在每一处的外观的过程。 • 例如,我们不必用精确的几何去 表现一块砖墙,而只需把一幅砖墙 的图像贴到一个多边形上。 • 除非观察者非常靠近墙,否则我 们并不会觉得缺少几何细节。 • 既节省了大量的造型工作量,也 节省了内存空间,加快了绘制速度 。
  • 9.基本原理
  • 10.如何映射 ? • 纹理映射方法 – – – – 纹理坐标系 (s,t) 物体表面的表示在 (u,v) 坐标系 投影平面上的像素显显 示在 显 (x,y) 笛卡儿坐标系 两种映射方法 • 将纹理模式映射至物体表面,然后再进行投影变换 映射至投影平面,称为纹理扫描 • 将投影平面的像素区域映射至物体表面,再映射 至纹理空间,称为像素次序扫描 纹理空间: (s,t) 数组坐标 M MT-1T 逆纹理映射变换 纹理映射变换 对象空间: (u,v) 表面参数 Mvp-1 逆观察投影变换 观察投影变换 图像空间: (x,y) 像素坐 标
  • 11.如何映射 ? • 纹理映射方法 – 纹理扫描 通常用显显 性函数 显 显 显显 行显显 理映射 显 显 显显显 ,显显显显 理空 显 显显 到物体空 显 显 显 显显 的 u  fu ( s, t )  au s  bu t  cu v  f v ( s, t )  av s  bvt  cv 不利因素:显显 中的 显 显显 理表面常常与像素 显 显 显 显 显 显 显 显显 界不匹配, 显显显显 需要显显 行像素分割计算。 显显显显显显显 因此像素次序扫描方法成为最常用的纹理映射方法 。
  • 12.如何映射 ? • 纹理映射方法 – 像素次序扫描 投影像素区 MT Mvp-1 -1 像素区 纹理数组 物体表面
  • 13.思考? • 图像与几何体的尺寸不一致怎么办 ? • 纹理重复怎么办?  几何物体本身有颜色怎么办 ?
  • 14.问题 1: 纹理图像缩放 ( 纹理采样方式 ) • 在硬件图形加速卡中,纹理图像的大小经常为 2m×2n ( 或者 2m×2m) 的纹素,其中 m 和 n 为非负整数。 • 但是几何尺寸不一定正好是 2 的倍数 , 另外几何尺寸 可能与纹理图像尺寸差别很大 ; • 若投影得到的象素数目比原始纹理大,则需要把纹 理图像放大 (magnification) ; • 若投影得到的象素数目比原始纹理小,则需要把纹 理图像缩小 (minification) ;
  • 15.纹理放大 块状效果明 显,质量差 锯齿状消失 一幅 32×64 的纹理应用 ,质量好 到一矩形,非常近看。 左图采用 最近邻域滤波 ,即对每个象素选择最 近的纹素。 右图采用最近四个纹素 的 双线性插值
  • 16.如 : 双线性插值 (Bi-lnear Interpolation)
  • 17.纹理缩小 • 当纹理图像缩小时,多个纹素可能覆盖一个 象素单元。为了得到每个象素正确的颜色, 应该综合考虑影响该象素的那些纹素。 棋盘格纹理多边形通过一行象素,显示多个纹素可影响单个象 素
  • 18.• 最近邻域法: – 选择在象素中心可见的纹素。但会引起严重的走样现象, 见上图。当这类表面相对视点移动时,走样现象更加明显 ,称为时间走样 (temporal aliasing) 。 • 双线性插值: – 效果仅比最近邻域法稍好,也会引起较严重的走样现象。 • Mipmap 方式: – 对纹理进行预处理,建立多个纹素覆盖单个象素的快速逼 近计算的数据结构。这样,一个采样点可以检索出一个或 多个纹素的效果。
  • 19.1. 点采样 (Nearest neighbor) 2. Mipmapping
  • 20.问题 2: 纹理重复方式 • wrap ortile:纹理图像在表面重复。例子:地上的大理 石贴图 •mirror:纹理图像在表面重复 , 但每隔一幅进行翻转 (flipped) 。这样在纹理的边界处,纹理可以保持连续。 • clamp : 把 [0,1) 范围之外的进行截断。截断到 [0,1) 内的 半个纹素。 • border : 参数范围在 [0,1) 之外的用单独定义的边界颜色 或把纹理的边作为边界。用于在表面上印花样,地形绘 制中相邻纹理的缝合。截断到 [0,1) 外的半个纹素。
  • 21.例子 repeat mirror clamp border
  • 22.问题 3: 纹理与背景的叠加融合 • Replace : 把原来表面的颜色替换为 纹理的颜色 • Decal( 印花 ) :与替换类似,但是若纹 理中包含 Alpha 值,则用它与表面的 颜色进行混合。 • Modulate( 调节 ) :把表面的颜色与纹 理颜色相乘 .
  • 23.提要 • 纹理映射的基本理论 – 基本概念 – 实现纹理映射的基本过程 – 纹理几何映射关系处理 • 纹理映射的实现 – 纹理映射的 OpenGL 实现 • 高级纹理映射技术介绍 – 纹理优化处理技术 – 多层纹理映射 – 凸凹纹理映射 – 环境映照技术
  • 24.OpenGL 纹理映射过程 • 定义纹理映射 void glTexImage1D(GLenum target, GLint level, GLint components, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *texels); void glTexImage2D(GLenum target, GLint level, GLint components, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *texels); void glTexImage3D(GLenum target, GLint level, GLint components, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *texels);
  • 25.• 启用纹理 glEnable(GL_TEXTURE_1D); glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_3D);
  • 26.• 在启用纹理之后,需要建立物体表面上的点与 纹理空间的对应关系。 • 在绘制基本图元时,在 glVertex 函数调用之 前调用 glTexCoord 函数明确指定当前顶点所 对应的纹理坐标。
  • 27.• 纹理获取 – 直接创建,利用函数直接设置各纹理像素点的 RGB 值 – 读取外部文件 载入位图: auxDIBImageLoad(LPCTSTR filename);
  • 28.• 对于这种超出纹理图范围的情况,可用 : – glTexParameter*(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S/T,GL _REPEAT/GL_CLAMP); – 选择: • GL_REPEAT :当纹理比表面小时重复使用纹理以填满每个点。 • GL_CLAMP :比 1 大的当作 1 ,比 0 小的当作 0 。 • 对纹理的缩放等 , OpenGL 提供了滤波函数 : – glTexParameter*(GL_TEXTURE_2D,GL_TEXTURE_MAG/MIN_FI LTER,GL_NEAREST/GL_LINEAR); 。 – 放大和缩小的处理参数 : • GL_NEAREST :取比较接近的那个像素。 • GL_LINEAR :以周围四个像素的平均值做为纹理。 • bilinear :二次插值,精度更高,但需要自己动手计算。
  • 29.提要 • 纹理映射的基本理论 – 基本概念 – 实现纹理映射的基本过程 – 纹理几何映射关系处理 • 纹理映射的实现 – 纹理映射的 OpenGL 实现 • 高级纹理映射技术介绍 – 纹理优化处理技术 – 多层纹理映射 – 凸凹纹理映射 – 环境映照技术
  • 30.• 高级纹理映射技术 – 纹理优化处理技术 • Mipmapping • Texture Caching • 纹理压缩 – 多层纹理映射 – 凸凹纹理映射 – 环境映照技术
  • 31.纹理优化处理技术
  • 32.1. Mipmapping 技术 -------- 根据不同的材质精度要求选择不同精度的纹理进 行贴图的技术,即根据需要更换纹理,避免图像的过度 放大或缩小 金 字 塔 结 构 Level 2 Level 1 Level 0 1/16 1/4 1 d轴
  • 33.• Mipmapping 是纹理反走样最受欢迎的方法。目 前,很多图形加速卡支持该功能 ; • 根据几何的大小 , 调整纹理的大小 , 以避免拉 伸和缩小 ; • 等比性地缩放 , 图片大小必须为 2 的 n 次。
  • 34.• image pyramid, precompute averaged versions Without MIP-mapping With MIP-mapping
  • 35.2. Texture Caching( 纹理缓 存) • 复杂的应用需要相当多的纹理 , 不一定把所 有的纹理都一次性送到显存 ; • 有多种纹理高速缓存技术 : – 在速度和内存中的纹理数目之间取得平衡。 例如:当贴了纹理的多边形离视点较远时, 可只载入需要的子纹理。
  • 36.使用纹理内存的一般原则 : • 尽量使用较小的纹理; • 尽量使相同的纹理多边形成组; • 采用 Tiling 或者 Mosaicing 技术:把一些小 纹理拼成一块大纹理,这样可以避免纹理的 切换,加快存取的速度。
  • 37.3. 纹理压缩 • 一个直接针对纹理内存和带宽的解决方法是固 定速率的纹理压缩 (fixed-rate texture compression) 。 • 通过硬件即时对压缩的纹理进行解压,所需的 纹理内存可减少,从而增加了有效 Cache 的大 小,同时减少了带宽需要。
  • 38.多重纹理绘制 • 图形学光照方程的各部分可以在不同的步骤分别计算,每个 步骤是对前一个步骤结果的修改 , 并最终得到一采样颜色。 • 多重绘制技术是指将图形绘制的每个步骤绘制出的中间结果 存成纹理 , 一层层地映射到几何物体上 , 这种技术称为多 重绘制技术 (multipass rendering) 。 • 多重绘制的基本思路是:每重绘制计算光照明方程的一部分 ,并采用 frame buffer 存贮中间结果。通过图像合成等 技术,可以计算得到任意复杂的光照方程。 • 有很多效果可通过多重绘制来得到的,如:运动模糊、平面 反射等等。 • 目标:用更多精致的表面光照方程。
  • 39.过程
  • 40.凹凸纹理贴图 (Bump Mapping)
  • 41.凹凸纹理贴图 (Bump Mapping) • 凹凸纹理贴图最早由 Blinn 于 1978 年提出,是一种模 拟不平表面 ( 凹凸、皱纹 、波浪起伏等 ) 的一种方 法。
  • 42.基本思想 • 凹凸纹理的基本思想是:用纹理去修改物体 的法向而不是颜色。 • 物体表面的几何法向保持不变,我们仅仅改 变光照明模型计算中的法向。
  • 43.凹凸纹理贴图 (Bump Mapping) • create illusion of complex geometry model
  • 44.• 凸凹纹理映射 – 由三张纹理映射图完成效果 : • 原始纹理图( 0 ),用来表示物体本来的表面效 果 • 凸凹纹理( 1 ),用来对物体表面法向进行修改 • 环境映射图( 2 )
  • 45.• 对于每个象素,我们把单位 化后的光矢量与凹凸纹理中 的法向进行点积。 Normal map • 由于点积正好是漫反射分量 ,因而使得结果呈现凹凸状 。 采用 Normal Map 得到的凹凸纹理贴图效果
  • 46.环境映照
  • 47.• cheap way to achieve reflective effect – generate image of surrounding – map to object as texture
  • 48.Sphere Mapping • 最早由 Williams 在 1983 年提出,是第一个商 用图形卡支持的 EM ( Environment Mappin g )方法。 • 纹理图像通过正投影观察一个纯反射球面的 外形来得到,故得到的纹理称为球面图 (sphere map) 。 • 将几何体参数化到一个球上 , 然后进行映射 。
  • 49.立方体环境映照 (Cubic Environment Mapping) • 立方体环境映照由 Greene 于 1986 年提出,该 方法速度快、适用性强,是图形硬件中最受欢 迎的方法。 • 立方体环境映照通过把摄像机置于立方体的中 心,然后把环境投影到立方体的面上。立方体 上的图像作为环境图。 • 在实用中,场景需要绘制 6 次(立方体的每个 面一次),摄像机置于立方体的中心,以 90 度的视角看立方体的面。
  • 50.Greene 环境映照示意图 左边的立方体展开为右边的环境图
  • 51.一幅典型的环境图
  • 52.例 子 Xbox 游戏的一幅静态图像, Project Gotham Racing 。 为了模拟车身上的动态反射效果,在车位置处逐帧 建立一立方体环境映照。
  • 53.采用环境映照的光照明 (Lighting Using Environment Mapping) • 环境映照的一个重要用途为生成镜面反射和折射。 我们前面讲过,因为 Gouraud Shading 只在顶点处计 算光照效果,所以会丢失高光。环境映照可以通过 纹理上的光照来克服该问题。通过该方法,我们可 以用固定的花费模拟任何数量光源的高光,而且光 源也可以不一定是点,可以是有大小和形状的。 Per-pixel 的镜面高 光 光照环境映照 整个周围场景的环境映照 。
  • 54.其他效果 环境的平面反射 加入 环境图凹凸纹 理
  • 55.水面反射天空的效果采用 环境图凹凸纹理技术
  • 56.The End!