美文网首页OpenGL学习笔记
【四十九,投光物-02点光源】

【四十九,投光物-02点光源】

作者: Woodlouse | 来源:发表于2019-12-19 23:16 被阅读0次

    点光源

    我们生活中最常见的电灯泡就是点光源,点光源的特点:
    1. 在空间中有一个位置;
    2. 向所有方向发光;
    3. 光线随距离增加逐渐变暗;

    在前面教程中使用的简单的点光源,只是没有实现随着距离的增加光线变暗的功能。

    衰减

    随着光线穿越距离的变远使得亮度也相应减少的现象,称之为衰减(Attenuation)
    衰减有两种实现方式:
    1. 光亮度的减少是线性的,这样的方式体现的效果比较假;
    2. 开始的时候减少的非常快,之后随着距离的增减,减少的速度会慢下来;

    计算公式

    光衰减计算公式.png

    为了计算衰减值,定义了三个可配置项:常数项Kc,一次项Kl和二次项Kq

    • 常数项:保证分母大于分子,一般取值为1;
    • 一次项用于与距离值相乘,以线性的方式减少亮度;
    • 二次项用于与距离的平方相乘,为光源设置一个亮度的二次递减。二次项在距离比较近的时候相比一次项会比一次项更小,但是当距离更远的时候比一次项更大。

    实现衰减

    修改片段着色器中的光源的定义,加入三个系数的定义:

    struct Light
    {
        vec3 position;
        
        vec3 ambient;
        vec3 diffuse;
        vec3 specular;
        
        float constant;
        float linear;
        float quadratic;
    };
    uniform Light light;
    
    

    衰减计算:

    //Attenuation 衰减
    float distance = length(light.position - FragPos);
    float attenuation = 1.0f / (light.constant + light.linear*distance + light.quadratic*(distance*distance));
    
    vec3 result = ambient*attenuation + diffuse*attenuation + speclular*attenuation;
    color = vec4(result, 1.0f);
    

    在代码中设置衰减系数

    // 衰减系数
    m_pShader->setFloat("light.constant", 1.0f);
    m_pShader->setFloat("light.linear", 0.09);
    m_pShader->setFloat("light.quadratic", 0.032);
    

    运行效果

    衰减系数为0 VS 衰减系数非0

    点光源衰减代码

    相关文章

      网友评论

        本文标题:【四十九,投光物-02点光源】

        本文链接:https://www.haomeiwen.com/subject/flzvnctx.html