summaryrefslogtreecommitdiff
path: root/engine/light.glsl
blob: e9b2a6168fd362bbf6b710d575da3ea8d5ddcf4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#version 330 core

#ifndef LIGHT_GLSL
#define LIGHT_GLSL

struct Material {
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    sampler2D ambient_map;
    sampler2D diffuse_map;
    sampler2D specular_map;
    float shininess;
}; 

struct PointLight {
	vec3 position;
    vec3 diffuse;
    vec3 specular;
    float constant;
    float linear;
    float quadratic;
}; 

vec3 calc_ambient_light(in Material material, in vec2 texture_coords)
{
	return vec3(texture(material.ambient_map, texture_coords)) * material.ambient;
}

vec3 calc_diffuse_light(
	in Material material,
	in PointLight light,
	in vec3 light_dir,
	in vec3 norm,
	in vec2 texture_coords
)
{
	float diff = max(dot(norm, light_dir), 0.0);

	return light.diffuse * (
		diff * (vec3(texture(material.diffuse_map, texture_coords)) * material.diffuse)
	);
}

vec3 calc_specular_light(
	in Material material,
	in PointLight light,
	in vec3 light_dir,
	in vec3 norm,
	in vec3 view_pos,
	in vec3 frag_pos,
	in vec2 texture_coords
)
{
	vec3 view_direction = normalize(view_pos - frag_pos);

	vec3 reflect_direction = reflect(-light_dir, norm);
	
	float spec =
		pow(max(dot(view_direction, reflect_direction), 0.0), material.shininess);

	return light.specular * (
		spec * (vec3(texture(material.specular_map, texture_coords)) * material.specular)
	);
}

float calc_attenuation(in PointLight point_light, in vec3 position)
{
	float light_distance = length(point_light.position - position);

	return 1.0 / (point_light.constant + point_light.linear
		* light_distance + point_light.quadratic
		* pow(light_distance, 2));
}

#endif