aboutsummaryrefslogtreecommitdiff
path: root/examples/resources/shaders/glsl330/phong.fs
blob: c14b346a92682d1d5cb74f767e54cecd6f338208 (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
77
78
79
80
81
82
83
84
85
#version 330

// Input vertex attributes (from vertex shader)
in vec2 fragTexCoord;
in vec3 fragNormal;

// Input uniform values
uniform sampler2D texture0;
uniform vec4 fragTintColor;

// Output fragment color
out vec4 finalColor;

// NOTE: Add here your custom variables

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

// Calculate specular lighting component
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 + matGlossiness);
    }
   
    return (matSpecularColor*lightSpecularColor*lightSpecIntensity*specular);
}

void main()
{
    // Normalize input vectors
    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);
    
    // Texel color fetching from texture sampler
    vec4 texelColor = texture(texture0, fragTexCoord);

    // Calculate final fragment color
    finalColor = vec4(texelColor.rgb*(ambient + diffuse + specular), texelColor.a);
}