aboutsummaryrefslogtreecommitdiff
path: root/shaders/glsl330/phong.fs
diff options
context:
space:
mode:
Diffstat (limited to 'shaders/glsl330/phong.fs')
-rw-r--r--shaders/glsl330/phong.fs76
1 files changed, 76 insertions, 0 deletions
diff --git a/shaders/glsl330/phong.fs b/shaders/glsl330/phong.fs
new file mode 100644
index 00000000..75b7e6d7
--- /dev/null
+++ b/shaders/glsl330/phong.fs
@@ -0,0 +1,76 @@
+#version 330
+
+// Vertex shader input data
+in vec2 fragTexCoord;
+in vec3 fragNormal;
+
+// Diffuse data
+uniform sampler2D texture0;
+uniform vec4 fragTintColor;
+
+// Light attributes
+uniform vec3 light_ambientColor = vec3(0.6, 0.3, 0);
+uniform vec3 light_diffuseColor = vec3(1, 0.5, 0);
+uniform vec3 light_specularColor = vec3(0, 1, 0);
+uniform float light_intensity = 1;
+uniform float light_specIntensity = 1;
+
+// Material attributes
+uniform vec3 mat_ambientColor = vec3(1, 1, 1);
+uniform vec3 mat_specularColor = vec3(1, 1, 1);
+uniform float mat_glossiness = 50;
+
+// World attributes
+uniform vec3 lightPos;
+uniform vec3 cameraPos;
+
+// Fragment shader output data
+out vec4 fragColor;
+
+vec3 AmbientLighting()
+{
+ return mat_ambientColor * light_ambientColor;
+}
+
+vec3 DiffuseLighting(in vec3 N, in vec3 L)
+{
+ // Lambertian reflection calculation
+ float diffuse = clamp(dot(N, L), 0, 1);
+
+ return tintColor.xyz * light_diffuseColor * light_intensity * diffuse;
+}
+
+vec3 SpecularLighting(in vec3 N, in vec3 L, in vec3 V)
+{
+ float specular = 0;
+
+ // Calculate specular reflection only if the surface is oriented to the light source
+ if(dot(N, L) > 0)
+ {
+ // Calculate half vector
+ vec3 H = normalize(L + V);
+
+ // Calculate specular intensity
+ specular = pow(dot(N, H), 3 + mat_glossiness);
+ }
+
+ return mat_specularColor * light_specularColor * light_specIntensity * specular;
+}
+
+void main()
+{
+ // Normalize input vectors
+ vec3 L = normalize(lightPos);
+ vec3 V = normalize(cameraPos);
+ vec3 N = normalize(fragNormal);
+
+ vec3 ambient = AmbientLighting();
+ vec3 diffuse = DiffuseLighting(N, L);
+ vec3 specular = SpecularLighting(N, L, V);
+
+ // Get base color from texture
+ vec4 textureColor = texture(texture0, fragTexCoord);
+ vec3 finalColor = textureColor.rgb;
+
+ fragColor = vec4(finalColor * (ambient + diffuse + specular), textureColor.a);
+} \ No newline at end of file