麒麟子

~~

导航

<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

常用链接

留言簿(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 麒麟子 阅读(524) 评论(0)  编辑 收藏 引用 所属分类: DirectX


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理