OpenGL学习笔记

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

2019-12-19  本文已影响0人  Woodlouse

点光源

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

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

衰减

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

计算公式

光衰减计算公式.png

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

实现衰减

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

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

点光源衰减代码

上一篇下一篇

猜你喜欢

热点阅读