环境光

环境光为场景提供恒定照明。 它会无差别地点亮所有对象顶点,因为它不取决于任意其他照明因素,例如,顶点法线、光线方向、光线位置、范围或衰减。 环境光在所有方向都是恒定的,并且会无差别地为某个对象的所有像素上色。 这是一种快速计算,但会让对象看上去扁平且不逼真。

环境照明是最快的照明类型,但它产生最不真实的结果。 Direct3D 包含一个全局环境光属性,无需创建任何光线即可使用。 或者,你可以设置任何光对象以提供环境照明。

以下公式描述了场景的环境照明。

环境光 = Cₐ*[Gₐ + sum(Atteni*Spoti*Lai)]

其中:

参数 默认值 类型 描述
Cₐ (0,0,0,0) D3DCOLORVALUE 材料环境颜色
Gₐ (0,0,0,0) D3DCOLORVALUE 全局环境颜色
Atteni (0,0,0,0) D3DCOLORVALUE ith light 的光衰减。 请参阅衰减和聚焦因素
Spoti (0,0,0,0) D3DVECTOR 光的聚光因素。 请参阅衰减和聚焦因素
sum 空值 空值 环境光的总和
Lai (0,0,0,0) D3DVECTOR Ith light 的浅色环境颜色

 

Cₐ 的值为:

  • vertex color1,如果 AMBIENTMATERIALSOURCE = D3DMCS_COLOR1,并在顶点声明中提供第一个顶点颜色。
  • vertex color2,如果 AMBIENTMATERIALSOURCE = D3DMCS_COLOR2,并在顶点声明中提供第二个顶点颜色。
  • 材料环境颜色。

注意 如果使用任一 AMBIENTMATERIALSOURCE 选项,且未提供顶点颜色,则使用材料环境颜色。

 

若要使用材料环境颜色,请使用 SetMaterial,如以下示例代码所示。

Gₐ 是全局环境颜色。 它被设置为使用 SetRenderState(D3DRS_AMBIENT)。 Direct3D 场景中有一种全局环境颜色。 此参数不与 Direct3D 光对象关联。

Lai 是场景中光线的环境颜色。 每个 Direct3D 光都有一组属性,其中一种是环境颜色。 术语 sum(Lai)是场景中所有环境颜色的总和。

示例

在此示例中,使用场景环境光和材料环境光为对象着色。

#define GRAY_COLOR  0x00bfbfbf

Ambient.r = 0.75f;
Ambient.g = 0.0f;
Ambient.b = 0.0f;
Ambient.a = 0.0f;

根据公式,对象顶点的结果颜色是材料颜色和浅色的组合。

下面的两个图示显示了材料颜色,即灰色,浅色,红色为亮红色。

灰色球体插图红色球体插图

生成的场景如下图所示。 场景中的唯一对象是一个球体。 环境光会照亮所有具有相同颜色的对象顶点。 它不取决于顶点法线或光线方向。 因此,球体看起来像 2D 圆形,因为对象表面周围的着色没有差别。

带环境照明的球体插图

若要为对象提供更逼真的外观,除了环境照明外,还应用漫射或反射照明。

照明的数学运算