(Direct3D 9) 的环境照明
环境光为场景提供恒定照明。 它会无差别地点亮所有对象顶点,因为它不取决于任意其他照明因素,例如,顶点法线、光线方向、光线位置、范围或衰减。 它是最快的照明类型,但它产生最不真实的结果。 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 | 第 i 道光的光线衰减。 请参阅 direct3D 9) (衰减和聚焦因子 。 |
Spoti | (0,0,0,0) | D3DVECTOR | 第 i 道光的聚焦因素。 请参阅 direct3D 9) (衰减和聚焦因子 。 |
sum | 空值 | 空值 | 环境光的总和 |
Lai | (0,0,0,0) | D3DVECTOR | 第 i 道光的光环境颜色 |
Cₐ 的值为:
- vertex color1,如果 AMBIENTMATERIALSOURCE = D3DMCS_COLOR1,并在顶点声明中提供第一个顶点颜色。
- vertex color2,如果 AMBIENTMATERIALSOURCE = D3DMCS_COLOR2,并在顶点声明中提供第二个顶点颜色。
- 材料环境颜色。
注意
如果使用任一 AMBIENTMATERIALSOURCE 选项,并且未提供顶点颜色,则使用材料环境颜色。
若要使用材料环境颜色,请使用 SetMaterial,如以下示例代码所示。
Gₐ 是全局环境颜色。 它被设置为使用 SetRenderState(D3DRS_AMBIENT)。 Direct3D 场景中有一种全局环境颜色。 此参数不与 Direct3D 光对象关联。
Lai 是场景中第 i 道光的环境颜色。 每个 Direct3D 灯都有一组属性,其中一个属性是环境光。 sum(Lai) 术语是场景中所有环境光的总和。
示例
在此示例中,使用场景环境光和材料环境光为对象着色。
#define GRAY_COLOR 0x00bfbfbf
// create material
D3DMATERIAL9 mtrl;
ZeroMemory(&mtrl, sizeof(mtrl));
mtrl.Ambient.r = 0.75f;
mtrl.Ambient.g = 0.0f;
mtrl.Ambient.b = 0.0f;
mtrl.Ambient.a = 0.0f;
m_pd3dDevice->SetMaterial(&mtrl);
m_pd3dDevice->SetRenderState(D3DRS_AMBIENT, GRAY_COLOR);
根据公式,生成的对象顶点颜色是材料颜色和光颜色的组合。
下面两个图例显示了材料颜色(灰色)和光颜色(鲜红色)。
红色
生成的场景显示在以下图例中。 场景中的唯一对象是一个球体。 环境光使用相同的颜色点亮所有对象顶点。 它不取决于顶点法线或光线方向。 因此,球体看起来像 2D 圆形,因为对象表面周围的着色没有差别。
若要为对象提供更逼真的外观,除环境光外,请应用漫射或镜面反射。
相关主题