OpenGL学习笔记

【四十四,光照-材质03设置光的属性】

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

光属性的定义

在上一节中我们设置了材质属性,为材质对环境光、漫反射光、镜面光照和高光系统的敏感性定义了不同的值,总体来看上一节中的运行效果物体的颜色比较亮,原因是环境、漫反射和镜面三个颜色都任何一个光源都会全力反射,我们把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);

运行效果:


设置光属性效果图

设置光的属性代码

上一篇 下一篇

猜你喜欢

热点阅读