光属性的定义
在上一节中我们设置了材质属性,为材质对环境光、漫反射光、镜面光照和高光系统的敏感性定义了不同的值,总体来看上一节中的运行效果物体的颜色比较亮,原因是环境、漫反射和镜面三个颜色都任何一个光源都会全力反射,我们把lightColor定义为vec(1.0f),就像下面的计算一样:
vec3 ambient = vec3(1.0f) * material.ambient;
vec3 diffuse = vec3(1.0f) * (diff * material.diffuse);
vec3 specular = vec3(1.0f) * (spec * material.specular);
按照封装材质属性的思路进行光源的封装:
struct Light
{
vec3 position;
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
uniform Light light;
冯氏光照模型中三元素的计算:
// Ambient
vec3 ambient = light.ambient * material.ambient;
// Diffuse
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(light.position - FragPos);
float diff = max(dot(norm, lightDir), 0.0f);
vec3 diffuse = light.diffuse * (diff * material.diffuse);
//Specular
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
vec3 speclular = light.specular * (spec * material.specular);
在代码中设置光属性:
// 设置光源的属性
m_pShader->setVec3("light.position", lightPos);
m_pShader->setVec3("light.ambient", 0.2f, 0.2f, 0.2f);
m_pShader->setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);
m_pShader->setVec3("light.specular", 1.0f, 1.0f, 1.0f);
运行效果:
设置光属性效果图
网友评论