麒麟子

~~

导航

<2013年5月>
日一二三四五六
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

常用链接

留言簿(12)

随笔分类

随笔档案

Friends

WebSites

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜

为DEMO加入雾化效果

雾化效果

首先来看看我们可以设置哪些参数
1、D3DFOGSTART、D3DFOGEND表示雾的起始和结束距离
2、D3DFOGDENSITY 雾的浓度
3、D3DFOGCOLOR 雾的颜色
4、D3DFOGTABLEMODE、D3DFOGVERTEXMODE 雾的模式,第一个为像素雾化,第二个为顶点雾化


首先看看雾化的方程

Color = f * Color(scene) + (1-f) * color(fog)

Color(scene):背景色
Color(fog): 雾色
f:雾化参数,随观察点的距离的增大而减小,从而可知最后得到的颜色,当观察点越远时,雾色占的比例越大。

雾有四种方式
D3DFOG_NONE 禁用雾化效果
D3DFOG_EXP  雾化效果随指数增加 f = 1/(e^density)
D3DFOG_EXP2 同上,不过公式变为 f = 1/(e^(density^2))
D3DFOG_LINEAR 线性雾 f = (end-d)/(end-start) d 为当前计算点与观察点距离

现在我们来看如何实现雾化
首先开启雾化效果
Device->SetRenderState(D3DRS_FOGENABLE,true);
然后我们要设置雾化的模式和公式
Device->SetRenderState(DEDRS_FOGTABLEMODE,D3DFOG_LINEAR);
这里我将其设置成了像素雾和线性,同样可以将其换成上面介绍的其它模式和公式
接下来我们就要设置雾化参数了
Device->SetRenderState(D3DRS_FOGCOLOR,oxffffffff);//设置成白色

设置start end
float start= 50,end = 400;
Device->SetRenderState(D3DRS_FOGSTART,*(DWORD*)&start);
Device->SetRenderState(D3DRS_FOGEND,*(DWORD*)&end);
设置浓度
float density = 0.001f;//0.0 -- 1.0
Device->SetRenderState(D3DRS_FOGDENSITY,*(DWORD*)&density);

这样,我们的设置就完了,只要将雾化设置放入我们渲染场景中,就可以看到雾化效果了.
但应该注意以下几点
-----------------------------------------line
   A          B          C
    \          |             /
     \                     /
       \       |         /
        \              /
         \    d     /
          \        /
           \   |  /
            \   /
              P
------------------------------------------
雾化效果是以刚刚上面讲的 d 作为计算标准,所以,我们从P点看到A ,B ,C三点的雾化效果是一样的,而按常理,A ,C的雾应该更浓才对.
很显然,这让我们想到,D3D会有对应的处理办法.
D3D提供了基于发散的雾化效果,雾化随观察点的距离增大而增大,就像点光源,不过,这要求我们的硬件支持,所以在设置前应该检查
D3DCAPS9 caps;
Device->GetDeviceCaps(&caps);

if(caps.RasterCaps&D3DPRASTERCAPS_FOGRANGE)
 Device->SetRenderState(D3DRS_RANGEFOGENABLE,true);

把这个增加到雾化设置中即可~~~

已经12点了,估计人有点晕,也讲不明白些什么东西了,到此为止

 


 

posted on 2009-04-20 11:58 麒麟子 阅读(701) 评论(0)  编辑 收藏 引用 所属分类: DirectX