光照到底是什么?

预计阅读时间: 10 分钟

1. 颜色基础

1.1 颜色的本质

颜色定义

物体的颜色是由物体反射出来的光决定的,也就是物体不吸收的部分颜色,才是物体的颜色,或者说被认为是物体的颜色。

图形学中的颜色

在图形学中,物体颜色的定义:物体从一个光源反射各个颜色分量的大小。这个反射分量代表了物体的颜色,表示在白光下物体看起来的颜色;在其它颜色的光源下,则表现不同。

2. 光照原理

光照的本质

所谓的亮和暗,都是通过物体显示的颜色变化来表现的,所谓的光,不过是一个显示颜色的数值比例,根本没有光。

2.1 光照与渲染

核心原理

不同的物体在不同的光下有不同的颜色表现。这意味着:

  1. 为了实现不同光照的模拟,我们使用冯氏光照模型来近似描述光 → 光照的三个分量既可以认为是颜色值,也可以认为是对白色光的反射率
  2. 为了模拟不同物体对光的反应,需要对物体的材质使用冯氏模型进行细粒度描述 → 光照贴图
  3. 通过在片元着色器中,光的三个分量与物体的三个分量分别计算后叠加,得到最终的颜色
  4. 光照模型就是在光源和物体两个方面都细粒度描述光照效果

2.2 冯氏光照模型

简介

现实世界的光照极其复杂,计算机图形学只能使用一些简化的模型来近似模拟,其中冯氏光照模型最为常用。

2.2.1 光照组成部分

冯氏光照模型包含三个分量:

三大组成部分
  1. 环境光照 (Ambient Light)

    • 各个方向的微弱光线
    • 通常来自不同物体的反射
    • 设置一个常量值来模拟
  2. 漫反射光照 (Diffuse Lighting)

    • 冯氏光照模型中视觉上最显著的分量
    • 模拟光照对物体的方向性影响
    • 与观察角度无关
  3. 镜面光照 (Specular Lighting)

    • 有光泽物体表面上的亮点
    • 镜面光照的颜色相比物体颜色更倾向于光线本身的颜色
    • 与观察角度相关,需要计算物体是否在光线照射的半径内

3. 光照计算空间

计算空间选择

在世界空间中计算光照的原因:

  • 光源位置在世界空间中更容易计算光照方向
  • 面的法向量也需要转换到世界矩阵中
  • 计算结果可以传递给片元着色器计算最终颜色

更常见的做法是在观察空间中计算光照,但在哪个空间中计算都不会影响最终结果。

4. 冯氏光照模型详解

4.1 环境光照 (Ambient Lighting)

实现方式

真正去实现模拟环境光源开销巨大且价值不大,因此我们采用简化方式:

  • 使用光的颜色乘以一个很小的环境因子
  • 再乘以物体的颜色来模拟环境光
  • 这样只需要在片元着色器中进行一次计算即可达到效果,性能好
  • 注意:片元着色器的数量比顶点着色器多得多!

4.2 漫反射光照 (Diffuse Lighting)

漫反射光照示意图

光照计算过程

需要的条件:光线的方向、表面法向量

漫反射一般为固定方向的光线对物体的影响,所以光线与面的相交角度对亮度影响很大,可以通过法向量计算:

  1. 定义光源位置和颜色
  2. 将顶点转换成世界坐标,并计算顶点所在面的法向量
  3. 结合光源位置计算光线向量,从而计算漫反射分量
    • 注意:负数颜色无意义,最小值取0
    • 使用单位向量进行计算,需要标准化
  4. 计算漫反射值并与其他光照值结合
  5. 漫反射分量与物体颜色相乘得到最终颜色

4.3 镜面光照 (Specular Lighting)

镜面光照示意图

镜面光照特性

镜面光照计算需要一个额外的观察向量,不同角度观察时镜面反射的光照强度不同。原理是计算反射角与观察向量的夹角来分配不同的光照强度。

反光度(Shininess)

  • 反光度越高,反射光的能力越强
  • 散射得越少,高光点就会越小
  • 通常用一个指数值来控制

4.4 光照计算的位置选择

顶点着色器 vs 片元着色器

在光照着色器的早期,开发者曾在顶点着色器中实现冯氏光照模型:

  • 优势:顶点数量远少于片段,计算频率更低,效率更高
  • 劣势:顶点着色器中的最终颜色值仅是那个顶点的颜色值,片段的颜色值由插值得来,光照效果不够真实,除非使用大量顶点

一般情况下,顶点着色器中的计算次数比片段着色器中少得多,因为片段着色器处理所有像素,而顶点着色器只处理顶点。

5. 法线向量

定义

法线向量是垂直于片元表面的向量,对于光照计算至关重要。

5.1 法线矩阵

法线变换问题

为了消除不等比缩放等操作对法线的影响(导致法线向量不再垂直于片元表面),需要使用特殊的法线矩阵。

法线矩阵作用于法线向量,确保其在变换后仍然垂直于表面。

法线矩阵示意图

6. 投光物类型

6.1 定向光 (Directional Light)

定向光特性

定向光模拟远距离光源(如太阳),具有以下特点:

  • 所有光线平行,方向一致
  • 无需计算光照衰减
  • 物体与光源的相对位置不影响光照效果

6.2 点光源 (Point Light)

点光源特性

点光源是一个具体位置的光源,向四周发射光线:

  • 需要计算光源位置到物体的方向
  • 具有光照衰减效果
  • 可以选择线性或非线性衰减
  • 向所有方向均匀发射光线

6.3 聚光灯 (Spot Light)

聚光灯衰减示意图

聚光灯特性

聚光灯是一种特殊的点光源,只在特定角度范围内发射光线:

  • 具有特定的照射范围(由切光角决定)
  • 需要计算光源位置和方向
  • 具有光照衰减效果
  • 仅在指定方向的锥形区域内照射

6.4 光照衰减

衰减计算

光照衰减(Attenuation)是指光线强度随传播距离增加而减弱的现象:

  • 通常使用二次方程而非线性方程计算衰减
  • 衰减因子随距离增加而减小
  • 影响最终的光照强度

6.5 聚光灯边缘软化

软化技术

为了避免聚光灯边缘过于生硬,通常采用双圆锥过渡技术:

  1. 内圆锥

    • 光照强度保持为1
    • 完全照亮的区域
  2. 过渡区域

    • 在内圆锥和外圆锥之间
    • 光照强度从1平滑过渡到0
    • 创造自然的光照边缘效果
  3. 外圆锥外

    • 仅保留少量环境光
    • 完全不受聚光灯影响的区域