点光源
我们生活中最常见的电灯泡就是点光源,点光源的特点:
1. 在空间中有一个位置;
2. 向所有方向发光;
3. 光线随距离增加逐渐变暗;
在前面教程中使用的简单的点光源,只是没有实现随着距离的增加光线变暗的功能。
衰减
随着光线穿越距离的变远使得亮度也相应减少的现象,称之为衰减(Attenuation)。
衰减有两种实现方式:
1. 光亮度的减少是线性的,这样的方式体现的效果比较假;
2. 开始的时候减少的非常快,之后随着距离的增减,减少的速度会慢下来;
计算公式
为了计算衰减值,定义了三个可配置项:常数项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);
网友评论