slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
高级纹理映射 PowerPoint Presentation
Download Presentation
高级纹理映射

Loading in 2 Seconds...

play fullscreen
1 / 89

高级纹理映射 - PowerPoint PPT Presentation


  • 330 Views
  • Uploaded on

高级纹理映射. 本次课程的主要内容. 高级纹理映射 OGRE 中的材质和纹理映射. 纹理映射( texture mapping ). 纹理映射的基本原理 凹凸纹理映射 (bump mapping) 位移映射 (displacement mapping) 环境纹理映射 (environment mapping) 基于光照映射的快速绘制 (light mapping) 高级纹理映射技术总结. 纹理映射. 将一个一维、二维、三维的图像映射到几何物体上的过程 纹理映射的用途 仿真自然界的材质 减少几何复杂度 图像 warping 反射效果模拟 。。。.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

高级纹理映射


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide2
本次课程的主要内容
  • 高级纹理映射
  • OGRE中的材质和纹理映射
texture mapping
纹理映射(texture mapping)
  • 纹理映射的基本原理
  • 凹凸纹理映射(bump mapping)
  • 位移映射(displacement mapping)
  • 环境纹理映射(environment mapping)
  • 基于光照映射的快速绘制(light mapping)
  • 高级纹理映射技术总结
slide4
纹理映射
  • 将一个一维、二维、三维的图像映射到几何物体上的过程
  • 纹理映射的用途
    • 仿真自然界的材质
    • 减少几何复杂度
    • 图像warping
    • 反射效果模拟
    • 。。。
slide5
纹理映射
  • 基于参数化的纹理坐标
  • glTexCoord*()指定每个顶点处的纹理

纹理空间

物体空间

t

1, 1

(s, t) = (0.2, 0.8)

0, 1

A

a

c

(0.4, 0.2)

b

B

C

(0.8, 0.4)

s

0, 0

1, 0

slide6
高级纹理映射
  • 标准纹理映射:物体本身的颜色
  • 凹凸纹理映射
    • 法向扰动:Bump mapping
    • 法向图:Normal mapping
    • 任意细节扰动:Detail mapping
    • 曲面的反射属性:Reflectance map
  • 位移映射
    • 标准位移映射:Displacement mapping
    • 视差位移映射:Parallax mapping
    • 深度校正的位移映射:Z-corrected displacement mapping
  • 环境映射:environment mapping
  • 光亮图:Light mapping

表面微结构

环境影响

bump mapping
凹凸纹理映射(Bump mapping)
  • 凹凸纹理映射(Bump Mapping)技术用来模拟粗糙物体表面凹凸不平的细节,如橘子,草莓,树皮等.
  • 并不改变物体几何,只是通过扰动法向达到效果
slide8
凹凸纹理映射
  • 方法1:记录有符号数(bu,bv),用于偏移法向
  • 方法2:记录高度场,用于差分计算法向。
emboss bump mapping
浮雕型凹凸纹理映射(emboss bump mapping)
  • 最简单
  • 直接计算漫射光亮度
  • 不进行光照明计算
  • 步骤
    • 绘制半亮度图
    • 绘制反色半亮度图
    • 将结果和顶点光照明计算结果与纹理映射做乘积型融合操作
emboss bump mapping1
浮雕型凹凸纹理映射(emboss bump mapping)

原始高度图

光源在上左方向

光源在上右方向

normal mapping or dot3 bump mapping
法向映射(Normal mapping or dot3 bump mapping)
  • 输入法向图,记录扰动后的曲面法向
  • 数据来源是高度图
normal mapping or dot3 bump mapping1
法向映射(Normal mapping or dot3 bump mapping)
  • 给出一个模型和一个法向图
    • 对每个多边形,光源向量变换到每个顶点处的局部切向空间坐标;
    • 对每个像素,对插值后的光源向量进行归一化;
    • 将光源向量与法向图中记录的法向点击,获得漫射分量;
    • 插值半角向量,计算高光分量;
    • 融合本身的纹理颜色,获得最后的效果
slide21
细节映射
  • 法向纹理的来源除高度图外,也可以是物体表面的属性,如法向,颜色,材质等.这类纹理称为细节纹理(Detail texture)
slide22
创建细节纹理过程
  • 将高分辨率网格简化为的分辨率网格
  • 参数化低分辨率网格,建立网格和细节纹理的一一对应
  • 根据高分辨率网格的表面细节填充细节纹理
slide24
环境凹凸纹理映射
  • 基本原理是利用凹凸纹理扰动环境映射的纹理坐标
  • 一个凹凸纹理,一个环境纹理
slide25
位移映射
  • 位移映射(Displacement mapping)使用高度图来模拟曲面的扰动.
  • 真正改变了物体的表面几何属性,而凹凸映射仅修正了曲面的法向量.
parallax mapping
视差映射(Parallax mapping)

绘制C时,利用视差纹理中的位移从A移到B。

z correct displacement mapping
深度校正位移映射(Z-correct displacement mapping
  • 输入高度图,将象素的Z值沿相机方向位移
  • 并不改变物体表面几何
  • 缺点是在像素层次上修改深度值会关闭图形硬件的早期深度测试优化功能,极大地影响绘制效率。
environment mapping
环境纹理映射(environment mapping)
  • 环境映射有效模拟场景的反射现象的加速技术
  • 以景物的中心为固定的视点来观察整个场景
  • 将周围场景的二维图像记录在以该点为中心的简单几何物体(如球面,立方体和柱面)上,以全景图像的方式提供了其中心视点处的场景描述.

环境纹理

观察者

反射光线

物体

slide31
环境纹理映射
  • 注意:并不在物体的每个点记录一个单独的纹理,而是为整个物体建立一个纹理图。
  • 在反射方向存在扭曲变形现象,但是观察者并不注意。而且,对于一个大房间中的小物体,这种扭曲相当小。
  • 物体不能反射自身。
slide32
环境纹理映射
  • 三种重要的形式:
    • 立方体映射
    • 球面映射
    • 柱面映射
  • 描述了环境纹理映射所寄存的纹理
  • 决定纹理的生成方式和索引方式
slide34
立方体映射
  • 纹理保存在物体的立方体包围盒上。该立方体与世界坐标轴平行。
  • 生成方式:
    • 对于立方体的每一个面,以该面为成像平面,从物体的中心绘制整个世界。
    • 或者,在真实世界中以相机拍摄六副图像;
    • 对于物体可能处的位置,都生成一个立方体映射;
    • 对于新的物体所处的位置,通过插值或扭曲生成新的立方体映射。
cube mapping
立方体环境映射(Cube mapping)
  • 立方体纹理由6张不同纹理组成,每张纹理对应立方体一个面
  • 立方体环境映射并不限于模拟精确的反射,也可以模拟镜面高光、漫反射和Phong光照明模型。
  • 如果使用低分辨率的纹理,可以模拟粗糙的物体表面
  • 局限性:当光源或场景物体的遮挡关系改变后必须重新生成
slide37
球面映射
  • 早期的球面映射版本称为Lat/Long映射(1976),它在物体中心放置一个球面。
  • 改进方法:
    • 对每个纹理坐标(s,t), 沿-Z轴投射一根光线到球面,记录下它的反射方向的光亮度
    • 等价于用一个平行投影的相机(长焦距、长距离)对一个反射球面进行成像
    • 在获得球面环境纹理的同时,也获得了每个顶点的纹理坐标,从而建立物体表面顶点与球面环境纹理的对应关系(即表面参数化)。
slide39
球面映射
  • 绘制时,根据顶点的纹理坐标,底层API会自动插值生成物体表面每个点的纹理坐标。
  • 由于这种参数化不是保面积变换,球面环境映射将产生某些变形。
  • 球面环境映射的理想状况是相机和环境物体位于无穷远处。
    • 不适合于自身反射性质(它不是凸物体)
    • 相机与其他物体不在无穷远处时不正确
    • 视点依赖性,即只适用于一个方向和一个相机
slide40
球面环境映射
  • 具体使用步骤是:
    • (1)设置球面环境纹理;
    • (2)设置和打开球面环境纹理坐标的生成方式;
    • (3)正确设置物体表面的法向,绘制物体。
panaroma
柱面映射(Panaroma)
  • 全景图效果
  • 难点:拼接

Demo

light mapping
光照映射(Light mapping)
  • 预计算光亮度,做为光照图(Lightmap),直接记录在场景顶点上。
  • 光照图只调节基纹理图的亮度
slide45
光照映射
  • 通过预先计算光照并保存为纹理,从而加速光照计算:
    • 允许复杂的光照明计算(如阴影、辐射度)
  • 如何决定映射方式?
  • 如何生成纹理?
  • 如何进行实时绘制?
  • 原则:最小的纹理尺寸,最大化纹理重用
slide46
光照映射
  • 通常需要对场景光场分别进行预计算(如光能辐射度算法),生成全局的光照信息、高光和阴影等,然后将场景中物体每个面上计算的光亮度作为纹理保存为光照图。
  • 由于光照图本质上保留的是场景中光照的低频分量,因此无需逐个像素保存光亮度,光照图的分辨率可以相对较低。
slide48
选择映射方式
  • 难点:在预处理阶段,多边形的任意一个点必须与纹理上的某个点对应. 因此,多边形数目不能太多。
  • 方法:
    • 将一组将近平面的多边形聚合成一个平面
    • 这些多边形对应的纹理可拼成一个大的纹理
    • 将纹理坐标保存在多边形的顶点上
slide49

光照纹理

光照映射造成的场景光亮度分布

最终合成场景

无光照场景

slide50
光照映射
  • 艺术家或者美工人员手工简单地绘制出光照分布,主要用于模拟艺术手法的绘制效果.
slide51
光照映射
  • 光照映射允许场景中物体的漫射颜色呈非线性变换,展现彩色光源和阴影等效果。
  • 可模拟任意与视点无关的光照模型
  • 也可以模拟特殊的镜面高光效果
  • 对不同的场景,必须重新计算
slide52
单步多纹理实现光照映射

(1)在预处理阶段创建二维光照数据,并保存为纹理。光照纹理中心区域最亮,从中心向外逐渐变暗;

(2)绘制整个场景,此时仅进行普通的纹理映射;

(3)对于场景中的每个光源;

(4)对于场景中相对当前光源可见的多边形;

(5)计算该多边形所在的平面;

(6)根据光源的位置,平移与缩放纹理坐标,计算出多边形在光照纹理中的纹理坐标;

(7)实行光照映射,将光照纹理与第2步计算的物体颜色融合。

第7步是通过单步多纹理映射技术实现的。如果在预处理阶段将光照纹理与物体表面的预先纹理融合,可以省略第2步的纹理映射。

slide53
例子

无滤波的光照映射

带滤波的光照映射

slide54
例子

无光照映射

光照映射+纹理映射

slide55
动态光照映射
  • 本质上,光照图由预处理得到,因此,只适用于静态光照计算。
  • 我们可以在运行时刻在线计算一个单独的动态光照纹理。
  • 并将该纹理做为额外的纹理步骤添加到场景中

Demo

slide56

Demo

开门时:移动的阴影

slide57

动态局部光照的改变

  • 方法1:重新创建纹理,简单,低效;
  • 方法2:改变光照图
    • 相对于曲面,将光照图平移;
    • 缩放到需要的大小
    • 调节物体表面的光亮度
slide61
雾化映射
  • 实现途径:动态修正光照纹理
  • 将雾状物体添加到场景中
  • 计算它们与场景几何相交的部分,并将雾的密度做为动态光照图记录,映射与静态的光照图一致。
  • 将雾化映射做额外的光照图,添加上去。
slide67

第一行(左起):纹理映射、凹凸映射、位移映射;第二行(左起):纹理映射线框表示、凹凸映射线框表示、位移映射线框表示;第三行(左起):常规纹理、凹凸纹理。第一行(左起):纹理映射、凹凸映射、位移映射;第二行(左起):纹理映射线框表示、凹凸映射线框表示、位移映射线框表示;第三行(左起):常规纹理、凹凸纹理。

Demo

slide68
OGRE中的材质和纹理映射
  • Ogre的材质(Material)
  • OGRE中的纹理层(TextureLayer)
  • 材质管理器(MaterialManager)
  • 材质脚本
ogre material
Ogre的材质(Material)
  • Material类包括如下几类属性:
    • 基本的表面材质属性,如对不同颜色的反射率、高光系数等:
    • 组成Material的纹理层
    • 纹理之间的混合(Blend)方式
    • 深度缓冲设置
    • Culling模式
    • 纹理过滤方式(三线性过滤、双线性过滤)
    • 是否受光照影响
    • Shading选项
    • 雾化
  • 其中第二条的纹理层可以有多个,Ogre在Material类的内部定义了TextureLayer类。
slide70
纹理层
  • 一个纹理层可以是一幅静止的图像,也可以是一幅以某种方式运动的图像,还可以是由多幅图像组成的动画。它可以实现多种纹理特效,如BUMPMAP、环境帖图、运动的纹理。
materialmanager
材质管理器(MaterialManager)
  • MaterialManager类负责管理Material库。和材质相关的类图如下:
  • MaterialManager还负责分析Material脚本(Material Script),从而初始化Material的属性。下面我们来分析一下Ogre提供的材质脚本语言。
slide72
Ogre的材质脚本
  • Ogre材质脚本的默认扩展名为.material,也可以通过 MaterialManager类的parseAllSources方法来规定新的扩展名。
  • 系统初始化时会自动分析所有的材质脚本文件,并设置材质的属性。
  • 注意,这里只设置材质的属性,并不会将材质的纹理调入内存,因为那样会招致极大的内存消耗!
slide73
示例一:环境帖图
  • 在场景中显示一个OGRE头,并设置其表面材质为环境帖图,该环境帖图的属性在Example.material中设置。我们先看一下createScene()函数的代码:

void createScene(void)

{

//设置环境光

mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));

//创建一个实体(OGRE头)

Entity *ent = mSceneMgr->createEntity("head", "ogrehead.mesh");

//设置实体的材质

ent->setMaterialName("Examples/EnvMappedRustySteel");

// 将实体附属到场景根结点上

mSceneMgr->getRootSceneNode()->createChild()->attachObject(ent);

}

  • 在这里,Entity的成员函数setMaterialName是关键,字符串类型的参数对应材质脚本中的材质名。"Examples/EnvMappedRustySteel"就是材质名,它在Example.material文件中定义了环境帖图
slide74
示例一:环境帖图

脚本代码如下:

//材质名

Examples/EnvMappedRustySteel

{

//环境光

ambient 1.0, 1.0, 1.0

//散射光

diffuse 1.0, 1.0, 1.0

shading phong

//纹理层0

{

//纹理图象文件

texture RustySteel.jpg

}

//纹理层1

{

//纹理图象文件

texture spheremap.png

//纹理层之间的颜色累加

colour_op add

//指定环境帖图的方式

env_map spherical

}

}

slide75
示例一:环境帖图
  • 从这个例子中我们可以发现使用脚本来定义材质非常方便。
    • 首先,脚本采用类C++的语法,以{}作为分隔符,以//作为注释符。每一个Material必须有一个名字,在这个例子中就是Examples/EnvMappedRustySteel,它对应一个材质。脚本规定一个命令占一行,不可以串行。
  • Ogre为其材质脚本定义了许多关键字(命令),用来设置材质属性。
    • 如上例中的“ambient”与“diffuse”就是关健字,分别设置材质对环境光和散射光的反射率。在Material定义中嵌套一个“{}”,就代表一个纹理层,你可以在大括号中定义纹理层的属性,上例中有两层纹理,下层简单的显示了一幅名为“RustySteel.jpg”的图像 ,上层纹理采用了环境帖图并设定了两层纹理的混合方式为颜色相加。
example material
示例二:Example.material
  • 分析并尝试更改Ogre运行环境中的Example.material文件,并在Ogre提供的演示TextureFx.exe中观察效果。
  • 下面列出的是TextureFx.exe中用到的三个材质的定义:
    • 流动的水的特效
    • 大小正弦波影响的特效
    • 纹理流动的管道
slide77
流动的水的特效

// 流动的水的特效

Examples/TextureEffect3

{

ambient 0.2 0.2 0.2

// 关闭硬件拣选与软件拣选,即双面渲染

// 硬件拣选,由硬件渲染器负责。基于画三角形的方式(顺时针,逆时针)。<clockwise|anitclockwise|none>

// 软件拣选,在前几个信息改善到硬件器之前,进行拣选。基于三角形的前和后(由三角形的向量决定)。

cull_hardware none

cull_software none

// 水用了两层纹理

// 纹理层0

{

texture Water01.jpg

scroll_anim -0.25 0.1

}

// 纹理层1

{

texture Water01.jpg

scroll_anim -0.1 0.25

// 纹理层1与纹理层2之间的混合方式,add代表两层颜色相加。

colour_op add

}

}

slide78
大小正弦波影响的特效

// 大小正弦波影响的特效

Examples/TextureEffect1

{

ambient 0.75 0.75 0.75

// 关闭硬件拣选与软件拣选,即双面渲染

// 硬件拣选,由硬件渲染器负责。基于画三角形的方式(顺时针,逆时针)。 

// 软件拣选,在前几何信息改善到硬件器之前,进行拣选。基于三角形的前和后(由三角形的向量决定)。

cull_hardware none

cull_software none

// 纹理层0

{

// 纹理图的文件名

texture BumpyMetal.jpg

// wave_xform指定一个波形函数,来对指定的纹理层属性(scale或scroll或rotate)产生影响

// wave_xform <纹理层的某个属性> <波形> <base> <频率> <相位> <振幅>

// 下面这句可以解释成:纹理的宽度值 = 纹理的宽度值 * 正弦波当前时间的值(base+sine)

wave_xform scale_x sine 0 0.1 0 5

// 旋转速率 = 旋转速率 + 正弦波当前的值

// wave_xform rotate sine 0.1 0.1 0 5

}

}

slide79
纹理流动的管道

// 纹理流动的管道

Examples/TextureEffect2

{

scene_blend add

{

texture Water02.jpg

scroll_anim 0.5 0

}

}

slide80
材质脚本关键字说明
  • ambient设置材质的环境光反射属性
    • 格式: ambient <red> <green> <blue>在0.0和1.0之间取值。直接影响物体材质对环境光反射能力。默认值为白色(1.0 1.0 1.0)。
  • diffuse设置材质的漫反射属性
    • 格式: diffuse <red> <green> <blue>在0.0和1.0之间取值。直接影响物体材质对漫射光的反射属性。默认值为白色(1.0 1.0 1.0)。
slide81
材质脚本关键字说明
  • specular设置材质的镜面反射属性
    • 格式: specular <red> <green> <blue> <shininess>在0.0和1.0之间取值,shininess属性可以是任何正数。直接影响物体材质的镜面反射属性。默认值为无镜面反射(0.0 0.0 0.0 0.0)。
  • emissive设置材质本身的发光程度
    • 格式: emissive <red> <green> <blue> 在0.0和1.0之间取值。 如果一个物体自发光,它将不需要外界的照明,但是,值得注意的是这不表明这个物体将会成为一个光源:它只会照亮自己。默认是黑色(0.0 0.0 0.0)。
slide82
材质脚本关键字说明
  • scene_blend 设置与场景的混合方式,有两种形式
    • 格式1: scene_blend <add|modulate|alpha_blend>这个格式比较简单常用一些,参数意义如下:
      • add渲染的结果将被以相加的方式加入场景之中,与scene_blend one one等价。对爆炸,火焰,光照,幽灵等效果比较好。
      • Modulate渲染的结果与场景相乘。对烟、玻璃杯和单个的透明物效果较好。与scene_blend src_colour one_minus_src_colour等价。
      • alpha_blend渲染结果中的Alpha成员将被用作遮罩。与scene_blend src_alpha one_minus_src_alpha等价。
  • 默认值: scene_blend one zero (不透明)
slide83
材质脚本关键字说明

格式2: scene_blend <src_factor> <dest_factor>

麻烦,但是比较完善。结果的计算公式为(texture * sourceFactor) + (scene_pixel * destFactor)其中sourceFactor 和destFactor如下:

      • One常数1.0
      • Zero常数0.0
      • dest_colour当前点的颜色
      • src_colour纹理对应点的颜色
      • one_minus_dest_colour1 - (dest_colour)
      • one_minus_src_colour1 - (src_colour)
      • dest_alpha当前点的Alpha值
      • src_alpha纹理对应点的Alpha值
      • one_minus_dest_alpha1 - (dest_alpha)
      • one_minus_src_alpha1 - (src_alpha)
  • 默认值: scene_blend one zero (不透明)
slide84
材质脚本关键字说明
  • depth_check是否开深度测试
    • 格式: depth_check <on|off>默认打开深度缓存。有助于判断两个点的遮挡关系和前后关系,体现三维立体感。
  • depth_write是否允许对已经存在的深度缓存进行写操作
    • 格式: depth_write <on|off>
    • 默认允许,关掉的话,则被关的Material会一直浮动在所有物体前面。
slide85
材质脚本关键字说明
  • depth_func当深度缓存打开的时候,挑选一个比较函数
    • 格式: depth_func <func>
      • always_fail从不比较
      • always_pass总是用新的换掉旧的
      • less新的比旧的小就换掉
      • Less_equal新的小于等于旧的就换掉
      • equal等于就换掉
      • not_equal不等于就换掉
      • greater_equal新的大于等于旧的就换掉
      • greater新的比旧的大就换掉
  • 默认为:小于等于就换掉 depth_func less_equal
slide86
材质脚本关键字说明
  • ull_hardware设置硬件Cull模式
    • 格式: cull_hardware <clockwise|anitclockwise|none>
    • 默认顺时针Cull。这与OpenGL的默认是一样的,但和D3D的默认相反。(因为Ogre用的是OpenGL采用的右手坐标系)
  • cull_software设置软件Cull模式
    • 格式: cull_software <back|front|none>
    • 默认背面。相当于硬件Cull模式的顺时针。
  • lighting光照
    • 设置动态光照是否为此材质打开。如果关掉,将使材质本身的所有的ambient, diffuse, specular, emissive和shading属性无效,仅仅与外界的光照有关。
    • 格式: lighting <on|off>
    • 默认: lighting on
slide87
材质脚本关键字说明
  • shading阴影模式
    • 格式: shading <flat|gouraud|phong>
    • Flat每个表面仅仅用一个颜色填充
    • gouraud线性过渡表面颜色
    • phong并非所有的硬件都支持,这种模式测定每一个顶点的颜色。
    • 默认: shading gouraud
  • filtering设置纹理过滤方式
    • 格式: filtering <none|bilinear|trilinear>
    • 默认是双线性(bilinear)
slide88
纹理层专用属性
  • texture设置纹理要使用的图名
    • 格式: texture <texturename>
    • 无默认值,必须指定一个纹理名。
  • anim_texture动画纹理
    • 设置动画纹理使用的图片文件名。
    • 格式1 (短的): anim_texture <base_name> <num_frames> <duration>
      • 指定一个图片名称,以这个名称后缀_1、_2一直到_num(由num_frames指定),duration指定间隔时间。
    • 格式2 (长的): anim_texture <frame1> <frame2> ... <duration>
      • 一个一个指定图片名称,duration指定间隔时间。
    • 无默认值
slide89
作业布置
  • 可选:
  • 在OGRE中实现法向映射
  • 在OGRE中实现位移映射
  • 在OGRE中实现动态光照映射