冯氏光照模型-yee的MacBook Pro

冯氏光照模型

现实生活中的光照效果是得长复杂的,要精确模拟这种效果是不现实的,所以需要一种能够近似现实光照效果的简化模型。比较著名的是冯氏光照模型(Phong Lighting Model)。

在冯氏光照模型中,生活中的光照有三种类型:环境光(Ambient)、漫反射(Diffuse)和镜面高光(Specular)

1
总光照效果 = 环境光 + 漫反射 + 镜面高光

环境光

某些光从光源发出后,被多个物体(墙壁、镜子等)反射 ,最终照射到物体上。对于场景中这种经过反射多次以至于无法确定来自某个方向的光,被称为环境光。在冯氏模型中,环境光从各个角度照射物体,其强度都是一致。

通常情况我们使用一个较小的光线因子乘以光源颜色来模拟。

1
环境光颜色 = 光源颜色 * 光线因子

漫反射

漫反射是为了模拟平行光源点光源对物体的方向性影响。

我们知道,当一束光线照射到物体表面时,光线的入射角越小,该表面的亮度就越大,看上去也就越亮。反之,该表面的亮度就越小,看上去越暗。

入射角的表示:

要定义入射角,需要先定义一个法向量,即垂直于物体表面,并且朝向平面外部的向量。

image-20211121232434452
1
漫反射光照 = 入射光颜色 *  表面基颜色  *  入射角的余弦值

几何体在旋转、缩放时,每个表面的法向量也会随之变化。

image-20211122173649029

  • 平移变换不会改变法向量,因为平移不会改变物体的方向。
  • 旋转变换会改变法向量,因为旋转改变了物体的方向。

  • 拉伸的情况比较复杂,如果在所有轴上的缩放比例都是一样的,那么法向量不会发生变化

如何计算变换之后的法向量呢?

只要将变换之前的法向量乘以模型矩阵的逆转置矩阵(inverse transpose matrix)即可 。具体操作就是:对模型矩阵先求逆,再转置。

模型矩阵即:对顶点进行变换(缩放、位移、旋转)的矩阵 。

平行光源

在现实中平行光漫反射可以模拟遥远的光源,比如太阳光,由于太阳距离地球过于遥远,所以太阳光照射在物体各个点的方向可以看做是平行的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
attribute vec3 a_Color;
attribute vec4 a_Normal; //法向量

uniform mat4 u_NormalMatrix; //法向量变换矩阵
uniform vec3 u_LightDirection; //入射光线

varying vec4 v_Color;


void main(){

.......

vec4 color = vec4(a_Color.xyz * 1.0, 1.0);
vec4 normal = u_NormalMatrix * a_Normal; //对发向量进行变换

//计算光线入射角与法向量的余弦值,即计算改点的漫反射强度
float nDotL = max(dot(u_LightDirection, normalize(normal.xyz)), 0.0);


v_Color = vec4(color.xyz * nDotL, 1.0);
}

冯氏光照模型-yee的MacBook Pro
http://example.com/2024/05/23/webgl/冯氏光照模型-yee的MacBook Pro/
Author
John Doe
Posted on
May 23, 2024
Licensed under