《游戏设计雾化》PPT课件.ppt
m,Lecture 12 Fog 雾化,雾化效果是计算机图形学中应用最广的效果之一。能显著地增加视觉效果的真实感提供一定的深度感。在实时图形程序,特别是游戏设计程序中,为了确保图形系统的运行速度,图形开发人员往往在位于观察点远处的场景使用较为简单的三维模型,甚至不绘制物体,而在近处使用复杂模型,这样就可能造成物体变形、突然出现或突然消失等失真现象,雾化效果可以有效地避免这种失真现象。,m,Contents,雾化效果实现原理雾化混合因子计算方法顶点雾化与像素雾化添加雾化效果,m,在Direct3D图形系统中,雾化是通过将景物颜色与雾的颜色,以随物体到观察点距离增加而衰减的混合因子混合而实现的。距离观察点越近,混合因子越大,场景内的物体颜色越大,雾的颜色越小,景物就越清晰;随着观察点拉远,混合因子逐渐变小,场景中物体的颜色变小,而物的颜色变大,景物越来越模糊。Direct3D计算雾化的方法如下:其中,color表示最终经过雾化处理的颜色,colorscene表示物体原来的颜色,colorfog表示应用程序中定义的雾的颜色,f表示雾化混合因子,m,雾化效果实现原理,color=f*colorscene+(1-f)*colorfog,影响雾化效果的因素有两个:一个是雾化混合因子,另一个是雾的颜色。通常指定雾的颜色为白色,当然也可以指定其他任何颜色以实现特殊效果。大多数情况下考虑的是雾化混合因子对于雾化效果的影响 通过指定Direct3D雾化计算公式,可以定义Direct3D图形程序中雾化效果随距离增加的趋势,雾化公式计算的结果就是雾化混合因子。,m,雾化混合因子计算方法,color=f*colorscene+(1-f)*colorfog,雾化效果是物体可见程度的反映,雾化混合因子越小,物体的可见度越低。枚举常量D3DFOGMODE定义了三种雾化公式:,m,雾化混合因子计算方法,typedef enum _D3DFOGMODE D3DFOG_NONE=0,D3DFOG_EXP=1,D3DFOG_EXP2=2,D3DFOG_LINEAR=3,D3DFOG_FORCE_DWORD=0 x7fffffff,D3DFOGMODE,*LPD3DFOGMODE;,雾化混合因子 f 随距离 d 而呈线性、指数、指数平方变化。由雾化公式计算得到的雾化混合因子 f 将用于Direct3D雾化计算公式,计算最终颜色。从三种雾化混合因子f计算公式和雾化计算公式可以看出,物体距离观察点越远,f越小,物体原色越小,雾化颜色越多,物体越模糊。,m,雾化混合因子计算方法,Direct3D采用了两种方法进行雾化处理,顶点雾化和像素雾化。顶点雾化是在Direct3D顶点坐标和光照流水线阶段实现,它根据物体多边形每个顶点到观察点的距离计算每个顶点的雾化程度,然后在多边形面上根据计算结果进行插值,得到每个像素点的值。像素雾化在Direct3D像素绘制阶段实现,它根据每个像素相对于观察点的深度计算雾化效果值,与顶点雾化相比,像素雾化计算更为精确,但同时也耗费更多的系统资源。,m,顶点雾化与像素雾化,顶点雾化与基于范围的雾化有时候,使用雾化会导致图像失真,即物体颜色和雾化颜色以意想不到的方式混合。对于顶点雾化,在默认情况下,雾化混合因子计算公式中的距离 d 为物体在观察坐标系中的深度值,这在某些情况下会导致失真。例如,在一个场景中有A、B两个物体,它们与观察点的距离相同,从理论上说,它们应具有相同的雾化效果,然而Direct3D默认以它们在观察坐标系中的深度值(即 z 值)作为d计算雾化效果,因此会导致物体A和B的雾化效果明显不同。,m,顶点雾化与像素雾化,顶点雾化与基于范围的雾化Direct3D为顶点雾化提供了基于范围的雾化处理(range-based fog),在基于范围的雾化处理中,使用物体和观察点之间的实际距离作为参数 d 进行雾化混合因子的计算,因为雾化效果更精确,代价是计算量大。要使用基于范围的雾化,首先需要检查当前设备是否支持基于范围的雾化,检查的示例代码如下:,m,顶点雾化与像素雾化,D3DCAPS9 caps;g_device-GetDeviceCaps(,如果设备支持基于范围的雾化处理,则需激活:g_device-SetRenderState(D3DRS_RANGEFOGENABLE,TRUE);,像素雾化和与眼相关深度雾化顶点雾化得到了Direct3D硬件广泛支持,而且这种类型的雾化处理在大多数情况下可以正常工作,但当使用较大的多边形时也会出现问题。如果某个顶点与虚拟摄像机太近,而另一个顶点在雾化区域的某个位置,那么顶点雾化就会在这两个顶点之间进行线性插值,得到各个像素的雾化效果,这样计算的结果与雾化方程式对每个像素应用所得到的结果区别较大。为了提供更准确的雾化效果,Direct3D支持像素雾化处理功能。Direct3D中的像素雾化处理针对每个像素进行计算,m,顶点雾化与像素雾化,像素雾化和与眼相关深度雾化利用预先计算好的查找表格决定雾化因子。每个像素的深度将用于计算雾化因子,利用D3DFOGMODE类型的成员D3DFOG_LINEAR、D3DFOG_EXP、D3DFOG_EXP2定义的雾化公式都可以用于像素雾化。根据设备的不同,可以不同方式实现像素雾化公式。如果设备不支持所需使用的雾化公式,可以编写代码实现较为简单的公式,必要的话使用线性雾化公式。注意:像素雾化功能不支持基于范围的雾化计算。,m,顶点雾化与像素雾化,像素雾化和与眼相关深度雾化为了减轻z值在深度缓冲区内不均匀分布所造成的与雾化相关的图像失真,大多数硬件设备使用与眼相关深度(eye-relative depth)代替基于z坐标的深度值进行像素雾化。Direct3D使用设备空间中顶点的RHW元素来生成真正的与眼相关的深度值。如果一个设备支持与眼相关深度雾化,则当调用函数IDirect3DDevice9:GetDeviceCaps()时,结构体D3DCAPS9的成员RasterCaps将被设置为D3DPRASTERCAPS_WFOG。参考光栅器(reference rasterizer)是个例外,软件设备总是使用顶点的z坐标值来计算像素雾化效果。,m,顶点雾化与像素雾化,添加顶点雾化效果需要对Direct3D渲染设备进行3个方面的设置:激活雾化效果:Direct3D在默认情况下禁用雾化效果。g_device-SetRenderState(D3DRS_FOGENABLE,TRUE);设置雾化混合因子计算公式采用函数IDirect3DDevice9:SetRenderState()设置雾化混合因子计算公式。如果想使用顶点雾化,将第一个参数设置为D3DRS_FOGVERTEXMODE渲染状态,第二个参数设置为枚举类型D3DFOGMODE中的一个成员来设置相应的雾化公式,m,添加雾化效果,设置雾化参数雾化参数包括雾的颜色和用于计算雾化混合因子f的相关参数。(1)雾的颜色通过渲染状态D3DRS_FOGCOLOR设置:g_device-SetRenderState(D3DRS_FOGCOLOR,0 xFFAA8888);(2)雾化混合因子f,需要根据选择的雾化计算公式在相关的渲染状态中设置相关的雾化参数,包括为线性雾化设置开始和结束距离以及为指数雾化和指数平方雾化设置雾的浓度。渲染状态D3DRS_FOGSTART和D3DRS_FOGEND用于设置线性雾化的开始点和结束点到观察点的距离。渲染状态D3DRS_FOGDENSITY用于设置呈指数雾化或指数平方雾化的浓度,浓度为浮点值,取值范围为0.0 1.0,m,添加雾化效果,示例代码:,m,添加雾化效果,static float fog_start=50;static float fog_end=300;g_device-SetRenderState(D3DRS_FOGENABLE,TRUE);g_device-SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_LINEAR);g_device-SetRenderState(D3DRS_FOGSTART,*(DWORD*),static float fog_density=0.01f;g_device-SetRenderState(D3DRS_FOGDENSITY,*(DWORD*),示例程序:顶点雾化像素雾化基于范围的雾化,m,添加雾化效果,在设置雾的颜色时,可将雾的颜色与背景颜色设为一致,这样,远处的物体看起来就像逐渐融入到背景之中,视觉效果比较逼真雾的参数中,雾的开始距离和最大距离只对线性雾化有效。雾的浓度只对指数雾化和指数平方雾化有效SetRenderState()函数的第二个类型参数为DWORD,所以雾化参数(雾的颜色除外),不能直接使用数值,必须使用变量程序中需设置合适的投影变换矩阵以确保雾化效果正确,m,说明,Make Sense?,