1 Code sample: Lighting
Christophe edited this page 2016-11-01 10:28:23 +01:00
#include <glm/vec3.hpp>// glm::vec3
#include <glm/geometric.hpp>// glm::normalize, glm::dot, glm::reflect
#include <glm/exponential.hpp>// glm::pow
#include <glm/gtc/random.hpp>// glm::vecRand3

glm::vec3 lighting
(
    intersection const & Intersection,
    material const & Material,
    light const & Light,
    glm::vec3 const & View
)
{
    glm::vec3 Color(0.0f);
    glm::vec3 LightVector(glm::normalize(
    Light.position() - Intersection.globalPosition() +
    glm::vecRand3(0.0f, Light.inaccuracy()));

    if(!shadow(Intersection.globalPosition(), Light.position(), LightVector))
    {
        float Diffuse = glm::dot(Intersection.normal(), LightVector);
        if(Diffuse <= 0.0f)
            return Color;
        if(Material.isDiffuse())
            Color += Light.color() * Material.diffuse() * Diffuse;
        if(Material.isSpecular())
        {
            glm::vec3 Reflect(glm::reflect(
            glm::normalize(-LightVector),
            glm::normalize(Intersection.normal())));
            float Dot = glm::dot(Reflect, View);
            float Base = Dot > 0.0f ? Dot : 0.0f;
            float Specular = glm::pow(Base, Material.exponent());
            Color += Material.specular() * Specular;
        }
    }
    return Color;
}