C++优雅之旅

探索C++

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  15 随笔 :: 0 文章 :: 20 评论 :: 0 Trackbacks
mDevice->SetRenderState(D3DRS_AMBIENT, 0xffffffff);
      光照

DirectX中有四种光照模型:

环境光:环境光没有方向和位置上的特征,只有一个颜色亮度值,不会衰减,所以在所有方向和所有物体表面投射的环境光的数量是恒定不变的。

漫反射:漫反射在生活中最为普遍,太阳光的直射,日光灯的照射都可以用漫反射光来模拟。漫反射由光的方向和物体表面的法向量决定。漫反射光的空间位置和方向对物体的照明有很大的影响。

镜面反射:当观察金属制品和玻璃制品的表面时,改变观察点的位置,会发现物体表面的亮度也会发生变化,这种现象称之为镜面反射。

自发光:就是物体自身发光,通过设置材质的自发光属性Emissive(颜色和透明度)来实现。自发光可以影响一个对象的颜色。可以使用材质的自发光来实现发光的对象,而不用在场景中添加灯光,减少了计算量。

用自发光属性创建的材质并不发射能被场景中其他物体反射的光,也就是说自发光不参与光照计算。

有三种光源

点光源:点光源有颜色和位置,但是没有方向,它向所有方向发射的光都一样。在程序中需要提供点光源的颜色,位置,衰减系数等参数。

电灯泡是点光源的一个例子。这种光的强度会随着距离物体的远近而衰减。

方向光:只有方向和颜色属性的光源,没有位置,衰减。可以想象成从无穷远处发来的光,例如太阳光。

聚光灯:聚光灯有颜色,位置,方向,类似现实中的探照灯。聚光灯又一个明亮的内椎体和大一点的外椎体组成。光的强度从内椎体到外椎体逐渐衰减,衰减的规律由Falloff,Theta(内锥角)和Phi(外锥角)三个属性共同决定。

    DirectX中物体的颜色由光的颜色和材质的颜色共同决定(和现实世界情况不同)。

    默认情况下,D3D中的灯光是开启的,就是说写:

mDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
    和忽略这一句效果一样。
   

 

    如果要禁用灯光,就将这句代码中的TRUE改为FALSE。

1 mDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
   
    如果禁用灯光,那么任何的材质设置都不会有效果。
2 mDevice->SetRenderState(D3DRS_AMBIENT, 0xffffffff);
   
    关于这两句代码(编号为1和2),又有几种情况:
    1)1为FALSE时,启用2,那么会获得一个环境光照明,此时设置材质无效(渲染对象为白色),纹理可以正常显示(如果有纹理)。
    2)1为TRUE时,启用2,材质设置有效,会影响渲染结果,纹理可以正常显示。
    3)1为FALSE时,禁用2,材质设置失效,纹理可以正常显示。
    4)1为TRUE时,禁用2,材质设置失效,纹理无法显示(渲染对象为黑色)。

   P.S.以上所说的材质指的是D3DMATERIAL9,不包括顶点色。带有顶点色时,1为TRUE时渲染为黑色,FALSE时为正常,和2的状态无关。

    结论:当开启光照时,必须指定一种光源才能使渲染对象正确绘制(渲染状态设置的环境光或者其他3种类型的光源)。

 

posted on 2009-05-14 02:53 林公子 阅读(1297) 评论(0)  编辑 收藏 引用 所属分类: DirectX

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理