diff options
Diffstat (limited to 'advanced_lighting/4.normal_mapping/shaders')
-rw-r--r-- | advanced_lighting/4.normal_mapping/shaders/depth.fs | 14 | ||||
-rw-r--r-- | advanced_lighting/4.normal_mapping/shaders/depth.gs | 27 | ||||
-rw-r--r-- | advanced_lighting/4.normal_mapping/shaders/depth.vs | 10 | ||||
-rw-r--r-- | advanced_lighting/4.normal_mapping/shaders/shadow.fs | 105 | ||||
-rw-r--r-- | advanced_lighting/4.normal_mapping/shaders/shadow.vs | 29 |
5 files changed, 185 insertions, 0 deletions
diff --git a/advanced_lighting/4.normal_mapping/shaders/depth.fs b/advanced_lighting/4.normal_mapping/shaders/depth.fs new file mode 100644 index 0000000..88fb9e6 --- /dev/null +++ b/advanced_lighting/4.normal_mapping/shaders/depth.fs @@ -0,0 +1,14 @@ +#version 330 core + +in vec4 frag_pos; + +uniform vec3 light_pos; +uniform float far; + +void +main(void) +{ + float light_distance = length(frag_pos.xyz-light_pos); + light_distance = light_distance/far; + gl_FragDepth = light_distance; +} diff --git a/advanced_lighting/4.normal_mapping/shaders/depth.gs b/advanced_lighting/4.normal_mapping/shaders/depth.gs new file mode 100644 index 0000000..638e2b9 --- /dev/null +++ b/advanced_lighting/4.normal_mapping/shaders/depth.gs @@ -0,0 +1,27 @@ +#version 330 core +layout(triangles) in; +layout(triangle_strip, max_vertices=18) out; + +uniform mat4 shadow_transforms[6]; + +out vec4 frag_pos; + +void +main(void) +{ + for (int face = 0; + face < 6; + ++face) + { + gl_Layer = face; + for (int vertex = 0; + vertex < 3; + ++vertex) + { + frag_pos = gl_in[vertex].gl_Position; + gl_Position = shadow_transforms[face]*frag_pos; + EmitVertex(); + } + EndPrimitive(); + } +} diff --git a/advanced_lighting/4.normal_mapping/shaders/depth.vs b/advanced_lighting/4.normal_mapping/shaders/depth.vs new file mode 100644 index 0000000..37a3484 --- /dev/null +++ b/advanced_lighting/4.normal_mapping/shaders/depth.vs @@ -0,0 +1,10 @@ +#version 330 core +layout(location = 0) in vec3 apos; + +uniform mat4 model; + +void +main(void) +{ + gl_Position = model*vec4(apos, 1.0); +} diff --git a/advanced_lighting/4.normal_mapping/shaders/shadow.fs b/advanced_lighting/4.normal_mapping/shaders/shadow.fs new file mode 100644 index 0000000..6a3a8b0 --- /dev/null +++ b/advanced_lighting/4.normal_mapping/shaders/shadow.fs @@ -0,0 +1,105 @@ +#version 330 core + +in VS_OUT { + vec3 frag_pos; + vec3 normal; + vec2 tex_coords; +} fs_in; + +out vec4 frag_color; + +uniform vec3 light_pos; +uniform vec3 view_pos; +uniform float far; + +uniform sampler2D diffuse_texture; +uniform samplerCube depth_cubemap; + +vec3 grid_sampling_disk[20] = vec3[] +( + vec3(1, 1, 1), vec3( 1, -1, 1), vec3(-1, -1, 1), vec3(-1, 1, 1), + vec3(1, 1, -1), vec3( 1, -1, -1), vec3(-1, -1, -1), vec3(-1, 1, -1), + vec3(1, 1, 0), vec3( 1, -1, 0), vec3(-1, -1, 0), vec3(-1, 1, 0), + vec3(1, 0, 1), vec3(-1, 0, 1), vec3( 1, 0, -1), vec3(-1, 0, -1), + vec3(0, 1, 1), vec3( 0, -1, 1), vec3( 0, -1, -1), vec3( 0, 1, -1) +); + +float +calculate_shadow(vec3 frag_pos) +{ + vec3 frag_to_light = frag_pos-light_pos; + /* float closest_depth = texture(depth_cubemap, frag_to_light).r; */ + /* closest_depth *= far; */ + float current_depth = length(frag_to_light); + /* float bias = 0.05; */ + /* float shadow = current_depth-bias > closest_depth ? 1.0 : 0.0; */ + /* NOTE(pryazha): Display depth value for debugging */ + /* frag_color = vec4(vec3(closest_depth/far), 1.0); */ + /* + float shadow = 0.0; + float offset = 0.1; + float samples = 4.0; + for (float x = -offset; + x < offset; + x += offset/(samples*0.5)) + { + for (float y = -offset; + y < offset; + y += offset/(samples*0.5)) + { + for (float z = -offset; + z < offset; + z += offset/(samples*0.5)) + { + float closest_depth = texture(depth_cubemap, frag_to_light+vec3(x, y, z)).r; + closest_depth *= far; + if (current_depth-bias > closest_depth) + shadow += 1.0; + } + } + } + shadow /= (samples*samples*samples); + */ + + float shadow = 0.0; + float bias = 0.15; + int samples = 20; + float view_distance = length(view_pos-frag_pos); + float disk_radius = (1.0+(view_distance/far))/25.0; + for (int sample = 0; + sample < samples; + ++sample) + { + float closest_depth = texture(depth_cubemap, frag_to_light+ + grid_sampling_disk[sample]*disk_radius).r; + closest_depth *= far; + if (current_depth-bias > closest_depth) + shadow += 1.0; + } + shadow /= float(samples); + return(shadow); +} + +void +main(void) +{ + vec3 color = texture(diffuse_texture, fs_in.tex_coords).rgb; + vec3 normal = normalize(fs_in.normal); + vec3 light_color = vec3(0.5); + + vec3 ambient = 0.5*light_color; + + vec3 light_dir = normalize(light_pos-fs_in.frag_pos); + float diff = max(dot(light_dir, normal), 0.0); + vec3 diffuse = diff*light_color; + + vec3 view_dir = normalize(view_pos-fs_in.frag_pos); + vec3 halfway_dir = normalize(light_dir+view_dir); + float spec = pow(max(dot(halfway_dir, normal), 0.0), 64.0); + vec3 specular = spec*light_color; + + float shadow = calculate_shadow(fs_in.frag_pos); + vec3 lighting = (ambient+(1.0-shadow)*(diffuse+specular))*color; + + frag_color = vec4(lighting, 1.0); +} diff --git a/advanced_lighting/4.normal_mapping/shaders/shadow.vs b/advanced_lighting/4.normal_mapping/shaders/shadow.vs new file mode 100644 index 0000000..ac8ee4f --- /dev/null +++ b/advanced_lighting/4.normal_mapping/shaders/shadow.vs @@ -0,0 +1,29 @@ +#version 330 core +layout(location = 0) in vec3 apos; +layout(location = 1) in vec3 anormal; +layout(location = 2) in vec2 atex_coords; + +out VS_OUT { + vec3 frag_pos; + vec3 normal; + vec2 tex_coords; +} vs_out; + +uniform mat4 projection; +uniform mat4 view; +uniform mat4 model; + +uniform bool reverse_normals; + +void +main(void) +{ + vs_out.frag_pos = vec3(model*vec4(apos, 1.0)); + if (reverse_normals) + vs_out.normal = mat3(transpose(inverse(model)))*(-1.0*anormal); + else + vs_out.normal = mat3(transpose(inverse(model)))*anormal; + + vs_out.tex_coords = atex_coords; + gl_Position = projection*view*vec4(vs_out.frag_pos, 1.0); +} |