3D游戏图形高级纹理映射及ogre材质和纹理映射
2020-03-01 278浏览
- 1.高级纹理映射
- 2.本次课程的主要内容 高级纹理映射 OGRE 中的材质和纹理映射
- 3.纹理映射( texture mapping ) 纹理映射的基本原理 凹凸纹理映射 (bump mapping) 位移映射 (displacement mapping) 环境纹理映射 (environment mapping) 基于光照映射的快速绘制 (light mapping) 高级纹理映射技术总结
- 4.纹理映射 传统的几何造型技术只能表示景物的宏观形状,而 无法有效地描述景物表面的微观细节。 纹理映射技术以纹理图像作为输入,通过定义纹理 与物体之间的映射关系,将图像映射到简单景物几 何形态上合成出具有真实感的表面花纹、图案和细 微结构 将一个一维、二维、三维的纹理图像映射到几何物 体上的过程
- 5.纹理映射 纹理映射的优势 ◦ 节省建模时间:对非常复杂的物体建模,需要使用复 杂的建模工具和冗长的建模过程。使用纹理映射只需要对物 体拍照。 ◦ 节省内存:精确的几何模型占用大量内存资源,使用纹 理映射所需的只是图像的分辨率 ◦ 增强表面细节和场景的真实感:树木山石云雾 等无法用纯几何模拟的自然景观。 ◦ 提高绘制速度:纹理映射实际上是一类将绘制流程从 场景几何空间转换为图像空间的技术。
- 6.纹理映射 基于参数化的纹理坐标 glTexCoord*() 纹理空间 t 0, 1 指定每个顶点处的纹理 物体空间 1, 1 (s, t) = (0.2, 0.8) A a c (0.4, 0.2) b 0, 0 B 1, 0 s C (0.8, 0.4)
- 7.纹理映射 取址及反走样 为了获得某些特性,纹理坐标会超出 图形引擎中采取的取址有四种模式: [0 1] 范围, 重复 : 对超 出范 对对部分 对 对对行重复 对对 .(1.3,-0.4) 将采样 (0.3,0.6) 处的 值 边界颜色:设置所有超越边界的纹素的值为给定的边界颜色。 截断:将超越所有边界的值截断到最近的边界。如 .(1.3,-0.4) 将采样 (1.0,1.0) 处的值 镜像:位于边界的部分沿边界作为镜像。如 (1.3,-0.4) 将采 样 (0.7,0.4) 处的值
- 8.纹理映射 反走样技术中最常见的是 MIP 技术。 在图形引擎中一般能自动设置。 D3D demo
- 9.高级纹理映射 标准纹理映射:物体本身的颜色 凹凸纹理映射 表面 微结 构 ◦ 法向扰动: Bump mapping ◦ 法向图: Normal mapping ◦ 任意细节扰动: Detail mapping ◦ 曲面的反射属性: Reflectance map 位移映射 ◦ 标准位移映射: Displacement mapping ◦ 视差位移映射: Parallax mapping ◦ 深度校正的位移映射: Z-corrected displacement mapping 环境 影响 环境映射: environment 光亮图: Light mapping mapping
- 10.凹凸纹理映射( Bump mapping ) 凹凸纹理映射 (Bump Mapping) 技术用来模 拟粗糙物体表面凹凸不平的细节 , 如橘子 , 草莓 , 树皮等 . 并不改变物体几何,只是通过扰动法向达 到效果
- 11.凹凸纹理映射 方法 1 :记录有符号数( bu,bv ),用于偏 移法向 方法 2 :记录高度场,用于差分计算法向。
- 12.
- 13.D3D demo
- 14.浮雕型凹凸纹理映射 (emboss bump mapping) 最简单 直接计算漫射光亮度而不是 得到扰动过的法向向量。 不允许运用任何光照明模型 步骤 ◦ 对 制 半亮度 对 ◦ 绘制反色半亮度图,纹理 坐标朝光源方向稍微扰动 ◦ 将对 果和 对对 对对 点光照明计算 对 对对对 对 结果与纹理映射做乘积型 融合操作
- 15.浮雕型凹凸纹理映射 (emboss bump mapping) 原始高度图 光源在上左方向 光源在上右方向
- 16.法向映射( Normal mapping or dot3 bump mapping ) 是凹凸映射系列中最常用的技术。 输入法向图 , 记录扰动后的曲面法向 数据来源是高度图
- 17.法向映射( Normal mapping or dot3 bump mapping ) 给出一个模型和一个法向图 ◦ 对每个多边形,光源向量变换到每个顶点处的局部切向空间坐 标; ◦ 对每个像素,对插值后的光源向量进行归一化; ◦ 将光源向量与法向图中记录的法向点积,获得漫射分量; ◦ 插值半角向量,计算高光分量; ◦ 融合本身的纹理颜色,获得最后的效果
- 18.
- 19.
- 20.法向纹理映射 + 简化几何
- 21.OGRE Demo
- 22.辐射度法向纹理
- 23.辐射度法向纹 理
- 24.细节映射 法向纹理的来源除高度图外 , 也可以是 物体表面的属性 , 如法向 , 颜色 , 材质 等 . 这类纹理称为细节纹理 (Detail texture)
- 25.创建细节纹理过程 将高分辨率网格简化为低分辨率网格 参数化低分辨率网格 , 建立网格和细节纹理的一一 对应 根据高分辨率网格的表面细节填充细节纹理
- 26.反射率映射( Reflectance mappin g)
- 27.环境凹凸纹理映射 基本原理是利用凹凸纹理扰动环境映射的纹理坐标 一个凹凸纹理,一个环境纹理
- 28.位移映射 位移映射 (Displacement mapping) 使用高度图来模拟曲面的扰动 . 真正改变了物体的表面几何属性 , 而凹 凸映射仅修正了曲面的法向量 .
- 29.
- 30.视差映射 (Parallax mapping) 绘制 C 时,利用视差纹理中的位移从 A 移到 B 。
- 31.视差映射
- 32.深度校正位移映射( Z-correct displacement mapping ) 输入高度图 , 将象素的 Z 值沿相机方向位移 并不改变物体表面几何 缺点是在像素层次上修改深度值会关闭图形硬件的早期深度测试 优化功能 , 极大地影响绘制效率。
- 33.对 境对 对 对 理映射 对 (environment mapping) 环境映射有效模拟场景的反射 现象的加速技术 环境纹理 以景物的中心为固定的视点来 观察整个场景 将周围场景的二维图像记录在 以该点为中心的简单几何物体 ( 如球面 , 立方体和柱面 ) 上 , 以全景图像的方式提供了其中 心视点处的场景描述 . 观察者 反射光线 物体
- 34.环境纹理映射 注意:并不在物体的每个点记录一个单独的纹理, 而是为整个物体建立一个纹理图。 在反射方向存在扭曲变形现象,但是观察者并不注 意。而且,对于一个大房间中的小物体,这种扭曲 相当小。 物体不能反射自身。
- 35.环境纹理映射 三种重要的形式 : ◦ 立方体映射 ◦ 球面映射 ◦ 柱面映射 描述了环境纹理映射所寄存的纹理 决定纹理的生成方式和索引方式
- 36.实例
- 37.立方体映射 纹理保存在物体的立方体包围盒上。该立方体与世界 坐标轴平行。 生成方式: ◦ 对于 立方体的每一个面,以 对对面 对对成像平面,从物体的中心 对 对 对 对 对 对 对 对 对 对 对对制 整个世界。 ◦ 或者,在真对对 世界中以相机拍 对 对 对 对 对 对 对对 六副 对 对对 像; 对 ◦ 对于物体可能处的位置,都生成一个立方体映射; ◦ 对于新的物体所处的位置,通过插值或扭曲生成新的立方体 映射。
- 38.立方体环境映射( Cube mapping ) 立方体纹理由 6 张不同纹理组成,每张纹理对应立方体一个面 立方体环境映射并不限于模拟精确的反射,也可以模拟镜面高光、漫反射和 Phong 光照明模型。 如果使用低分辨率的纹理,可以模拟粗糙的物体表面 局限性:当光源或场景物体的遮挡关系改变后必须重新生成
- 39.立方体映射 OgreDemo
- 40.球面映射 早期的球面映射版本称为 Lat/Long 映射 ( 1976 ),它在物体中心放置一个球面。 改进方法: ◦对 每 对 个对 对 理坐 对 (s,t), 沿 -Z 对 投 射一根光 对 到球面,对 对 下它的反射方向的光亮度 对 对 对 对 对 对 对 对 对 对 对 ◦ 等价于用一个平行投影的相机(长焦距、长距 离)对 一个反射球面 对 对 对 对 对 对 对 对 行成像 对 对 ◦ 在获得球面环境纹理的同时,也获得了每个顶 点的纹理坐标,从而建立物体表面顶点与球面 环境纹理的对应关系(即表面参数化)。
- 41.球面环境映射 (Sphere mapping)
- 42.球面映射 绘制时,根据顶点的纹理坐标,底层 API 会自动插值生成物体表面每个点的纹理坐 标。 由于这种参数化不是保面积变换,球面环 境映射将产生某些变形。 球面环境映射的理想状况是相机和环境物 体位于无穷远处。 ◦ 不适合于自身反射性质(它不是凸物体) ◦ 相机与其他物体不在无穷远处时不正确 ◦ 视点依赖性,即只适用于一个方向和一个相机
- 43.球面环境映射 具体使用步骤是: ◦ ( 1 )设置球面环境纹理; ◦ ( 2 )设置和打开球面环境纹理坐标的生成方式; ◦ ( 3 )正确设置物体表面的法向,绘制物体。
- 44.球面映射实例 D3Ddemo
- 45.柱面映射( Panaroma ) 全景图效果 难点:拼接
- 46.光照映射( Light mappin g) 预计算光亮度,做为光照图 (Lightmap) 记录在场景顶点上。 光照图只调节基纹理图的亮度 ,直接
- 47.
- 48.光照映射 通过预先计算光照并保存为纹理,从 而加速光照计算: ◦ 允许复杂的光照明计算 ( 如阴影、辐射度 ) 如何决定映射方式? 如何生成纹理? 如何进行实时绘制? 原则:最小的纹理尺寸,最大化纹理 重用
- 49.光照映射 通常需要对场景光场分别进行预计算(如光 能对 射度算法),生成全局的光照信息、高 对对对对对对对对对对对对对对对对对 光和阴影等,然后将场景中物体每个面上计 算的光亮度作为纹理保存为光照图。 由于光照图本质上保留的是场景中光照的低 频分量,因此无需逐个像素保存光亮度,光 照图的分辨率可以相对较低。
- 50.局部光照计算
- 51.选择映射方式 难点:在预处理阶段,多边形的任意 一个点必须与纹理上的某个点对应 . 因此,多边形数目不能太多。 方法: ◦ 将一组将近平面的多边形聚合成一个平面 ◦ 这些多边形对应的纹理可拼成一个大的纹理 ◦ 将纹理坐标保存在多边形的顶点上
- 52.光照纹理 无光照场景 光照映射造成的 场景光亮度分布 最终合成场景
- 53.光照映射 艺术家或者美工人员手工简单地绘制出光照 分布,主要用于模拟艺术手法的绘制效果 .
- 54.光照映射 光照映射允许场景中物体的漫射颜色 呈非线性变换,展现彩色光源和阴影等 效果。 可模拟任意与视点无关的光照模型 也可以模拟特殊的镜面高光效果 对不同的场景,必须重新计算
- 55.单步多纹理实现光照映射 ( 1 )在预处理阶段创建二维光照数据,并保存为纹理。光照纹 理 中心区域最亮,从中心向外逐渐变暗; ( 2 )绘制整个场景,此时仅进行普通的纹理映射; ( 3 )对于场景中的每个光源; ( 4 )对于场景中相对当前光源可见的多边形; ( 5 )计算该多边形所在的平面; ( 6 )根据光源的位置,平移与缩放纹理坐标,计算出多边形在光 照纹理中的纹理坐标; ( 7 )实行光照映射,将光照纹理与第 2 步计算的物体颜色融合 。 第 7 步是通过单步多纹理映射技术实现的。如果在预处理 阶段将光照纹理与物体表面的预先纹理融合,可以省略 第 2 步的纹理映射。
- 56.例子 无滤波的光照映射 带滤波的光照映射
- 57.例子 无光照映射 光照映射+纹理映射
- 58.动态光照映射 本质上,光照图由预处理得到,因此,只适用于 静态光照计算。 我们可以在运行时刻在线计算一个单独的动态光 照纹理。 并将该纹理做为额外的纹理步骤添加到场景中
- 59.开门时:移动的阴影
- 60.动态局部光照的改变 1 :重新创建纹理,简单,低效; 方法 2 :改变光照图 方法 ◦ 相对于曲面,将光照图平移; ◦ 缩放到需要的大小 ◦ 调节物体表面的光亮度
- 61.雾化映射 实现途径:动态修正光照纹理 将雾状物体添加到场景中 计算它们与场景几何相交的部分,并 将雾的密度做为动态光照图记录,映射 与静态的光照图一致。 将雾化映射做额外的光照图,添加上 去。
- 62.雾化光照纹理
- 63.过程式纹理与体纹理
- 64.
- 65.基于顶点的光照计算、基于像素的光 照计算和光照映射优缺点比较
- 66.高级纹理映射技术总结
- 67.第一行(左起):纹理映射、凹凸映射、位移映射;第二行 (左起):纹理映射线框表示、凹凸映射线框表示、位移映 射线框表示;第三行(左起):常规纹理、凹凸纹理。
- 68.OGRE 中的材质和纹理映射 的材质( Material ) OGRE 中的纹理层( TextureLayer ) 材质管理器( MaterialManager ) 材质脚本 Ogre
- 69.Ogre 的材质( Material ) Material ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ 类包括如下几类属性: 基本的表面材对对 属性,如 对 对 对 对对 不同 对 对对 色的反射率、高光系数等: 对 对 对 对 对 对 对 对 对 对 对 组成 Material 的纹理层 纹理之间的混合( Blend )方式 深度缓冲设置 Culling 模式 纹理过滤方式(三线性过滤、双线性过滤) 是否受光照影响 Shading 选项 雾化 其中第二条的纹理层可以有多个, 内部定义了 TextureLayer 类。 Ogre 在 Material 类的
- 70.纹理层 一个纹理层可以是一幅静止的图像, 也可以是一幅以某种方式运动的图像, 还可以是由多幅图像组成的动画。它可 以实现多种纹理特效,如 BUMPMAP 、环境帖图、运动的纹理。
- 71.材质管理器( MaterialManage r) MaterialManager 类负责管理 Material 库。和材质相关的类 图如下: MaterialManager Material 1 0..n TextureLayer 1 0..n MaterialManager 还负责分析 Material 脚本( Material Scrip t ),从而初始化 Material 的属性。下面我们来分析一下 Ogre 提供的材质脚本语言。
- 72.Ogre 的材质脚本 材质脚本的默认扩展名 为 .material ,也可以通过 MaterialManager 类的 parseAllSources 方法来规定新的扩展名。 系统初始化时会自动分析所有的材质 脚本文件,并设置材质的属性。 注意,这里只设置材质的属性,并不 会将材质的纹理调入内存,因为那样会 招致极大的内存消耗! Ogre
- 73.材质的例子 简单的材质: material VerySimple { technique { pass { diffuse 0.5 0.5 0.5 } } } 脚本内部的嵌套关系:材质包含了技术,而技术包含了通路。通 路中定义了漫反射参数。
- 74.示例一:环境帖图 在场景中显示一个 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 文件中定义了环境帖图
- 75.示例一:环境帖图 material Examples/EnvMappedRustySteel { technique { pass { texture_unit { texture RustySteel.jpg } texture_unit { texture spheremap.png colour_op_ex add src_texture src_current colour_op_multipass_fallback one one env_map spherical } } } }
- 76.示例一:环境帖图 从这个例子中我们可以发现使用脚本来定义材质非常方便。 ◦ 首先,脚本采用类 C++ 的语法,以{}作为分隔符,以 // 作为 注释符。每一个 Material 必须有一个名字,在这个例子中就是 Examples/EnvMappedRustySteel ,它对应一个材质。脚本规定一 个命令占一行,不可以串行。 Ogre 为其材质脚本定义了许多关键字(命令),用来设置 材质属性。 ◦ 如上例中的“ ambient” 与“ diffuse” 就是关健字,分别设置材质 对环境光和散射光的反射率。在 Material 定义中嵌套一个 “{}”,就代表一个纹理层,你可以在大括号中定义纹理层的 属性,上例中有两层纹理,下层简单的显示了一幅名 为“ RustySteel.jpg” 的图像 ,上层纹理采用了环境帖图并设定了 两层纹理的混合方式为颜色相加。
- 77.示例二: Example.material 分析并尝试更改 Ogre 运行环境中的 Example.material 文件,并在 Ogre 提供 的演示 TextureFx.exe 中观察效果。 下面列出的是 TextureFx.exe 中用到的 三个材质的定义: ◦ 流动的水的特效 ◦ 大小正弦波影响的特效 ◦ 对理 流 对对的管道 对对
- 78.流动的水的特效 // 流动的水的特效 Examples/TextureEffect3 { ambient 0.2 0.2 0.2 // 关闭硬件拣选与软件拣选,即双面渲染 // 硬件拣选,由硬件渲染器负责。基于画三角形的方式(顺时针,逆时针)。// 软件拣选,在前几个信息改善到硬件器之前,进行拣选。基于三角形的前和后(由三角形的 向量决定)。 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 } }
- 79.大小正弦波影响的特效 // 大小正弦波影响的特效 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+sine) wave_xform scale_x sine 0 0.1 0 5 // 旋对 速率 = 旋 速率+ 对 正 弦波当前的 对 // wave_xform rotate sine 0.1 0.1 0 5 } }
- 80.纹理流动的管道 // 纹理流动的管道 Examples/TextureEffect2 { scene_blend add { texture Water02.jpg scroll_anim 0.5 0 } }
- 81.材质脚本关键字说明 ambient 设置材质的环境光反射属性 ◦ 格式 : ambient在 0.0 和 1.0 之间取值。直接影响物体材质对环境光反射 能力。默认值为白色( 1.0 1.0 1.0 )。 diffuse 设置材质的漫反射属性 ◦ 格式 : diffuse在 0.0 和 1.0 之间取值。直接影响物体材质对漫射光的反 射属性。默认值为白色( 1.0 1.0 1.0 )。
- 82.材质脚本关键字说明 specular 设置材质的镜面反射属性 ◦ 格式 : specular在 0.0 和 1.0 之间取值, shininess 属性可以是任何正数。 直接影响物体材质的镜面反射属性。默认值为无镜面反 射( 0.0 0.0 0.0 0.0 )。 emissive 设置材质本身的发光程度 ◦ 格式 : emissive在 0.0 和 1.0 之间取值。 如果一个物体自发光,它将不 需要外界的照明,但是,值得注意的是这不表明这个物 体将会成为一个光源:它只会照亮自己。默认是黑色 ( 0.0 0.0 0.0 )。
- 83.材质脚本关键字说明 scene_blend 形式 设置与场景的混合方式,有两种 ◦ 格式 1: scene_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 ( 不透明 )
- 84.材质脚本关键字说明 格式 2: scene_blend麻烦,但是比较完善。结果的计算公式为 (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 ( 不透明 )
- 85.材质脚本关键字说明 depth_check 是否开深度测试 ◦ 格式 : depth_check默认打开深度缓存。有助于判断两个点的 遮挡关系和前后关系,体现三维立体感。 是否允许对已经存在的深 度缓存进行写操作 depth_write ◦ 格式 : depth_write◦ 默认允许,关掉的话,则被关的 Material 会一直浮动在所有物体前面。
- 86.材质脚本关键字说明 depth_func 当深度缓存打开的时候,挑选一个比较函数 ◦ 格式 : depth_func always_fail 从不比较 always_pass 总是用新的换掉旧的 less 新的比旧的小就换掉 Less_equal 新的小于等于旧的就换掉 equal 等于就换掉 not_equal 不等于就换掉 greater_equal 新的大于等于旧的就换掉 greater 新的比旧的大就换掉 默认为 : 小于等于就换掉 depth_func less_equal
- 87.材质脚本关键字说明 ull_hardware 设置硬件 Cull 模式 ◦ 格式 : cull_hardware◦ 默认顺时针 Cull 。这与 OpenGL 的默认是一样的,但和 D3D 的默认相反。(因为 Ogre 用的是 OpenGL 采用的右手 坐标系) cull_software 设置软件 Cull 模式 ◦ 格式 : cull_software◦ 默认背面。相当于硬件 Cull 模式的顺时针。 lighting 光照 ◦ 设置动态光照是否为此材质打开。如果关掉,将使材质本身 的所有的 ambient, diffuse, specular, emissive 和 shading 属性 无效,仅仅与外界的光照有关。 ◦ 格式 : lighting◦ 默认 : lighting on
- 88.材质脚本关键字说明 shading 阴影模式 ◦ 格式 : shading◦ Flat 每个表面仅仅用一个颜色填充 ◦ gouraud 线性过渡表面颜色 ◦ phong 并非所有的硬件都支持,这种模式测定每一个顶 点的颜色。 ◦ 默认 : shading gouraud filtering 设置纹理过滤方式 ◦ 格式 : filtering◦ 默认是双线性( bilinear )
- 89.纹理层专用属性 texture 设置纹理要使用的图名 ◦ 格式 : texture◦ 无默认值,必须指定一个纹理名。 anim_texture 动画纹理 ◦ 设置动画纹理使用的图片文件名。 ◦ 格式 1 ( 短的 ): anim_texture 指定一个图片名称,以这个名称后缀 _1 、 _2 一直到 _num (由 num_frames 指定), duration 指定间隔时间。 ◦ 格式 2 ( 长的 ): anim_texture... 一个一个指定图片名称, duration 指定间隔时间。 ◦ 无默认值
- 90.Q&A?