DirectX11学习笔记(2)光的种类与颜色的计算方法

本文深入探讨了光照模型在计算机图形学中的应用,详细介绍了环境光、漫反射和镜面光的概念及计算公式,同时讲解了平行光、点光、聚光灯等光源类型的特点和计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

h## 一、学习目标
1.了解环境光、漫反射和镜面光之间的区别。
2.了解什么是平行光,点光,聚光灯。
3.了解各种光的光强计算公式。

二、漫反射光

如下图所示的粗糙表面。当光线照射在这样一个表面上时,会在不同的随机方向上散开;我们将这种反射称为漫反射(diffuse reflection)。在我们的光照模型中模拟了灯光与表面之间的这种相互作用,我们约定线会在表面的各个方向上均匀散开;所以,无论观察点(眼睛的位置)在哪里,我们总能看到漫反射光。也就是,我们不需要考虑观察点的位置 (即,漫反射光的计算与观察点的位置无关),无论观察点在哪里,我们总能看到表面上的 点的颜色。
在这里插入图片描述
当照射一个漫反射表面时,入射光会在随机方向上散开。在显微镜下,很多物体表面都是粗糙的。
我们将漫反射光的计算过程分为两个部分
第一部分中,我们指定一个入射光颜色和一个漫反射材质颜色。漫反射材质指定了表面所能反射和吸收的漫反射光的总量;它使用分量颜色乘法来实现。例如,表面反射 50%的红光、100%的绿和 75%的蓝光,入射光是强度 为 80%的白光。那么

入射光颜色 ld = (0.8, 0.8, 0.8),漫反射材质颜色 md = (0.5, 1.0, 0.75);
反射光的总量为D =ld ⨂ md = (0.8, 0.8, 0.8)⨂(0.5, 1.0, 0.75) = (0.4, 0.8, 0.6) 。

注意:表面上的漫反射材质可以变化;也就是,表面上的每个点可以有不同的漫反射材 质颜色。例如,当渲染一个由沙滩、草地、土地和雪地构成的地形时,地形的每个部分反射 和吸收的线数量是不一样的,所以材质颜色必须根据地形表面而变化。
在本书的 Direct3D 光照实现中,我们为每个顶点指定一个不同的漫反射材质颜色。在光栅化阶段中,这些顶点 属性会在三角形表面上的进行插值。通过一方式,三角形网格表面上的每个点都会得到一个 漫反射材质颜色。 我们直接引用兰伯特余弦定理(根据表面法线与光照向量之间的夹角来控制表面的受光 强度)来实现漫反射光照计算 。

ld入射光颜色,md为漫反射材质颜色,kd = max(L∙n ,0), 其中 L 是光线向量,n 是表面法线。
则反射回来的漫反射光颜色为:cd = kld ⨂ md = kd·D

三、环境光

前面提到,我们的光照模型不处理由场景中的其他物体反弹的间接光。不过,我们在现实生活中看到的很多光线都是间接光。
例如,在一条通往房间的走廊里,我们不会直接看到房间里面的光源,但是光线会照射在墙壁上,通过墙壁把一部分线反弹到走廊中,间接地把走廊照亮。
再比如,我们坐在一间屋子里,面前摆着桌子、茶壶和台灯。茶壶放在桌子上, 并且只有一个侧面面向台灯;我们可以看到茶壶背面并不是全黑的。因为有一些光线会通过 墙壁或其他物体间接地反弹到茶壶背面。

为了模拟间接光,我们在光照方程中引入了一个环境光项: A=la⨂ma

颜色 la 指定了表面从一个光源收到的间接(环境)光的总量。环境材质颜色 ma指定了 表面反射和吸收的入射环境光的总量。环境光只是将物体的亮度稍微提高一点儿——这根本不是真实的物理计算。之所以这样做是因为间接光会在场景中散开和多次反弹,从每个方向均匀地照亮物体。
将环境项与漫反射项组合在一起,得到新的光照方程: LitColor = la⨂ma + kd·ld ⨂ md

四、镜面光

如图所示的光滑表面。当灯照射在这样一个表面上时,光线会在一个由反射系数描述的圆锥体区域内形成锐利的反射;我们将这种反射称为镜面高光反射(specular reflection,或直译为镜面反射)。与漫反射不同,高光可能不会传入眼睛,因为它只在一个 特定的方向上反射;高光的计算过程与观察点的位置相关。也就是说,当场景中的观察点位置发生变化时,我们看到的高光强度也会跟着变化
在这里插入图片描述
镜面反射不会在所有的方向上散开,它只会将反射光集中在一个由反射系数描述的 圆锥体区域内。当 v 在圆锥体内时,我们可以看到高光;反之,看不到高光。v 与 r 的夹角 越小,我们看到的高光就越强。
镜面反射的圆锥体区域由一个反射向量 r 和一个角度ϕmax来定义。简单来说,反射光的强度可由反射向量 r 和观察向量 v= E-P / ||E-P||(即,从表面点 P 到观察点位置 E 的单位向量之间的夹角ϕ来决定。

我们约定:当ϕ =0 时,高光强度最大当ϕ逐渐接近于时,高光强度 逐渐降低为 0

为了以数学方式来描述一过程,我们需要对使用兰伯特余弦定理的函数做一些修改。下图说明了使用不同幂时的余弦函数曲线图,其中 p≥1。本质上,通过p 指定不同的值,我们可以间接地控制当高光强度降低为 0 时的圆锥体角度ϕmax。参数 p 可以用来控制表面的平滑程度;也就是,非常精细的表面比缺乏光泽的表面的反射系数小(反射光更锐利)。所以,我们应该为光滑表面指定一个比不光滑表面更大的 p 值。
在这里插入图片描述
注意,因为 v 和 r 是单位向量,所以 cosϕ = v·r
我们现在定义照模型中的高光项: cs = kls ⨂ ms = ksS
其中
在这里插入图片描述
颜色 ls指定了光源发出的高光总量。镜面材质颜色 ms指定了表面反射和吸收的入射高 光总量。系数 ks根据 rv 之间的夹角来决定高光强度。图 7.13 说明了一个表面可能接收不到漫反射光(L·n<0),但是却可以接收到高光。不过,在这种情况下,它收到的高光是毫无意义的,我们应该将 ks设为 0。
在这里插入图片描述
虽然光线照射的是物体背面,但是在观察点上还是可以看到高光。是错误的结果。 当出现一问题时,我们必须将 ks设为 0。

注意:高光幂 p 的取值应该总是大于 1 的。
新的光照模型为:
LitColor=la⨂ma+kld⨂md +kls⨂ms=A+kdD+ ksS
kd =max(L∙n,0)
在这里插入图片描述
反射向量 r=I −2(n·I)n(这里假设 n 是一个单位向量。)不过, 我们在着色器程序中总是使用 HLSL 的内置函数 reflect 来计算。 这里的入射光向量 I 是指入射光的方向(它与光线向量 L 的方向相反) 。
在这里插入图片描述

五、平行光

平行光(或方向光)用于模拟距离很远的光源,它产生的入射光是相互平行的,平行光由一个描述线传播方向的向量来表示。因为它产生的线是平行的,所以所有光线都使用相同的方向向量。光照向量与平行光的传播方向相反。在现实生活中,最常见的平行光源是太阳。

在这里插入图片描述
下图未按比例绘制,但是当你在地球上选择一小块区域时,照在该区域上的太阳光几乎是平行的。

在这里插入图片描述

六、点光

在现实生活中,最常见的点光源是灯泡;它可以向各个方向发射光线(参见下图。 对于任意一点 P,都有一条从点光位置 Q 射向点 P 的线。通常,光照向量与点光的传播方向相反;也就是,该方向从点 P 指向点光源 Q。
在这里插入图片描述
本质上,点光和平行光之间的唯一区别是光照向量的计算方式——点光会随着点的位置 而变化,而平行光会保持为一个常量。
在这里插入图片描述

1,衰减

按物理规律来说,光照强度会随着距离的增加而衰减,它与距离的平方成反比。也就是说,在一点上的光照强度由该点与光源之间的距离 d 来决定:
在这里插入图片描述
其中,I0是 d=1 时的光照强度。不过,这个公式得到的计算结果不是总能令人满意。 所以,我们打算使用一个更通用的函数,让美术师和程序员通过一些参数来控制照强度(即, 可以让美术师和程序员尝试各种不同的参数,直至得到满意的效果为止),而不是单纯追求 物理准确性。用于调节灯光强度的典型公式为:
在这里插入图片描述
我们将 a0、a1和 a2称为衰减参数,它们由美术师或程序员来指定。例如,当你希望光照强度与距离成反比时,可以设置 a0=0、a1=1、a2=0。当你希望光照强度与距离的平方成反 比时,可以设置 a0=0、a1=0、a2=1。 把衰减参数引入光照方程,得到:

在这里插入图片描述
注意,因为环境光模拟的是充斥周围的间接光照,因此衰减参数并不会影响环境光。

2,范围

对于点光来说,我们可以引入一个附加的范围参数。当一个点与点光源之间的距离大于 指定的范围时,使它不接收该光源的照射。
当需要让一个光源只对一个特定区域产生光照时, 该参数非常有用。
虽然使用衰减参数也可以让光照强度随着距离的增加而衰减,但是明确地指定光源范围仍然有益。
范围参数可以用于优化着色器代码。我们马上就会看到,在着色器代码中,如果一个点的位置超出了光照范围,那我们就可以通过动态分支语句跳过该点的光照计算。范围参数不影响平行光,因为这种光源的位置非常远。

七、聚光灯

在现实生活中,最常见的聚光灯是手电筒。本质上,聚光灯由一个位置 Q、一个方向向 量 d 和一个圆锥体光照区域来描述。
在这里插入图片描述
聚光灯由一个位置 Q、一个方向向量 d 和一个半角角度为ϕmax的圆锥体照区域来描述

当实现一个聚光灯时,我们开始所做的事情与点光相同。光照向量可以由以下公式描述:
在这里插入图片描述
其中,P 是接收照的点的位置,Q 是聚光灯的位置。从上图中可以看到,当且仅当, −L 与 d 之间的角度ϕ小于圆锥角ϕmax时,P 在聚光灯的锥形范围内(所以它可以接收光照)。 另外,在聚光灯的圆锥体区域中的线应该具有不同的强度;越靠近圆锥体中心的光线应该越 强,随着角度ϕ从 0 增加到ϕmax,光线强度应该逐渐衰退为 0(零)。
由此能得到一个控制衰减强度和圆锥体区域大小的函数:
在这里插入图片描述
S可以间接控制角ϕmax来控制圆锥体区域大小。
当ϕ增加时,强度逐渐衰减。
因为聚光灯与点光的方程基本相同,只是要再乘以一个聚光灯因子,根据点与聚光灯圆锥体的相对位置按比例调整 光照强度:
在这里插入图片描述

八、总结

在我们的模型中,光源可以发射 3 种不同类型的线:
1.环境光(ambient light):模拟间接光照。
2.漫反射光(diffuselight):模拟对粗糙表面的直接照。
3.高光(specularlight):模拟对光滑表面的直接光照。

同样,物体表面有以下材质属性与其对应:
1.环境材质:平面反射和吸收的环境光的总量。
2.漫反射材质:平面反射和吸收的漫反射光的总量。
3.高光材质:平面反射和吸收的高光的总量。
4.高光指数:它是在高光计算中使用的一个指数,它通过一个由反射系数描述的圆锥 体区域来控制表面的光滑程度。圆锥体越小,表面越平滑/光亮。

把光照分为 3 个部分的原因是为了提高灵活性;可以让美术师从多个自由度来调整希望 得到的渲染结果。下图说明了如何将这三个部分结合在一起使用。
在这里插入图片描述
( a)只有环境光的球体颜色,环境光只是均匀地提高物体的亮度。
( b)环境和漫反射光 的组合。兰伯特余弦定理使球体表面形成了从亮到暗的平滑过渡。
( c)环境光、漫反射和高 光的组合。高光在球体的受光面形成了一小块高亮区域。

公式汇总

1,漫反射光
cd = kld ⨂ md = kD
D =ld ⨂ md (ld=入射光颜色,md=漫反射材质颜色)
kd =max(L∙n,0) (L=光线,n=表面法线)

2,环境光
LitColor=A+kld⨂md
Ala⨂ma(la=表面从一个光源收到的间接(环境)光的总量。ma=指定了 表面反射和吸收的入射环境光的总量)

3,镜面光or平行光
在这里插入图片描述
r=I −2(n·I)n

4,点光
在这里插入图片描述
(指定a0,a1,a2的值,来设置光强度于距离的关系)

5,聚光灯
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值