美文网首页OpenGL学习笔记
【四十四,光照-材质03设置光的属性】

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

作者: Woodlouse | 来源:发表于2019-12-11 22:18 被阅读0次

    光属性的定义

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

    运行效果:


    设置光属性效果图

    设置光的属性代码

    相关文章

      网友评论

        本文标题:【四十四,光照-材质03设置光的属性】

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