Aquacolor

Aquacolor



LearningOpenGL【12】

Gumdrop · 2025-09-07 · 14浏览 · 未分类



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

点光源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;
};


©

comment 评论区

添加新评论

face表情



  • ©2026 bilibili.com

textsms
内容不能为空
昵称不能为空
email
邮件地址格式错误
web
beach_access
验证码不能为空
keyboard发表评论


star_outline 咱快来抢个沙发吧!




©2026 Aquacolor

Theme Romanticism2.2 by Akashi
Powered by Typecho