Direct3D 9) (光属性

光属性描述光源的类型和颜色。 根据所用的光的类型,光可以具有衰减和范围属性,或聚光效果属性。 但是,并非所有类型的灯都使用所有属性。 Direct3D 使用 D3DLIGHT9 结构来传递有关所有类型的光源的光属性的信息。 本部分包含所有光线属性的信息。 信息分为以下组。

位置、范围和衰减属性定义了光在世界空间中的位置,以及其发射的光如何随距离而发生变化。 与在 C++ 中使用的所有光属性一样,这些属性包含在光的 D3DLIGHT9 结构中。

光衰减

衰减控制光的强度如何随距离属性指定的最大距离而减弱。 三个 D3DLIGHT9 结构成员表示光衰减:Attenuation0、Attenuation1 和 Attenuation2。 这些成员包含从 0.0 到无穷范围的浮点值,控制光的衰减。 有些应用程序将 Attenuation1 成员设为 1.0,将其他的设为 0.0,导致光强度按 1 / D 发生变化,其中的 D 是从光到顶点的距离。 光强度在光源处最大,在光的范围内减弱到 1 / (光范围)。 通常,应用程序将 Attenuation0 设置为 0.0,将 Attenuation1 设置为常量值,将 Attenuation2 设置为 0.0。

你可以组合衰减值以获得更复杂的衰减效果。 或者,你也可以将它们设为超出正常范围的值,以营造光怪陆离的衰减效果。 但是,不允许使用负衰减值。 请参阅 direct3D 9) (衰减和聚焦因子

光颜色

在 Direct3D 中,光发出在系统照明计算中独立使用的三种颜色:漫射颜色、环境颜色和高光颜色。 它们由 Direct3D 照明模块合并,与来自当前材质的对应物进行交互,以产生在渲染中使用的最终颜色。 漫射颜色与当前材质的漫射属性相互作用,高光颜色与材质的高光反射属性相互作用,依次类推。 有关 Direct3D 如何应用这些颜色的详细信息,请参阅 Direct3D 9) (照明数学

在 C++ 应用程序中, D3DLIGHT9 结构包括这些颜色的三个成员 -“漫射”、“环境”和“镜面”-每个成员都是定义所发出颜色的 D3DCOLORVALUE 结构。

漫射颜色是对系统计算最为重要的颜色类型。 最常见的漫射颜色是白色(R:1.0、G:1.0、B:1.0),但你可以根据需要创建颜色以实现所需的效果。 例如,你可以为壁炉使用红光,或者为“通行”交通信号灯使用绿光。

我们通常将光颜色分量设为介于 0.0 和 1.0(包括端值)之间的值,但这不是必需的。 例如,可以将所有组件设置为 2.0,从而创建“比白色更亮”的灯光。当你使用常量以外的衰减设置时,这种类型的设置特别有用。

请注意,尽管 Direct3D 对光使用 RGBA 值,但不使用 alpha 颜色分量。

通常,材质颜色用于照明。 但是,你可以指定将被漫射或高光顶点颜色覆盖的材质颜色:放射、环境、漫射和高光。 这是通过调用 SetRenderState 并设置下表中列出的设备状态变量来完成的。

设备状态变量 含义 类型 默认
D3DRS_AMBIENTMATERIALSOURCE 定义获取环境材料颜色的位置。 D3DMATERIALCOLORSOURCE D3DMCS_MATERIAL
D3DRS_DIFFUSEMATERIALSOURCE 定义获取漫射材料颜色的位置。 D3DMATERIALCOLORSOURCE D3DMCS_COLOR1
D3DRS_SPECULARMATERIALSOURCE 定义获取反射材料颜色的位置。 D3DMATERIALCOLORSOURCE D3DMCS_COLOR2
D3DRS_EMISSIVEMATERIALSOURCE 定义在何处获取放射材料颜色。 D3DMATERIALCOLORSOURCE D3DMCS_MATERIAL
D3DRS_COLORVERTEX 禁用或允许使用顶点颜色。 BOOL TRUE

 

Alpha/透明度值始终只来自漫射颜色的 Alpha 通道。

雾值始终只来自高光颜色的 Alpha 通道。

D3DMATERIALCOLORSOURCE 可以具有以下值。

  • D3DMCS_MATERIAL - 材料颜色用作源。
  • D3DMCS_COLOR1 - 漫射顶点颜色用作源。
  • D3DMCS_COLOR2 - 反射顶点颜色用作源。

灯光方向

光的方向属性决定了物体发出的光在世界空间中行进的方向。 方向使用矢量描述,并且只有定向光和聚光使用方向。

在光的 D3DLIGHT9 结构的 Direction 成员中设置光线方向。 方向成员的类型为 D3DVECTOR。 方向矢量被描述为与逻辑原点的距离,与光在场景中的位置无关。 因此,不管其位置被定义为何处,沿正 z 轴直线指向场景的聚光具有 <0,0,1> 的方向矢量。 同样,你可以使用方向为 <0,-1,0> 的定向光模拟直接照射在场景中的阳光。 显然,你不必创建沿坐标轴发光的光;你可以混合和匹配值,以创建以更有趣的角度发光的光。

注意

虽然你不需要标准化光的方向矢量,但请务必确保它有度量值。 也就是说,不要使用 <0,0,0> 方向矢量。

 

光位置

使用 D3DLIGHT9 结构的 Position 成员中的 D3DVECTOR 结构描述光线位置。 假定 x、y 和 z 坐标位于世界空间中。 定向光是唯一一种不使用位置属性的光类型。

光范围

光的范围属性决定在世界空间中的场景中的哪些网格处不再接收由该物体发射的光的距离。 Range 成员包含一个浮点值,该值代表光在世界空间中的最大范围。 定向光不使用范围属性。

灯和材料