void ShadowMapRenderer::SetMaterialUniforms(const Material &material) const
{
    auto &prog = CurrentProgram<DepthProgram>();
    oglplus::Texture::Active(RawTexture::Diffuse);
    material.BindTexture(RawTexture::Diffuse);
    prog.diffuseMap.Set(RawTexture::Diffuse);
}
void GIDeferredRenderer::SetMaterialUniforms(const Material &material)
const
{
    using namespace oglplus;
    auto &prog = CurrentProgram<GeometryProgram>();
    prog.material.diffuse.Set(material.Diffuse());
    prog.material.specular.Set(material.Specular());
    prog.material.emissive.Set(material.Emissive());
    // shininess curve, a bit smoother than linear
    prog.material.shininess.Set(sin(pow(material.Shininess(),
                                        3.0f) * glm::half_pi<float>()));
    prog.material.useNormalsMap.Set(material.HasTexture(RawTexture::Normals));
    // set textures
    Texture::Active(0);
    material.BindTexture(RawTexture::Diffuse);
    Texture::Active(1);
    material.BindTexture(RawTexture::Specular);
    Texture::Active(2);
    material.BindTexture(RawTexture::Normals);
    Texture::Active(3);
    material.BindTexture(RawTexture::Opacity);
    Texture::Active(4);
    material.BindTexture(RawTexture::Diffuse);
}