@@ -9,6 +9,10 @@ struct Light {
9
9
float linear;
10
10
float quadratic;
11
11
12
+ // Only for spot lighting
13
+ float cutOff;
14
+ float outerCutOff;
15
+
12
16
// TODO: Investigate to change on boolean
13
17
// Type of lighting
14
18
int isDirection;
@@ -41,9 +45,9 @@ uniform vec3 viewPosition;
41
45
out vec4 color;
42
46
43
47
44
- vec3 calculateDirectionLight(Light light , Material material , vec3 normal , vec3 viewDir );
45
- vec3 calculatePointLight(Light light , Material material , vec3 normal , vec3 fragPos , vec3 viewDir );
46
- vec3 calculateSpotLight();
48
+ vec3 calculateDirectionLight(Light, Material, vec3 , vec3 );
49
+ vec3 calculatePointLight(Light, Material, vec3 , vec3 , vec3 );
50
+ vec3 calculateSpotLight(Light, Material, vec3 , vec3 , vec3 );
47
51
48
52
49
53
void main() {
@@ -58,7 +62,7 @@ void main() {
58
62
result = calculatePointLight(light, material, norm, FragPos, viewDir);
59
63
}
60
64
else if (light.isSpot == 1 ) {
61
- result = calculateSpotLight();
65
+ result = calculateSpotLight(light, material, norm, FragPos, viewDir );
62
66
}
63
67
64
68
color = vec4 ((result * material.color) * light.intensity, 1 .0f);
@@ -109,6 +113,34 @@ vec3 calculatePointLight(Light light, Material material, vec3 normal, vec3 fragP
109
113
}
110
114
111
115
112
- vec3 calculateSpotLight() {
113
- return vec3 (0 .0f);
116
+ vec3 calculateSpotLight(Light light, Material material, vec3 normal, vec3 fragPos, vec3 viewDir) {
117
+ // Ambient
118
+ vec3 ambient = light.ambient * material.ambient;
119
+
120
+ // Diffuse
121
+ vec3 lightDir = normalize (light.position - fragPos);
122
+ float diff = max (dot (normal, lightDir), 0.0 );
123
+ vec3 diffuse = light.diffuse * (diff * material.diffuse);
124
+
125
+ // Specular
126
+ vec3 reflectDir = reflect (- lightDir, normal);
127
+ float spec = pow (max (dot (viewDir, reflectDir), 0.0 ), material.shininess);
128
+ vec3 specular = light.specular * (spec * material.specular);
129
+
130
+ // Spotlight - soft edges
131
+ float theta = dot (lightDir, normalize (- light.direction));
132
+ float epsilon = (light.cutOff - light.outerCutOff);
133
+ float intensity = clamp ((theta - light.outerCutOff) / epsilon, 0.0 , 1.0 );
134
+ diffuse *= intensity;
135
+ specular *= intensity;
136
+
137
+ // TODO: Why it's not work??
138
+ // Attenuation
139
+ // float distance = length(light.position - FragPos);
140
+ // float attenuation = 1.0 / (light.constant + light.linear * distance + light.quadratic * (distance * distance));
141
+ // ambient *= attenuation;
142
+ // diffuse *= attenuation;
143
+ // specular *= attenuation;
144
+
145
+ return ambient + diffuse + specular;
114
146
}
0 commit comments