File: shading.glsl

package info (click to toggle)
python-moderngl-window 2.4.2-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 69,260 kB
  • sloc: python: 11,225; makefile: 20
file content (83 lines) | stat: -rw-r--r-- 2,207 bytes parent folder | download | duplicates (2)
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
#version 330

#if defined VERTEX_SHADER

uniform mat4 m_camera_inverse;
uniform mat4 m_projection_inverse;
uniform vec3 v_camera_pos;

in vec3 in_position;
in vec2 in_texcoord_0;

out vec3 view_ray;
out vec2 texcoord;

void main() {
    gl_Position = vec4(in_position, 1.0);

    // Convert in_position from clip space to view space.
    vec4 pos = m_projection_inverse * vec4(in_position, 1.0);
    // Normalize its z value.
    pos.xy /= -pos.z;
    pos.z = -1.0;
    pos.w = 1.0;
    // Convert to world space.
    pos = m_camera_inverse * pos;
    view_ray = pos.xyz - v_camera_pos;

    texcoord = in_texcoord_0;
}

#elif defined FRAGMENT_SHADER

uniform vec3 light_pos;
uniform vec3 camera_pos;
uniform vec3 base_color;
uniform vec4 material_properties;
uniform int render_mode;

uniform sampler2D g_view_z;
uniform sampler2D g_normal;
uniform sampler2D ssao_occlusion;

in vec3 view_ray;
in vec2 texcoord;

layout(location=0) out vec4 frag_color;

void main() {
    // Ignore background fragments.
    float view_z = texture(g_view_z, texcoord).x;
    if (view_z == 0.0) {
        discard;
    }

    // Load/compute the position and normal vectors (in world space).
    vec3 position = camera_pos + view_z * view_ray;
    vec3 normal = texture(g_normal, texcoord).xyz;

    // Compute lighting.
    float ambient_magnitude = material_properties.x;
    float diffuse_magnitude = material_properties.y;
    float specular_magnitude = material_properties.z;
    float specular_exponent = material_properties.w;
    float occlusion;
    if (render_mode != 1) {
        occlusion = texture(ssao_occlusion, texcoord).x;
    } else {
        occlusion = 1.0;
    }
    vec3 light_dir = normalize(light_pos - position);
    vec3 reflection_dir = reflect(-light_dir, normal);
    float ambient = ambient_magnitude * occlusion;
    float diffuse = diffuse_magnitude * max(dot(light_dir, normal), 0.0);
    float specular = specular_magnitude * pow(max(dot(light_dir, normal), 0.0), specular_exponent);
    float luminosity = ambient + diffuse + specular;
    vec3 color = luminosity * base_color;
    if (render_mode == 2) {
        color = vec3(occlusion);
    }
    frag_color = vec4(color, 1.0);
}

#endif