|
@@ -1,76 +1,85 @@
|
|
|
#version 330
|
|
|
|
|
|
-// Vertex shader input data
|
|
|
+// Input vertex attributes (from vertex shader)
|
|
|
in vec2 fragTexCoord;
|
|
|
in vec3 fragNormal;
|
|
|
|
|
|
-// Diffuse data
|
|
|
+// Input uniform values
|
|
|
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;
|
|
|
+// Output fragment color
|
|
|
+out vec4 finalColor;
|
|
|
|
|
|
-// Material attributes
|
|
|
-uniform vec3 mat_ambientColor = vec3(1, 1, 1);
|
|
|
-uniform vec3 mat_specularColor = vec3(1, 1, 1);
|
|
|
-uniform float mat_glossiness = 50;
|
|
|
+// NOTE: Add here your custom variables
|
|
|
|
|
|
-// World attributes
|
|
|
-uniform vec3 lightPos;
|
|
|
-uniform vec3 cameraPos;
|
|
|
+// Light uniform values
|
|
|
+uniform vec3 lightAmbientColor = vec3(0.6, 0.3, 0.0);
|
|
|
+uniform vec3 lightDiffuseColor = vec3(1.0, 0.5, 0.0);
|
|
|
+uniform vec3 lightSpecularColor = vec3(0.0, 1.0, 0.0);
|
|
|
+uniform float lightIntensity = 1.0;
|
|
|
+uniform float lightSpecIntensity = 1.0;
|
|
|
+
|
|
|
+// Material uniform values
|
|
|
+uniform vec3 matAmbientColor = vec3(1.0, 1.0, 1.0);
|
|
|
+uniform vec3 matSpecularColor = vec3(1.0, 1.0, 1.0);
|
|
|
+uniform float matGlossiness = 50.0;
|
|
|
+
|
|
|
+// World uniform values
|
|
|
+uniform vec3 lightPosition;
|
|
|
+uniform vec3 cameraPosition;
|
|
|
|
|
|
// Fragment shader output data
|
|
|
out vec4 fragColor;
|
|
|
|
|
|
+// Calculate ambient lighting component
|
|
|
vec3 AmbientLighting()
|
|
|
{
|
|
|
- return mat_ambientColor * light_ambientColor;
|
|
|
+ return (matAmbientColor*lightAmbientColor);
|
|
|
}
|
|
|
|
|
|
+// Calculate diffuse lighting component
|
|
|
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;
|
|
|
+ // Lambertian reflection calculation
|
|
|
+ float diffuse = clamp(dot(N, L), 0, 1);
|
|
|
+
|
|
|
+ return (fragTintColor.xyz*lightDiffuseColor*lightIntensity*diffuse);
|
|
|
}
|
|
|
|
|
|
+// Calculate specular lighting component
|
|
|
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);
|
|
|
- }
|
|
|
+ float specular = 0.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 + matGlossiness);
|
|
|
+ }
|
|
|
|
|
|
- return mat_specularColor * light_specularColor * light_specIntensity * specular;
|
|
|
+ return (matSpecularColor*lightSpecularColor*lightSpecIntensity*specular);
|
|
|
}
|
|
|
|
|
|
void main()
|
|
|
{
|
|
|
// Normalize input vectors
|
|
|
- vec3 L = normalize(lightPos);
|
|
|
- vec3 V = normalize(cameraPos);
|
|
|
+ vec3 L = normalize(lightPosition);
|
|
|
+ vec3 V = normalize(cameraPosition);
|
|
|
vec3 N = normalize(fragNormal);
|
|
|
|
|
|
+ // Calculate lighting components
|
|
|
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);
|
|
|
+ // Texel color fetching from texture sampler
|
|
|
+ vec4 texelColor = texture(texture0, fragTexCoord);
|
|
|
+
|
|
|
+ // Calculate final fragment color
|
|
|
+ finalColor = vec4(texelColor.rgb*(ambient + diffuse + specular), texelColor.a);
|
|
|
}
|