Direct3D光照和材质

Direct3D光照和材质
问题1:现实世界中物体的颜色是怎样产生的
在现实世界中,我们所观察到的物体的颜色是由该物体所反射的光的颜色决定的。例如,一个纯红色的球反射了全部的红色入射光,并吸收了所有非红色光,所以求呈现为红色。Direct3D可以通过定义物体的材质(materials)来模拟这样的现象。材质允许我们定义物体表面对各种颜色光的反射比例。例如:
D3DMATERIAL9 g_Material;
g_Material.Ambient = D3DXCOLOR(1.0f,0.0f,0.0f,1.0f);
g_Material.Diffuse = D3DXCOLOR(1.0f,0.0f,0.0f,1.0f);
g_Material.Specular = D3DXCOLOR(1.0f,0.0f,0.0f,1.0f);
g_Material.Emissive = D3DXCOLOR(0.0f,0.0f,0.0f,1.0f); //自身不发光
上面这个例子表示物体的材质对红光的反射率为100%,对其他的颜色的光不反射(全部吸收),所以物体将成纯红色。

问题2:光照计算模型
真实世界中,光线到达人眼之前经过了物体表面的多次反射。真实世界中光线反射的效果就是光线跟踪算法需要模拟实现的。尽管光线跟踪算法能够创建非常逼真的与自然界中观察到的极为相似的景象,但是还没有实时程序能完成这些运算。Direct3D使用简单的方法进行光照计算。主要包括4钟模型:环境光、漫反射光、镜面反射光和自发光。当然,在可编程流水线,程序员可以编写自己的光照模型。固定管线中,只要我们定义了各种不同的光源类型,硬件就会自动完成这些光照模型的计算

1. 环境光照模型
一个物体即使没有直接被光源照射,但是可以通过其他物体的折射、反射到达该物体,它也能被看见。在基本光照模型中,可以再一个场景中设置一个基准的光亮度,简单的的模拟从不同物体表面所产生的反射光的统一照明,成为环境光(Ambient Light)。环境光没有位置或者方向上的特征,只有一个亮度值,而且不会衰减。Direct3D通过如下方式来设置环境光:
D3DCOLOR ambientColor = D3DCOLOR_XRGB(64,64,64);
Dvice->SettRenderState(D3DRS_AMBIENT,ambientColor);

2. 漫反射光照模型
漫反射模型中,光的入射方向对照明的效果有很大的影响。物体表面顶点的漫反射颜色值Idiffuse的计算公式为:
Idiffuse = k * Ilight * cosθ
其中K为材质反射系数,Ilight 为灯光颜色,通过灯光(Light)结构体去设置(注意不同的光照模型,使用不同光的颜色进行计算,漫反射使用灯光结构体中漫反射的颜色值进行计算),θ为物体表面顶点指向光源位置的方向向量和顶点法线之间的夹角,cosθ当小于0时(从背面射入),Idiffuse为0 。

3. 镜面反射光照模型

物体表面顶点的镜面反射颜色值的计算方法由下图所示:



设物体表面顶点指向观察点的单位向量为V,反射光线为R,R和V之间的夹角为θ,顶点P的镜面反射颜色值可由下式近似计算:
Ispecular = Ks * Ilight * (cosθ)n = Ks * Ilight * (V . R)n
其中,Ks为物体表面材质的镜面反射系数,n为物体表面的光泽属性。
从上面的计算公式中不难看出,镜面反射的计算量比较大,因此在默认状态下,Direct3D不对物体进行镜面反射计算,如果要激活Direct3D镜面反射光照计算,需要设置相关的渲染状态,代码如下:
g_device->SetRenderState(D3DRS_SPECULARENABLE, TRUE);

4. 自发光模型
自发光是指对象自己发出的光。自发光其实就是通过对象的自发光材质实现的。用结构D3DMATERIAL9的成员Emissive描述自发光的颜色和透明度。自发光可以影响一个对象的颜色,例如通过设置灰暗材质的自发光颜色属性可以使其变得明亮一点。可以使用材质的自发光属性实现发光的对象,而不用在场景内添加灯光,从而缩小了计算量。例如,可以通过具有蓝色自发光属性的材质实现一块蓝色水晶,而不在场景内添加其他灯光。用自发光属性创建的材质并不发射出能被场景内其他对象反射的光,也就是说,它发出的光不参与光运算。为了实现反射光,必须在场景内添加额外的灯光。

问题3:对光照计算的说明
现实中的光照效果可以通过这些光照类型进行模拟。具体采用哪种或哪几种光照计算模型,是由物体表面的材质决定的。例如,表面粗糙的材质,我们用漫反射模型进行计算,光滑的物体,我们应当加入镜面反射进行计算。

问题4:Direct3D的光源
Direc3D支持3种光源,方向光(directional light)、点光源(point)和聚光灯(spot light)
其中点光源有颜色和位置,但没有方向,有点像现实中的灯泡。方向光有颜色和方向,但没有位置,而且不会衰减,有点类似现实中的太阳光。聚光灯有颜色、位置、方向,有一个明亮的内椎跟大一点的外椎,光线从内向外衰减,跟现实中的探照灯类似。Direct3D根据不同的光源和不同光照模型来模拟现实世界的光照。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值