第3课_点光源
热度🔥:14 免费课程
授课语音
点光源
点光源是计算机图形学中常用的一种光源模型。与方向光源不同,点光源的光线从某个特定位置向四面八方发射。点光源的一个典型例子是灯泡。理解点光源对于创建照明效果和模拟真实世界的光源至关重要,特别是在3D图形渲染中,光源的计算和影响决定了最终图像的真实感。
1. 点光源的基本概念
点光源是一种具有固定位置的光源,它从一个点发出光线,并在三维空间中均匀地向各个方向传播。与方向光源不同,点光源的光照强度会随着距离的增加而衰减。
光照衰减
在实际情况中,点光源的光照强度并非恒定,而是会随着光源到物体的距离增加而逐渐减弱。通常使用以下公式来表示光照的衰减:
衰减因子 = 1 / (a + b * d + c * d^2)
其中:
a
、b
、c
是衰减系数,可以通过调节来控制衰减的强度。d
是光源与表面之间的距离。
2. 点光源的光照计算
点光源的光照计算可以分为三个部分:
环境光:表示物体在没有直接光照时的反射光,通常是一个常量值。
漫反射光:光照与表面法线之间的角度关系决定了漫反射光的强度。根据朗伯定律,漫反射强度与光源到表面法线的夹角余弦值有关。
计算公式:
I_diffuse = K_d * max(0, N ⋅ L)
其中
N
是表面法线向量,L
是指向光源的单位向量,K_d
是漫反射系数。镜面反射光:模拟光源在光滑表面上的反射现象,通常与观察方向和反射光方向之间的角度关系相关。镜面反射的强度通常会随着视角的改变而改变。
计算公式:
I_specular = K_s * (R ⋅ V)^n
其中:
R
是反射光方向,V
是视角方向。n
是镜面反射指数,用于控制高光的锐度。K_s
是镜面反射系数。
3. 点光源的实现
在3D渲染中,通常需要结合点光源来计算每个像素的光照。下面是一个简单的点光源光照计算示例:
// 点光源的位置
vec3 lightPosition = vec3(1.0, 1.0, 1.0);
// 计算从表面到光源的方向
vec3 lightDirection = normalize(lightPosition - fragPosition);
// 计算表面法线
vec3 normal = normalize(fragNormal);
// 漫反射光的强度计算
float diff = max(dot(normal, lightDirection), 0.0);
// 镜面反射光的计算
vec3 reflectDir = reflect(-lightDirection, normal);
vec3 viewDir = normalize(viewPosition - fragPosition);
float spec = pow(max(dot(reflectDir, viewDir), 0.0), shininess);
// 计算光照衰减
float distance = length(lightPosition - fragPosition);
float attenuation = 1.0 / (1.0 + 0.1 * distance + 0.05 * distance * distance);
// 最终光照
vec3 color = (ambientLight + diff * diffuseColor + spec * specularColor) * attenuation;
4. 点光源的优势与应用
优势:
- 模拟真实的光源,如灯泡、火焰等。
- 在游戏和3D渲染中,能够产生非常自然的光照效果。
应用:
- 用于模拟室内光源、街灯、车辆灯光等。
- 广泛应用于渲染引擎、游戏开发和可视化中。
5. 总结
点光源是一种简单且强大的光照模型,它能够模拟来自单一点的光线。通过衰减、漫反射和镜面反射等计算,可以生成真实且具有深度感的光照效果。理解点光源并将其应用于渲染中,可以显著提升图形的真实感和复杂度。