aboutsummaryrefslogtreecommitdiff
path: root/examples/resources/shaders/phong.fs
blob: f79413d98f5fa4e1ab49d3cadcfd0a9724d9a544 (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

// 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.0);
uniform vec3 light_diffuseColor = vec3(1.0, 0.5, 0.0);
uniform vec3 light_specularColor = vec3(0.0, 1.0, 0.0);
uniform float light_intensity = 1.0;
uniform float light_specIntensity = 1.0;

// Material attributes
uniform vec3 mat_ambientColor = vec3(1.0, 1.0, 1.0);
uniform vec3 mat_specularColor = vec3(1.0, 1.0, 1.0);
uniform float mat_glossiness = 50.0;

// 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 (fragTintColor.xyz*light_diffuseColor*light_intensity*diffuse);
}

vec3 SpecularLighting(in vec3 N, in vec3 L, in vec3 V)
{
   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 + 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);
}