漫射照明 (Direct3D 9)

在调整光线强度以实现任意衰减效果后,光线引擎基于顶点法线的角度和入射光线的方向计算从顶点折射了多少剩余光线。 光线引擎会跳到此步处理定向光,因为它们不会随距离衰减。 系统会考虑两种反射类型,即漫射和反射,并使用不同的公式确定分别为它们反射多少光。 在计算反射多少光后,Direct3D 将这些新值应用于当前材料的漫射和镜面反射属性。 产生的颜色值为漫射和反射分量,光栅器用此来产生高氏着色和反射高光。

漫射照明可用以下公式说明。

Diffuse Lighting = sum[Cd*Ld*(N.Ldir)*Atten*Spot]

参数 默认值 类型 说明
sum 空值 空值 每束光线的漫射分量的总和。
Cd (0,0,0,0) D3DCOLORVALUE 漫射颜色。
Ld (0,0,0,0) D3DCOLORVALUE 光漫射颜色。
N 空值 D3DVECTOR 顶点法线
Ldir 空值 D3DVECTOR 从物体顶点到光线的方向矢量。
Atten 空值 FLOAT 光衰减。 请参阅 衰减和聚焦因子 (Direct3D 9)
现付 空值 FLOAT 聚焦因素。 请参阅 衰减和聚焦因子 (Direct3D 9)

 

Cd 的值为:

  • 顶点颜色 1,如果 DIFFUSEMATERIALSOURCE = D3DMCS_COLOR1,并且第一个顶点颜色在顶点声明中提供。
  • 如果 DIFFUSEMATERIALSOURCE = D3DMCS_COLOR2,则为顶点颜色 2,并在顶点声明中提供第二个顶点颜色。
  • 材料漫射颜色

注意

如果使用任一扩散材料资源选项,并且未提供顶点颜色,则使用材料漫射颜色。

 

若要计算 Atten) (衰减或聚焦特征 (Spot) ,请参阅 Direct3D 9) (衰减和聚焦因子

单独处理和内插所有灯光后,将漫射分量的范围限制为 0 至 255。 生成的漫射照明值是环境、漫射和放射光值的组合。

示例

在此示例中,使用光漫射颜色和材料漫射颜色为对象设置颜色。 代码如下所示。

D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );

D3DLIGHT9 light;
ZeroMemory( &light, sizeof(light) );
light.Type = D3DLIGHT_DIRECTIONAL;

D3DXVECTOR3 vecDir;
vecDir = D3DXVECTOR3(0.5f, 0.0f, -0.5f);
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );

// set directional light diffuse color
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
light.Diffuse.a = 1.0f;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );

// if a material is used, SetRenderState must be used
// vertex color = light diffuse color * material diffuse color
mtrl.Diffuse.r = 0.75f;
mtrl.Diffuse.g = 0.0f;
mtrl.Diffuse.b = 0.0f;
mtrl.Diffuse.a = 0.0f;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);

根据公式,生成的对象顶点颜色是材料颜色和光颜色的组合。

下面两个图例显示了材料颜色(灰色)和光颜色(鲜红色)。

红色球体的灰色球体插图

生成的场景显示在以下图例中。 场景中的唯一对象是一个球体。 漫射光线计算使用材料和光漫射颜色,并使用点产品按光线方向和顶点法线之间的角度对其进行修改。 因此,球体背面会变得更暗,因为球体曲线表面远离光线。

有漫射照明的球体图示

组合漫射光与上一示例中的环境光可以使对象的整个表面变暗。 环境光使整个表面变暗,而漫射光帮助显露对象的 3D 形状,如下图所示。

有漫射照明和环境照明的球体图示

漫射照明的计算强度高于环境照明。 因为这取决于顶点法线和光线方向,你可以在 3D 空间中查看对象几何结构,这会产生比环境照明更逼真的照明。 你可以使用反射高光达到更逼真的外观。

照明的数学运算