首页未分类

LearningOpenGL【12】

Gumdrop
阅读字号

光源携带不同属性成为不同种类的光源。这里举出一些常用光源的模型。

点光源PointLight

原本使用的光源就是点光源。

struct Light{
    vec3 position;
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
};

光照随距离衰减Attenuation

认为强度与距离二次方成反比,于是模型为:

$$ Attenuation = 1/P_2(distance)=1/(constant+linear*d+quadratic*d*d) $$
struct AttenuatedPointLight{
    vec3 position;
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    vec3 coeffient;
};

锥形光SpotLight

用一个cutOff属性和在shader中使用if语句,判断片段是否被照射了,应该渲染diffuse和specular。

当连接光源和片段的向量与锥形方向向量夹角过大时舍去。

struct SpotLight{
    vec3 position;
    vec3 direction;
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    float cutOff;
};

2025-09-07T08:29:06.png

柔化边缘SmoothEdge

边缘定义为cutOff($\phi$)和outerCutOff($\gamma$)之间的部分,这里使用了简单的线性插值递减。其他方式当然也可以。

$$ intensity(\theta) = (\theta-\gamma)/(\phi-\gamma) $$
struct SmoothlyEdgedSpotLight{
    vec3 position;
    vec3 direction;
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    float cutOff;
    float outerCutOff;
};

2025-09-07T08:29:21.png

平行光DirectionalLight

没有位置只有方向。

struct DirectionalLight{
    vec3 direction;
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
};
全文完

讨论与留言 0

还没有留言,欢迎分享你的想法。

写下你的想法