Direct3D材质和灯光小节
mDevice
->
SetRenderState(D3DRS_AMBIENT,
0xffffffff
);
光照
DirectX中有四种光照模型:
环境光:环境光没有方向和位置上的特征,只有一个颜色亮度值,不会衰减,所以在所有方向和所有物体表面投射的环境光的数量是恒定不变的。
漫反射:漫反射在生活中最为普遍,太阳光的直射,日光灯的照射都可以用漫反射光来模拟。漫反射由光的方向和物体表面的法向量决定。漫反射光的空间位置和方向对物体的照明有很大的影响。
镜面反射:当观察金属制品和玻璃制品的表面时,改变观察点的位置,会发现物体表面的亮度也会发生变化,这种现象称之为镜面反射。
自发光:就是物体自身发光,通过设置材质的自发光属性Emissive(颜色和透明度)来实现。自发光可以影响一个对象的颜色。可以使用材质的自发光来实现发光的对象,而不用在场景中添加灯光,减少了计算量。
用自发光属性创建的材质并不发射能被场景中其他物体反射的光,也就是说自发光不参与光照计算。
有三种光源
点光源:点光源有颜色和位置,但是没有方向,它向所有方向发射的光都一样。在程序中需要提供点光源的颜色,位置,衰减系数等参数。
电灯泡是点光源的一个例子。这种光的强度会随着距离物体的远近而衰减。
方向光:只有方向和颜色属性的光源,没有位置,衰减。可以想象成从无穷远处发来的光,例如太阳光。
聚光灯:聚光灯有颜色,位置,方向,类似现实中的探照灯。聚光灯又一个明亮的内椎体和大一点的外椎体组成。光的强度从内椎体到外椎体逐渐衰减,衰减的规律由Falloff,Theta(内锥角)和Phi(外锥角)三个属性共同决定。
DirectX中物体的颜色由光的颜色和材质的颜色共同决定(和现实世界情况不同)。
默认情况下,D3D中的灯光是开启的,就是说写:
mDevice->Set
RenderState(D3DRS_LIGHTING, TRUE);
和忽略这一句效果一样。
![](http://img.e-com-net.com/image/product/696412be261e44caa983ccc5cd2a1540.gif)
如果要禁用灯光,就将这句代码中的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种类型的光源)。