雾化的实现原理:
雾化是通过将景物颜色与雾的颜色,以随物体到观察点距离增加而衰减的混合因子混合而实现的。距离观察点越近,混合因子越大,场景内的物体颜色越大,雾的颜色越小,景物就越清晰;随着观察点拉远,混合因子逐渐变小,场景中物体的颜色变小,而雾的颜色变大,景物越来越模糊。 雾化的计算方法如下:
Color = f*Color(场景) + (1-f)*Color(雾)
其中Color(场景)表示物体原来的颜色, Color(雾)表示应用程序中定义的雾的颜色,f表示雾化混合因子,Color表示最终经过雾化处理的颜色。
雾化混合因子的计算:
从上面的计算方法可以看出,影响雾化效果的因素有两个,雾化混合因子和雾的颜色。通常指定雾的颜色为白色,当然也可以指定其他任何颜色以实现特殊效果。所以大多数情况下考虑的是雾化混合因子对于雾化效果的影响。
枚举常量D3DFOGMODE定义了三种雾化公式。
所以不同的雾化公式对应不同的雾化模式。
雾化的方法有两种方法。
顶点雾化:在顶点坐标变换和光照流水线阶段实现,它根据物体多边形每个顶点到观察点的距离计算每个顶点的雾化程度,然后在多变形面上根据计算结果进行插值,得到每个像素点的值。
像素雾化:根据每个像素相对于观察点的深度计算雾化效果值。
代码:
g_pd3dDevice->SetRenderState(D3DRS_FOGCOLOR,0xffffffff); //设置雾化颜色
g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE, true); //激活雾化
g_pd3dDevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);//设置雾化混合因子计算公式
g_pd3dDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD*)&fogStart);//设置线性雾化开始位置和结束位置
g_pd3dDevice->SetRenderState(D3DRS_FOGEND, *(DWORD*)&fogEnd);
浙公网安备 33010602011771号