
- 掌握 Direct3D 支持的光源类型及其发光形式,理解光照的定义方式,弄清光线与表面的交互机理。
- 学会用数学语言描述三角形单元的朝向,从而判断光线入射角对面的影响。
- 明白如何通过光照提升场景真实感,帮助刻画物体的形状与立体感。
光照的基本思想
- 在场景中添加光照可提升真实感,光照通过影响顶点颜色来描述物体的光泽与明暗。Direct3D 会在光照计算引擎中,基于光源类型、材质以及表面对光源的朝向,计算出顶点的颜色值。这使绘制结果更具真实感。
光照模型的三大分量
- 环境光:来自场景中其他表面的反射,均匀照亮整个场景,即使某些区域未直接处于光源照射下。用环境光可在较低成本下近似实现全局无方向性的反射光。
- 漫射光:沿特定方向传播,并在到达表面后向各个方向均匀反射。由于漫射光在不同观察方向上亮度一致,因此不需要考虑观察者位置,只需考虑光的入射方向与表面法向。
- 镜面光:在特定方向上传播的光,到达表面后按一定角度反射,形成观测角度范围内的高光点。镜面光需要同时考虑入射方向、表面朝向以及观察点的位置,因此计算量较大。Direct3D 提供开启与否的开关,一般初始为关闭状态,启用时需要设置绘制状态。
光线的表示
- 每种光源的颜色可用结构体 D3DCOLORVALUE 或 D3DXCOLOR 表示,描述光的颜色分量。需要注意的是,Alpha 通道在光照计算中会被忽略。
- 现实世界中的物体颜色由其对光的反射属性决定。Direct3D 通过材质来模拟这一现象,材质定义了物体对不同颜色光的反射比例。
材质的组成
- Diffuse:对漫射光的反射率。
- Ambient:对环境光的反射率。
- Specular:对镜面光的反射率。
- Emissive:自发光分量,用于增强亮度感。
- Power:镜面高光点的锐度,数值越大高光越集中。
- 通过改变材质的分量,可以控制在各种光照条件下表面对不同颜色的光的反射强度。
颜色系示例
- 若某材质对绿色与蓝色光的反射为 0%,而对红色光的反射为 100%,则该物体在红光下呈现红色;若同时对三原色都反射,结果会偏白。若仅发射蓝色光照射红色物体,则该物体会变黑,因为蓝光被吸收。
顶点法线与面法线
- 面法线描述多边形的朝向,用于确定光线与面的入射角。VSport
- 顶点法线是每个顶点处的法线方向,用于在顶点级别进行光照计算。顶点法线与面法线不必完全一致,复杂网格常出现差异。
- 为一个顶点定义顶点法线,需要在顶点结构中增加法线向量字段,光照计算从这些顶点法线处进行。
法线的计算与应用
- 面法线 n 的计算:给定三角形的顶点 p0、p1、p2,设 u = p1 − p0,v = p2 − p0,则 n = u × v。若顶点顺序为顺时针,法线方向按该顺序确定;若为逆时针,方向相反。
- 顶点法线的求取通常避免直接沿用面的法线,采用共享顶点的面法向量的加权平均来获得顶点法线:若顶点 V 被 n0、n1、n2 三个相邻三角形共享,则 Vn = (n0 + n1 + n2) / 3。变换完成后,常对法线进行规范化处理以保持单位向量性质。
- 为确保渲染时法线始终单位化,可在后续阶段设置绘制状态让法线重新规范。
Direct3D 的三种光源
- 点光源:在世界坐标系中具有固定位置,向各个方向发光,如同太阳。
- 方向光:不具备位置,只沿某一固定方向平行传播光线。
- 聚光灯:具备位置,光线以锥形聚集沿指定方向发射,锥形由内部角和外部角描述,类似手电筒的光束。
光源的表示与属性
- 光源采用结构 D3DLIGHT9 表示,常用字段包括:
- Type:光源类型,取值为 D3DLIGHT_POINT、D3DLIGHT_SPOT、D3DLIGHT_DIRECTIONAL。
- Diffuse、Specular、Ambient:光源的漫射、镜面及环境光颜色。
- Position:光源在世界坐标系中的位置(对方向光无意义)。
- Direction:光在世界坐标系中的传播方向(对点光与聚光灯无意义)。
- Range:光线的最大有效距离(对方向光无意义)。
- Falloff:聚光灯的强度衰减方式,通常配合 Theta、Phi 使用。
- Attenuation0、Attenuation1、Attenuation2:距离衰减系数,常用于点光源与聚光灯,公式为 attenuation = 1 / (Attenuation0 + Attenuation1 · D + Attenuation2 · D^2)。
- Theta、Phi:聚光灯的内部锥角与外部锥角,单位为弧度。
光源初始化与管理
- 直接创建简单光源的过程较为繁琐,因此可通过定义若干辅助函数来快速初始化光源,如 InitDirectionalLight、InitPointLight、InitSpotLight 等,便于设置常见参数。
- 将初始化后的光源交给 Direct3D 进行注册,注册成功后即可在内部光源列表中进行管理与控制。
- 注册完成后,可以通过设置绘制状态来开启或关闭光源的影响。
核心要点总结
- Direct3D 的光照由环境光、漫射光与镜面光三大分量构成,镜面光需要额外的计算量并可选择性开启。
- 顶点法线在顶点级别决定了光照的入射角,面法线用于描述面片方向,顶点法线往往通过共享面法线的平均来得到更平滑的效果。
- 材质属性决定物体对不同颜色光的反射比例,进而影响最终的颜色呈现。
- D3DLIGHT9 是描述光源的核心结构,包含光源类型、颜色、位置、方向、衰减及聚光参数等字段,初始化与注册后即可实现光源的控制。
