3D游戏图形游戏特效技术
2020-03-01 137浏览
- 1.游戏中的特效生成
- 2.本次授课内容 阴影生成 技术 过程式建模技术 常见特效实现 Billboard
- 3.提纲 阴影的必要性 阴影术语 常用实时阴影的绘制方法 ◦ 投影阴影 (projection shadow) ◦ 阴影纹理 (shadow texture) ◦ 阴影体 (shadow volume) ◦ 阴影图 (shadow map) ◦ 阴影体与阴影图的比较
- 4.阴影的必要性 增加场景真实感 帮助理解物体的位置关系 无阴影 硬阴影 软阴 影
- 5.阴影术语 •遮挡体 (occlude) •接收体 (receiver) •本影 (umbra) •半影 (penumbra)
- 6.阴影术语(续) 硬阴影 (hard shadow) ◦ 点光源产生 软 阴 影 (soft shadow) ◦ 线光源、面光源或体光源产生 ◦ 随着光源变大,软阴影的本影区会逐渐变小,甚至消 失 ◦ 常对硬阴影边缘模糊处理,制造伪软阴影
- 7.
- 8.投影阴影( projection shadows) 对三维物体进行两次绘制,得到其投影到某平面上的矩阵 接收面软y=0 的投影矩阵计算: 设光源的位置为 l ,需要投影的顶点为 v ,投影点为 p ,可得 p 点的 x 坐标: l y vx l x v y px l x l y 0 � px vx l x l y v y ly vy 同理,可以计算得到 p 点的 z 坐标投影: pz l y vz l z v y / l y v y 因为 y 坐标投影为 0 ,这样得到投影矩阵 M: 接收体平面 y =0 ly � � 0 � M �0 � �0 � lx 0 0 lx 0 ly 1 0 0� � 0� 0� � ly � �
- 9.投影阴影(续) 接收面为 n·x+d =0 的投影矩阵计算: p 的投影点为: d n �l pl ( v l) n �(v l) 转化为矩阵形式,我们得到投 影矩阵 M : n �l d lx nx � � l y nx � M � lz nx � � n x � lx n y n �l d l y n y lz n y ny lx nz l y nz n �l d lz nz nz lx d � � l y d � l z d � � n �l � �
- 10.投影阴影绘制 将投影矩阵应用到遮挡物体,然后以无 光照和较黑的颜色绘制投影物体。 应避免投影多边形和接收体平面重合的 情形发生,否则会发生绘制错误并闪烁 。 ◦ 方法一:给接收体平面加一定的偏移量 ◦ 方法二:先绘接收体平面,然后在关掉 zbuffer 的情况下绘制投影多边形 ◦ 意外情况:投影多边形落在接受体平面外 面 解决方法:使用 stencil buffer
- 11.投影阴影缺陷 • • • • • 只适合平面阴影接受体。 会产生反影错误 左:正确阴影 右:反影 即使阴影没有发生变化,对于每一帧,阴影也必须重新绘制 。 • 解决办法:阴影是与视点无关的,一个实用可行的方 案为把阴影绘制成一幅纹理,只在光源、遮挡物和接 收体发生变化时才重绘阴影纹理。
- 12.阴影纹理( shadow textur e) 将平面投影阴影扩展到曲面:将生成 的阴影图像作为一个纹理,应用到曲面 上
- 13.阴影体 (shadow volume) • 给定一个点和一个三角形,连接该点和三角形的顶点并延 伸,可得到一无限的金字塔。 • 如果给定的点为光源,则物体在截头无限金字塔之内的任 何部分为阴影。因此称截头无限金字塔为阴影体 (shadow volume)
- 14.阴影体(续) 遮挡体和光源投射生成阴影体 ◦ 在阴影体内的物体处于阴影状态
- 15.阴影体二维剖面图 遮挡体 光源 视点 ( 注意:阴影是 与视点无关的 部分被遮挡物体 ) 阴影体外的表面 ( 受照明 ) 阴影体 ( 无限延伸 ) 阴影体内的表面 ( 处于阴影范围 )
- 16.z-pass 算法 从视点向物体引一条视线,当这条射线进入阴影体(穿过其正面) 时, stencil 值加一,这条射线射出阴影体(穿过其背面)时 stencil 值减一 如果 stencil 值为零,表示物体不在阴影里 计数 =2 ,在阴影 中
- 17.z-pass 具体步骤 : enable z-buffer write ,绘制整个 场景,得到关于所有物体的 depth map Pass2 : disable z-buffer write , enable stencil buffer write, 然后绘制所有的 阴影体 。 对于阴影 的正向多边形 ( 即面对视点的这一 面 ) ,如果深度测试的结果是 pass, 那么和 这个象素对应的 stencil 值加一。如果深度测 试的结果是 fail, stencil 值不变。而对于阴影 体的背面 ( 远离视点的一侧 ) ,如果深度测试 的结果是 fail, stencil 值减一,否则保持不变 。 Pass1
- 18.z-pass 算法缺陷 视点在阴影体中时会导致错误
- 19.z-fail 算法 由 John Carmack , Bill Bilodeau 和 Mike Songy 各自独立发明 解决视点进入 shadow volume 后 z-pass 算法失效的问题。 基本想法:光线穿过的阴影体正面数 量小于背面数量,则该点位于阴影中
- 20.z-fail 算法(续)
- 21.z-fail 算法步骤 : enable z-write/z-test, 绘制整个场 景,得到 depth map 。 ( 这一步和 z-pass 的完全一样 ) Pass2 : disable z-write, enable ztest/stencil-write 。绘制阴影体 , 对于它的 背面 ,如果深度测试的结果是 fail, stencil 值 加一,如果深度测试的结果是 pass, stencil 值不变。对于正面 , 如果深度测试的结果是 fail, stencil 值减一 ,如果结果是 pass, stencil 值不变 Pass1
- 22.阴影体使用实例 最终场景 Stentil Buffer
- 23.D3D_demo
- 24.阴影图( shadow map ) Williams 1978 基本思想:场景中的阴影就是从光源角度来看,不可 见的区域。 以光源为视点,绘制 depth map ,用深度测试判断 某一点是否对光源可见(被照亮) 光源视棱锥 阴影图 (depth buffer)
- 25.阴影图具体步骤 :以光源为视点绘制一 depth map ,称 为阴影图 Pass2 :以相机为视点绘制最终场景,将可见 点转化到光源坐标系中,将其 z 值与阴影图中的 相应点比较,(几乎)相等,则该点被照亮 ; 大于,则该点处于阴影中 注意:阴影图的 depth map 是以光源为视点, 阴影体的 depth map 是以相机为视点 Pass1
- 26.阴影图具体步骤(续) B A z_ls = 光源到点 A 的距离 z_sm = 软影软软中保存的深度 软 软 软 软 软 软 如果 z_ls = z_sm 点 A 被照亮 如果 z_ls > z_sm 点 A 在阴影中 软然 , 软软里,点 软 软A 与点 B 对应同一个 z_sm ,点 B 是被照亮的,而点 A 处于阴 影中
- 27.阴影图算法的问题 偏移量( bias) ◦ 阴影图是点采样方法,阴影图中的 z 值与被照 亮点的 z 值会存在一定偏差 ◦ 解决方法:在深度比较中加入一个偏移量 ◦ Bias 的设置:过大或过小都会导致错误结果 Bias 太小,“阴影痤疮” Bias 太大,“阴影泄
- 28.阴影图算法的问题(续) 走样 (alias) ◦ 视点拉近阴影边缘 ◦ 大型场景 ◦ 视点与光源方向相对 ◦ 光源与接收面接近平行 解决方法 ◦ 提高阴影图有效分辨率 ◦ 与阴影体算法相结合 ◦ 对阴影边缘进行模糊,制作伪阴影
- 29.阴影体 vs 阴影图 都支持动态场景,且有硬件支持 阴影体 ◦ 几何空间 ◦ 高带宽占用,高填充率 ◦ 精度高 阴影图 ◦ 图像空间 ◦ 低消耗 ◦ 精度很大程度受阴影图分辨率制约
- 30.Ogre 阴影技术 阴影技术 支持两种主流的动态阴影技术—— 模板阴影以及纹理阴影——并且这两种阴 影技术都分别拥有两个形态:调节 ( Modulative )和加成( Additive )。 Ogre
- 31.Ogre 阴影 · ogre 在场景中只能统一使用某一种类型的阴影技术 ,并且需要在场景渲染之前就配置好它(理想的情况 下,在创建场景管理器实例之前就配置好阴影类型) 。 · 在装配场景之前需要配置所需阴影技术,这就意味着需要 调用场景管理器的SceneManager::setShadowTechnique()方法,并传入 SHADOWTYPE_STENCIL_ADDITIVE 、 SHADOWTYPE _STENCIL_MODULATIVE 、 SHADOWTYPE_TEXTURE _ADDITIVE 或者 SHADOWTYPE_TEXTURE_MODULATIVE 四个参数中的 任意一个。 · 阴影在默认的情况下是禁用的。
- 32.Ogre 阴影 · 阴影的产生和接受可以通过物体的材质来控制;进而你可以 单独控制物体上的阴影投射。在阴影技术启用默认的情况下 ,除了透明和半透明的物体之外,所有物体都是可以产生阴 影的,并且你也可以通过对透明和半透明材质的配制而让其 产生相应的阴影。 · 由于模板阴影本身的性质,对透明 / 半透明物体来说阴影只 能是完全投射或者不投射的,换句话说只能产生完全的实影 或者没有影子;除非使用纹理阴影类型(在默认的情况下是 半透明的),否则无法产生半透明的阴影。 · 灯光可以被设置是否能产生阴影。这是可以对每个灯光单独 设置的属性。 mSunLight- >setCastShadows(true);
- 33.
- 34.Billboard 在三维场景中,渲染三维物体很耗资源 2 维平面来模拟三维模型, Billboard 就应 运而生。 基本原理:将一幅包含物体图像的图片映射到一个 二维的矩形上,在渲染时根据观察方向旋转这个矩 形,使其始终面向观察者,从而使得观察者感觉看 到的是一个三维物体 因为物体的图 像通常是不规则矩形的物体,譬如树,所 以需要将矩形图片中不包含图像的部分处理成完全 透明,渲染软 软 启用 软 alpha 混合。 可利用
- 35.Billboards (适用于室外场景) 其实一个非常极端的 LOD 简化方法,将 所有的几何简化为一个或者多个带纹理的多边形。 Billboard ◦ 可以看做一种基于图像的绘制方法 ◦ 本质上,所有基于图像的方法都是为了代替几何 如何设计 billboards 呢? ◦ 他们是如何生成的 ? ◦ 他们如何绕观察者旋转? ◦ 如何改进它们 ? sprites (三维精灵) , 是一个总是 平行于成像平面的精灵 这种方法也叫
- 36.生成 Billboards 手工 – 软软的软软软 软工作者 软 ◦ 绘制颜色和透明度 ◦ 然后生成一系列动画 自动生成 : ◦ 绘制复杂模型,并将结果图像保存为 billboard ◦ 透明度可以自动地从背景象素和前景图像中 检测出来
- 37.Billboard 配置 表示 ◦ ◦ ◦ ◦ billboard 的多边形可以被放置成不同的方式 单个四边形 两个垂直的四边形 沿着公共轴的多个四边形 几个层叠的四边形 问题是 : ◦ 对于何种物体,选择何种 billboards 表示呢 ? ◦ 如何选择 billboard 使得它总是面向观察者 ? ◦ 如何绘制 billboard?
- 38.单个多边形表示的 Billboards 由单个带纹理映射的多边形表示 它必软软 永软软 指向 软 软软 察者,否 软 软 软 软软 在某些 软 软 软软 点软软 会消失 软 软 Billboard ◦ 除非: Billboards 都是带纹理的封闭的墙! 两个最主要的排列 Billboards 的方式 : ◦ 对 billboard 分配一个 up 方向 , 并且使得它总 是与观察者的 up 方向平行 ◦ 将 billboard 绕一个中心轴旋转,使得它总是 面对观察者
- 39.关于轴对齐 是 billboard 的轴 , V 观察者的 X 方向 , F 是当前 billboard 的朝 向 , D 是需要的朝向 A A V F D D 的计算方法: D A V A F 与 D 的夹角: FD cos F D 1
- 40.多个多边形组成的 Billboards 使用两个四边形 : ◦ 与观察者不平行 四边形越多,效果越好 绘制时有两个选项 : 融合操作 或者仅仅做深度比较
- 41.视点依赖的 Billboards 当物体不是旋转对称的时候怎么办 ? ◦ 对于不同的视角,物体外观必然改变 Billboards 方法依然是有效的 : ◦ 对每个不同的视点计算多个纹理图像 ◦ 绘制对不同的视点,保持多边形不变,但是改变纹理 图像 ◦ 最好在两个最近的视点之间进行插值、纹理融合操作 可利用三维纹理和硬件纹理滤波操作 获得较好的效果 如果多边形保持不变,那么会限制视角的变化 ◦ 解决方案:对于某些不同的视角,选用不同的多边形
- 42.
- 43.过程式建模技术 粒子系统 ◦ 介绍 ◦ 包括介绍 OGRE 的粒子系统及代码分析 L- 系统 ◦ 植被的构造
- 44.粒子系统 粒子的属性 ◦ 位置 , 速度 , 加速度 , 能量 , 方向 主要用于自然界中不规则的模糊景物 的模拟 ◦ 如火 , 雪 , 烟 , 植被等 主要步骤 ◦ 生成粒子 ◦ 更新粒子 ◦ 删除粒子 ◦ 绘制粒子
- 45.粒子系统 粒子系统的优 点是 : ◦ ① 简单体素和复杂物体行为有机结合。例如 : 利用粒 子系统可以很容易地生成火焰和喷泉。 ◦ ② 易于实现。只要提供给用于粒子属性的随机过程一 些参数即可定义一个粒子系统。 ◦ ③ 粒子简单,易于显示,而且显示效率较高。 主要缺点是 : ◦ ① 每一时间步均需要计算粒子的动态属性,增加计算 开销。 ◦ ② 粒子的几何特性过于简单,可以构造的物体范围有 限。
- 46.Example
- 47.Example
- 48.OGRE 的粒子系统 粒子是用四边形来表示的 粒子属性封在粒子属性变换器 ( Affector )中 ◦ 包含颜色修改器 ( ColourInterpolatorAffector ) ◦ 线形影响变换器( LinearForceAffector ) 粒子由粒子发生器( Emmiter )产生 ◦ 包含盒状粒子发生器( BoxEmmitter ) ◦ 点状粒子发生器( PointEmmiter )
- 49.代码分析 - 粒子系统模板 // 盒状粒子发射器 emitter Box { angle 30 emission_rate 1000 time_to_live 3 direction velocity // 粒子发射时偏离 direction 的最大角度 } // 发射速率 ( 个 / 秒 ) // 粒子生存时间 ( 秒 ) 010 200 // 粒子的发射方向 // 速率
- 50.粒子系统模板 // LinearForce :对运动中的粒子的加上一个外力,影响其运动轨迹。 // Make em float upwards affector LinearForce { force_vector 0 100 0 // 指定外力的影响 ( 用向量表示 ) // add :粒子的运动向量加上外力的向量。效果:匀加速运动 force_application add 。 } affector ColourInterpolator { time0 0 colour0 110 time1 0.5 colour1 100 time2 0.9 colour2 001 }
- 51.粒子系统实例: Demo_Smoke 粒子脚本 材质脚本 调用代码 贴图 ( a )是烟雾中烟粒子的纹理 ( b )是火焰颜色渐变使用的 64x4 纹 理
- 52.示例
- 53.示例 2-particlefx
- 54.L- 系统 以形式化的语言描述植物的结构和生长 由文法生成的句子代表植物 , 句子生成 的中间过程代表植物的生长发育过程 L 系统的核心概念是重写 , 即用一系列 重写规则或生成式 , 通过连续地替代简 单原始物体的部分来定义复杂的物体 优点 ◦ 能简洁地描述物体的拓扑结构 ◦ 生成速度很快
- 55.字符重写 Productions b ba a ab a Alphabet ab {a, b} Initiator b ab ab a a ab
- 56.生成植物的步骤 F(3) [-(45) F(1) @L(1) ] F(4) @B(1) where L = and B = F(1) F(3) [ save state -(45) @L(1) ] update state F(4) @B(1)
- 57.Result
- 58.常见特效实现 雾 自然现象 海浪 柔性物体 水波 瀑布
- 59.雾 游戏程序设计中,为了确保图形系统 的速度,图形开发人员往往在位于观察 点远处的场景使用较为简单的三维模型 ,甚至不绘制物体,而在近处则使用复 杂模型,这样可能导致物体变形、突然 消失突然出现等失真现象。 雾化效果可有效避免这种失真。
- 60.雾化原理 中,雾化是通过将景物颜色与雾 的颜色,以随物体到观察点的距离增加 而衰减的混合因子混合而实现的,距离 观察点越近,混合因子越大,场景内的 物体颜色越大,雾的颜色越小,景物就 越清晰;随着观察点拉远,混合因子逐 渐变小,场景中物体的颜色变小,而雾 的颜色变大,景物越来越模型。 Color=f*colorsence+(1-f)*color D3D fog
- 61.雾化原理
- 62.雾
- 63.自然现象 动态云彩:使用纹理贴图,用一个矩 形表示天空背景,在程序运行时,不断 改变矩形四个顶点的纹理坐标,将一福 包含云彩图像的不同部分映射到背景天 空中,从而得到动态效果。
- 64.动态云彩
- 65.自然现象 雨景:粒子技术,每个雨点粒子是一 条短线,即一定长度的线段,把这条线 段当作一个粒子,根据时间的推移,它 根据两个顶点所决定的方向向量,按照 一定的速度下降。实时计算出它的具体 位置,然后在这个位置上将该粒子绘制 出来。
- 66.雨景
- 67.自然现象 雪景:和雨景类似用粒子系统,但雪 花粒子结构比雨点粒子结构复杂得多, 雪花在下降的过程中会不断绕自身翻转 ,所以定义两个表示旋转的角度变量以 及一个表示旋转速度的变量 由于雪花具有不同的形状,因此需使 用多个雪花纹理,在粒子结构中要添加 变量 指明使用哪个雪花理。 纹
- 68.雪花
- 69.海浪效果模拟
- 70.海浪效果模拟 技术:使用纹理贴图 思路:在一个矩形表面应用纹理贴图 表示海面,通过不断改变海面矩形定点 的纹理坐标,实现海浪动画效果。 优点:简单方便 缺点:逼真度比较差。
- 71.海浪效果模拟 - 纹理贴图
- 72.海浪效果模拟 模拟效果比较逼真的方法是根据相关模 型实时生成动态海浪,比较常用的模型 有正弦波海洋模型和摆动海浪海洋模型 。 在正弦波海洋模型中,海洋表面上的波 浪从底到顶分为 10 级,用正弦波连接, 可以通过修改海浪的参数 , 如空间频率, 软 播 速率和相位得到不同的海浪效果。 摆动海浪海洋模型可以定义多个海浪串 相互作用,制作出逼真的三维海面。
- 73.海浪效果模拟 - 正弦波海洋模 型
- 74.柔性物体 自身形状不断发生变化的物体,与刚 性物体有很大不同,对于复杂一点的刚 性物体,在对其进行可视化仿真时通常 是先使用三维建模工具建立其静态模型 ,但是这种方法对柔性物体不再适用, 因为柔性物体的形状不断变化。 因此只能在程序中实时构造柔性物体 的显示模型,并且不断更新其形状。
- 75.柔性物体 模拟的基本过程:从本质上讲柔性物 体还是个三维模型,由顶点、索引及多 边形表面所构成。这些顶点不仅有坐标 ,同时还有自己对应的质量,使顶点成 为质点。随着时间的变化,模拟这些质 点的运动,然后修改对应顶点的坐标, 就可以实现柔性物体的仿真。
- 76.柔性物体 一般使用的技术:粒子系统 + 弹簧结构 例: 飘扬的红旗中,红旗网格的每个交点可用粒 子表示,把用来构造旗子的每个粒子用粒子 系统统一管理,根据每个粒子的受力情况实 时计算粒子的位置,通过不断更新粒子的位 置来实现柔性物体形状的不断变化。(与普 通粒子不同,该粒子还含有质量属性) 弹簧结构用来连接红旗上相邻两个粒子,弹 力可让物体间紧密结合,阻尼可让连接的物 体之间更柔顺。
- 77.柔性物体
- 78.水下效果模拟 主要使用技术:凹凸纹理 D3D 为例):首先创建一个 背景矩形,然后通过凹凸纹理对背景矩 形纹理进行扰动,再将扰动过的背景纹 理贴图到矩形上,从而实现水下效果。 思路(以
- 79.
- 80.水波效果模拟 主要使用技术:凹凸纹理映射 思路:凹凸纹理映射用来生成场景内 水面的波纹,背景图片被用作环境映射 的投影纹理
- 81.
- 82.基于动态纹理的瀑布模拟系统 框架
- 83.Generation of basis texture sprites
- 84.Interactively design flow lines
- 85.Generation of dynamic texture sequence
- 86.Generation of the foam
- 87.Results
- 88.Q&A?