授课语音

点光源

点光源是计算机图形学中常用的一种光源模型。与方向光源不同,点光源的光线从某个特定位置向四面八方发射。点光源的一个典型例子是灯泡。理解点光源对于创建照明效果和模拟真实世界的光源至关重要,特别是在3D图形渲染中,光源的计算和影响决定了最终图像的真实感。


1. 点光源的基本概念

点光源是一种具有固定位置的光源,它从一个点发出光线,并在三维空间中均匀地向各个方向传播。与方向光源不同,点光源的光照强度会随着距离的增加而衰减。

光照衰减

在实际情况中,点光源的光照强度并非恒定,而是会随着光源到物体的距离增加而逐渐减弱。通常使用以下公式来表示光照的衰减:

衰减因子 = 1 / (a + b * d + c * d^2)

其中:

  • abc 是衰减系数,可以通过调节来控制衰减的强度。
  • 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. 总结

点光源是一种简单且强大的光照模型,它能够模拟来自单一点的光线。通过衰减、漫反射和镜面反射等计算,可以生成真实且具有深度感的光照效果。理解点光源并将其应用于渲染中,可以显著提升图形的真实感和复杂度。

去1:1私密咨询

系列课程: