summary refs log tree commit diff
path: root/res/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'res/shaders')
-rw-r--r--res/shaders/colors.fs55
1 files changed, 34 insertions, 21 deletions
diff --git a/res/shaders/colors.fs b/res/shaders/colors.fs
index f2e6bd9..228f555 100644
--- a/res/shaders/colors.fs
+++ b/res/shaders/colors.fs
@@ -11,6 +11,9 @@ struct Material {
 
 struct Light {
   vec3 position;
+  vec3 direction;
+
+  float cutOff;
 
   vec3 ambient;
   vec3 diffuse;
@@ -30,26 +33,36 @@ uniform Material material;
 uniform Light light;
 
 void main() {
-  // ambient
-  vec3 ambient = light.ambient * texture(material.diffuse, TexCoords).rgb;
-  // diffuse
-  vec3 norm = normalize(Normal);
   vec3 light_dir = normalize(light.position - FragPos);
-  float diff = max(dot(norm, light_dir), 0.0);
-  vec3 diffuse = light.diffuse * diff * texture(material.diffuse, TexCoords).rgb;
-  // specular
-  vec3 view_dir = normalize(view_position - FragPos);
-  vec3 reflect_dir = reflect(-light_dir, norm);
-  float spec = pow(max(dot(view_dir, reflect_dir), 0.0), material.shininess);
-  vec3 specular = light.specular * spec * texture(material.specular, TexCoords).rgb;
-
-  float distance = length(light.position - FragPos);
-  float attenuation = 1.0 / (light.constant + light.linear * distance + light.quadratic * (distance * distance));
-
-  ambient *= attenuation;
-  diffuse *= attenuation;
-  specular *= attenuation;
-
-  vec3 result = ambient + diffuse + specular;
-  FragColor = vec4(result, 1.0);
+
+  float theta = dot(light_dir, normalize(-light.direction));
+
+  if (theta > light.cutOff) {
+    // ambient
+    vec3 ambient = light.ambient * texture(material.diffuse, TexCoords).rgb;
+
+    // diffuse
+    vec3 norm = normalize(Normal);
+    float diff = max(dot(norm, light_dir), 0.0);
+    vec3 diffuse = light.diffuse * diff * texture(material.diffuse, TexCoords).rgb;
+
+    // specular
+    vec3 view_dir = normalize(view_position - FragPos);
+    vec3 reflect_dir = reflect(-light_dir, norm);
+    float spec = pow(max(dot(view_dir, reflect_dir), 0.0), material.shininess);
+    vec3 specular = light.specular * spec * texture(material.specular, TexCoords).rgb;
+
+    float distance = length(light.position - FragPos);
+    float attenuation = 1.0 / (light.constant + light.linear * distance + light.quadratic * (distance * distance));
+
+    diffuse *= attenuation;
+    specular *= attenuation;
+
+    vec3 result = ambient + diffuse + specular;
+    FragColor = vec4(result, 1.0);
+  } else {
+    FragColor = vec4(light.ambient * texture(material.diffuse, TexCoords).rgb, 1.0);
+  }
+
+
 }