照明概述

当您使用 Direct3D 照明时,您可以让 Direct3D 为您处理光照的细节。 如果愿意,高级用户可以自行进行照明设置。

启用照明后,Direct3D 会基于以下组合计算每个对象顶点的颜色:

  • 关联的纹理映射中的纹素。
  • 顶点的漫射和反射颜色(如果指定)。
  • 场景中的光源或场景的环境光级别产生的光的颜色和强度。

使用照明和材料的方式在呈现场景的外观上有很大的不同。 材料定义光如何从表面反射。 直接光和环境光的强度决定了反射光的性质。 如果启用了照明,则必须使用材料来呈现场景。

渲染场景不需要灯光,但在没有光线的情况下呈现的场景中的详细信息不可见。 在最佳情况下,渲染未照明的场景将导致场景中对象呈现出剪影。 对于大多数目的,这还不够详细。

直接光与环境光

虽然直接和环境光照亮场景中的对象,但它们彼此独立,但它们具有非常不同的效果,并且它们要求你以完全不同的方式与他们合作。

直接光线 直接照射到物体。 直接光线始终具有方向和颜色,它是着色算法的一个因素,如 Gouraud 底纹。 不同类型的灯光以不同的方式发出直接光,从而产生特殊的衰减效果。

环境光 实际上在场景中随处可见。 环境光是填充整个场景的一般光级别,无论该场景中的对象及其位置如何。 环境光没有位置或方向,只有颜色和强度。 每个光源都会增加场景中的整体光线。

环境光颜色采用 RGBA 值的形式,其中每个组件都是介于 0 到 255 之间的整数值。 这与 Direct3D 中的大多数颜色值不同。

红色、绿色和蓝色部分组合在一起,形成环境光的最终呈现的颜色。 alpha 组件控制颜色的透明度。 使用硬件加速或 RGB 仿真时,将忽略 alpha 组件。

Direct3D 光模型与自然

在自然界中,当光从光源发出时,它会在到达用户的眼睛之前,经过数百,甚至数千或数百万个物体的反射。 每次反射时,一些光被表面吸收,一些光线散落在随机方向,其余部分则转到另一个表面或用户的眼睛。 此过程一直持续到光线减少到无或用户感知光。

显然,完美模拟光的自然行为所需的计算过于耗时,无法用于实时 Direct3D 图形。 因此,考虑到速度,Direct3D 光模型近似于光在自然世界中的工作方式。 Direct3D 在红色、绿色和蓝色组件方面描述了光,这些组件组合在一起以创建最终颜色。

在 Direct3D 中,当光线从表面反射时,光的颜色在数学上与表面相互作用,以生成最终在屏幕上显示的颜色。 有关 Direct3D 使用的算法的特定信息,请参阅 照明数学

Direct3D 光模型将光通用化为两种类型:环境光和直接光。 每个属性都有不同的属性,并且每个属性都以不同的方式与表面的材料进行交互。 环境光是经过大量散射以至于方向和来源无法确定的光,在各处保持低强度。 摄影师使用的间接照明是环境光的良好例子。

Direct3D 中的环境光与本质上一样,没有真正的方向或源,只有颜色和强度。 事实上,环境光级别与生成光线的场景中的任何对象完全无关。 环境光不会导致镜面反射。

直接光是由场景中的源生成的光;它始终具有颜色和强度,并按指定方向行驶。 直接光与表面的材料交互以创建镜面高光,其方向用作着色算法的一个因素,包括古罗德光影。 当直接光反射时,它不会对场景中的环境光水平造成影响。 生成直接光的场景中的源具有不同的特征,这些特征会影响它们照亮场景的方式。

此外,多边形的材料具有影响多边形反射其接收光的方式的属性。 设置一个反射特征,描述材料如何反射环境光,并设置单个特征以确定材料的反射和漫射反射。

灯光和材料的颜色值

Direct3D 根据四个组成部分(红色、绿色、蓝色和 alpha)描述颜色,这些组件组合成最终颜色。 每个组件的范围从 0.0 到 1.0。 虽然灯光和材料都使用相同的结构来描述颜色,但光与材料使用的值略有不同。

光源的颜色值表示它发出的特定光组件的数量。 由于光源不使用 alpha 分量,所以只有颜色的红、绿、蓝分量是相关的。 可以在投影电视上将这三个组件可视化为红色、绿色和蓝色镜头。 每个透镜可能处于失活状态(对应成员中的值为 0.0),可能达到最亮状态(值为 1.0),或者介于两者之间的某种亮度水平。

通过镜头穿过的颜色组合在一起,形成光线的最终颜色。 R(1.0)、G(1.0)、B(1.0)等组合创建白色光,R(0.0)、G(0.0)、B(0.0)根本不发出光。 可以发出单一颜色的光,从而产生纯粹的红光、绿光或蓝光,或者可以通过组合发出黄色或紫色等颜色的光。 您甚至可以设置负色分量值,以创建一种“暗光”,这种“暗光”实际上会从场景中移除光线。 或者,可以将组件设置为大于 1.0 的一些值,以创建极亮的光。

另一方面,使用材料时,颜色值表示用该材料呈现的表面反射了多少光组件。 颜色成分为 R(1.0)、G(1.0)、B(1.0)、A(1.0)的材料反映了所有来临的光。 同理,具有 R(0.0)、G(1.0)、B(0.0)、A(1.0) 的材料会反射所有照射到它的绿色光。 材料具有多个反射值来创建各种类型的效果。

请参阅 “浅色类型 ”和 “浅色”属性

灯和材料