您好,欢迎访问三七文档
游戏中的高级图形技术浙江大学软件学院梁秀波Email:liangxb@cst.zju.edu.cn本次授课内容•阴影生成•Billboard技术•过程式建模技术•基于物理原理的仿真(水,烟、雪、雾)•自然现象模拟:海水、瀑布、大气散射、折射阴影生成•阴影的必要性•阴影术语•常用实时阴影的绘制方法–投影阴影(projectionshadow)–阴影纹理(shadowtexture)–阴影体(shadowvolume)–阴影图(shadowmap)–阴影体与阴影图的比较阴影的必要性•增加场景真实感•帮助理解物体的位置关系无阴影硬阴影软阴影阴影术语•遮挡体(occlude)•接收体(receiver)•本影(umbra)•半影(penumbra)阴影术语(续)•硬阴影(hardshadow)–点光源产生•软阴影(softshadow)–线光源、面光源或体光源产生–随着光源变大,软阴影的本影区会逐渐变小,甚至消失–常对硬阴影边缘模糊处理,制造伪软阴影投影阴影(projectionshadows)•对三维物体进行两次绘制,得到其投影到某平面上的矩阵•接收面为y=0的投影矩阵计算:接收体平面y=0设光源的位置为l,需要投影的顶点为v,投影点为p,可得p点的x坐标:同理,可以计算得到p点的z坐标投影:因为y坐标投影为0,这样得到投影矩阵M:0yyxxyxxxxxyyyyllvlvplpvllvlv/zyzzyyyplvlvlv00000000010yxxyylllllM投影阴影(续)•接收面为n·x+d=0的投影矩阵计算:p的投影点为:转化为矩阵形式,得到投影矩阵M:()dnlplvln(vl)xxxyxzxyxyyyzyzxzyzzzxyzdlnlnlnldlndlnlnldlnlndlnldnnnnlnlMnlnl投影阴影绘制•将投影矩阵应用到遮挡物体,然后以无光照和较黑的颜色绘制投影物体。•应避免投影多边形和接收体平面重合的情形发生,否则会发生绘制错误并闪烁。–方法一:给接收体平面加一定的偏移量–方法二:先绘接收体平面,然后在关掉z-buffer的情况下绘制投影多边形–意外情况:投影多边形落在接受体平面外面•解决方法:使用stencilbuffer投影阴影缺陷•只适合平面阴影接受体。•会产生反影错误•左:正确阴影•右:反影•即使阴影没有发生变化,对于每一帧,阴影也必须重新绘制。•解决办法:阴影是与视点无关的,一个实用可行的方案为把阴影绘制成一幅纹理,只在光源、遮挡物和接收体发生变化时才重绘阴影纹理。阴影纹理(shadowtexture)•将平面投影阴影扩展到曲面:将生成的阴影图像作为一个纹理,应用到曲面上阴影体(shadowvolume)•给定一个点和一个三角形,连接该点和三角形的顶点并延伸,可得到一无限的金字塔。•如果给定的点为光源,则物体在截头无限金字塔之内的任何部分为阴影。因此称截头无限金字塔为阴影体(shadowvolume)阴影体(续)•遮挡体和光源投射生成阴影体–在阴影体内的物体处于阴影状态阴影体二维剖面图遮挡体部分被遮挡物体光源视点(注意:阴影是与视点无关的)阴影体内的表面(处于阴影范围)阴影体外的表面(受照明)阴影体(无限延伸)z-pass算法•从视点向物体引一条视线,当这条射线进入阴影体(穿过其正面)时,stencil值加一,这条射线射出阴影体(穿过其背面)时stencil值减一•如果stencil值为零,表示物体不在阴影里计数=2,在阴影中z-pass具体步骤•Pass1:enablez-bufferwrite,绘制整个场景,得到关于所有物体的depthmap•Pass2:disablez-bufferwrite,enablestencilbufferwrite,然后绘制所有的阴影体。对于阴影的正向多边形(即面对视点的这一面),如果深度测试的结果是pass,那么和这个象素对应的stencil值加一。如果深度测试的结果是fail,stencil值不变。而对于阴影体的背面(远离视点的一侧),如果深度测试的结果是fail,stencil值减一,否则保持不变。z-pass算法缺陷•视点在阴影体中时会导致错误z-fail算法•由JohnCarmack,BillBilodeau和MikeSongy各自独立发明•解决视点进入shadowvolume后z-pass算法失效的问题。•基本想法:光线穿过的阴影体正面数量大于背面数量,则该点位于阴影中z-fail算法(续)z-fail算法步骤•Pass1:enablez-write/z-test,绘制整个场景,得到depthmap。(这一步和z-pass的完全一样)•Pass2:disablez-write,enablez-test/stencil-write。绘制阴影体,对于它的背面,如果深度测试的结果是fail,stencil值加一,如果深度测试的结果是pass,stencil值不变。对于正面,如果深度测试的结果是fail,stencil值减一,如果结果是pass,stencil值不变阴影体使用实例StentilBuffer最终场景阴影图(shadowmap)•Williams1978•基本思想:场景中的阴影就是从光源角度来看,不可见的区域。•以光源为视点,绘制depthmap,用深度测试判断某一点是否对光源可见(被照亮)光源视棱锥阴影图(depthbuffer)阴影图具体步骤•Pass1:以光源为视点绘制一depthmap,称为阴影图•Pass2:以相机为视点绘制最终场景,将可见点转化到光源坐标系中,将其z值与阴影图中的相应点比较,(几乎)相等,则该点被照亮;大于,则该点处于阴影中•注意:阴影图的depthmap是以光源为视点,阴影体的depthmap是以相机为视点阴影图具体步骤(续)•z_ls=光源到点A的距离•z_sm=阴影图中保存的深度值•如果z_ls=z_sm点A被照亮•如果z_lsz_sm点A在阴影中•显然,这里,点A与点B对应同一个z_sm,点B是被照亮的,而点A处于阴影中AB阴影图算法的问题•偏移量(bias)–阴影图是点采样方法,阴影图中的z值与被照亮点的z值会存在一定偏差–解决方法:在深度比较中加入一个偏移量–Bias的设置:过大或过小都会导致错误结果Bias太小,“阴影痤疮”Bias太大,“阴影泄漏”阴影图算法的问题(续)•走样(alias)–视点拉近阴影边缘–大型场景–视点与光源方向相对–光源与接收面接近平行•解决方法–提高阴影图有效分辨率–与阴影体算法相结合–对阴影边缘进行模糊,制作伪阴影阴影体vs阴影图•都支持动态场景,且有硬件支持•阴影体–几何空间–高带宽占用,高填充率–精度高•阴影图–图像空间–低消耗–精度很大程度受阴影图分辨率制约Billboards(适用于室外场景)•Billboard其实一个非常极端的LOD简化方法,将所有的几何简化为一个或者多个带纹理的多边形。–可以看做一种基于图像的绘制方法–本质上,所有基于图像的方法都是为了代替几何•如何设计billboards呢?–他们是如何生成的?–他们如何绕观察者旋转?–如何改进它们?•这种方法也叫sprites(三维精灵),是一个总是平行于成像平面的精灵生成Billboards•手工–经验的艺术工作者–绘制颜色和透明度–然后生成一系列动画•自动生成:–绘制复杂模型,并将结果图像保存为billboard–透明度可以自动地从背景象素和前景图像中检测出来Billboard配置•表示billboard的多边形可以被放置成不同的方式–单个四边形–两个垂直的四边形–沿着公共轴的多个四边形–几个层叠的四边形•问题是:–对于何种物体,选择何种billboards表示呢?–如何选择billboard使得它总是面向观察者?–如何绘制billboard?单个多边形表示的Billboards•Billboard由单个带纹理映射的多边形表示•它必须永远指向观察者,否则在某些视点处会消失–除非:Billboards都是带纹理的封闭的墙!•两个最主要的排列Billboards的方式:–对billboard分配一个up方向,并且使得它总是与观察者的up方向平行–将billboard绕一个中心轴旋转,使得它总是面对观察者关于轴对齐•A是billboard的轴,V观察者的X方向,F是当前billboard的朝向,D是需要的朝向•D的计算方法:•F与D的夹角:AVFDAVADDFDF1cos多个多边形组成的Billboards•使用两个四边形:–与观察者不平行•四边形越多,效果越好•绘制时有两个选项:融合操作或者仅仅做深度比较视点依赖的Billboards•当物体不是旋转对称的时候怎么办?–对于不同的视角,物体外观必然改变•Billboards方法依然是有效的:–对每个不同的视点计算多个纹理图像–绘制对不同的视点,保持多边形不变,但是改变纹理图像–最好在两个最近的视点之间进行插值、纹理融合操作•可利用三维纹理和硬件纹理滤波操作获得较好的效果•如果多边形保持不变,那么会限制视角的变化–解决方案:对于某些不同的视角,选用不同的多边形Impostor方法•将原来的物体看成体,进行切片操作,并且融合它们。•在某视点,渲染引擎首先将树的三维模型绘制到纹理,以该纹理作为Billboard的纹理绘制。~aleks/slicing-and-blending/过程式建模技术•粒子系统–烟,瀑布的模拟–包括介绍OGRE的粒子系统及代码分析•L-系统–植被的构造粒子系统•粒子的属性–位置,速度,加速度,能量,方向•采用形状简单的微小粒子为基本元素,通过位置组合和运动效果模拟自然界中不规则的模糊景物–如火,雪,烟,植被等•主要步骤–生成粒子–更新粒子–删除粒子–绘制粒子粒子系统•粒子系统的优点是:–①简单体素和复杂物体行为有机结合。例如:利用粒子系统可以很容易地生成火焰和喷泉。–②易于实现。只要提供给用于粒子属性的随机过程一些参数即可定义一个粒子系统。–③粒子简单,易于显示,而且显示效率较高。•主要缺点是:–①每一时间步均需要计算粒子的动态属性,增加计算开销。–②粒子的几何特性过于简单,可以构造的物体范围有限。ExampleExampleOGRE的粒子系统•粒子是用四边形来表示的•粒子属性封在粒子属性变换器(Affector)中–包含颜色衰退变换(ColourFaderAffector)–线形影响变换器(LinearForceAffector)•粒子由粒子发生器(Emmiter)产生–包含盒状粒子发生器(BoxEmmitter)–点状粒子发生器(PointEmmiter)OGRE的粒子系统ParticleAffectorParticleEmitterParticleAffectorFactoryParticleEmitterFactoryParticleSystemManagerAreaEmitterFactoryMethodPatternParticleSystem0..n10..n10..n10..n10..n1Particle0..n10..n1BoxEmitterFactoryPointEmitterFactoryRingEmitterFactoryPointEmitterBoxEmitterRingEmitterColourFaderAffectorFactoryLinearForceAfectorFactory0..n1ColourFaderFactoryLinearForceFactoryFlyweightPattern代码分析-粒子系统模板•//盒状粒子发射器•emitterBox•{•angle30//粒子发射时偏离direction的最大角度•emission_rate30//发射速率
本文标题:游戏高级图形
链接地址:https://www.777doc.com/doc-7245640 .html