diff options
author | pryazha <pryadeiniv@mail.ru> | 2025-06-15 16:11:31 +0500 |
---|---|---|
committer | pryazha <pryadeiniv@mail.ru> | 2025-06-15 16:11:31 +0500 |
commit | 9d944f26d359e4bc1ffd8e44350b0df9f0935b18 (patch) | |
tree | 9759a83a76ab741a587b99f00c2463eafd05d813 /advanced_lighting/8.deferred_shading/shaders | |
parent | d65ddd07a43d5ffdcf2ddf90d6f86626cf9b92d8 (diff) |
something
Diffstat (limited to 'advanced_lighting/8.deferred_shading/shaders')
8 files changed, 160 insertions, 0 deletions
diff --git a/advanced_lighting/8.deferred_shading/shaders/deferred.frag b/advanced_lighting/8.deferred_shading/shaders/deferred.frag new file mode 100644 index 0000000..56e5f58 --- /dev/null +++ b/advanced_lighting/8.deferred_shading/shaders/deferred.frag @@ -0,0 +1,46 @@ +#version 330 core + +in vert_t { + vec2 tex_coords; +} vert; + +out vec4 frag_color; + +uniform sampler2D positions; +uniform sampler2D normals; +uniform sampler2D color_specular; + +uniform vec3 view_position; + +struct light_t { + vec3 position; + vec3 color; +}; + +const int light_count = 200; +uniform light_t lights[light_count]; + +const float linear = 0.7f; +const float quadratic = 1.8f; + +void main() +{ + vec3 position = texture(positions, vert.tex_coords).rgb; + vec3 normal = texture(normals, vert.tex_coords).rgb; + vec3 color = texture(color_specular, vert.tex_coords).rgb; + float specular = texture(color_specular, vert.tex_coords).a; + + vec3 ambient = 0.1 * color; + vec3 view_dir = normalize(view_position - position); + vec3 result = ambient; + for (int i = 0; i < light_count; i++) { + vec3 light_dir = normalize(lights[i].position - position); + vec3 diffuse = max(dot(normal, light_dir), 0.0) * color * lights[i].color; + float distance = length(lights[i].position - position); + float attenuation = 1.0 / (1.0 + linear * distance + quadratic * distance * distance); + vec3 halfway_dir = normalize(view_dir + light_dir); + vec3 specular = pow(max(dot(halfway_dir, normal), 0.0), 32.0) * vec3(0.5); + result += (diffuse + specular) * attenuation; + } + frag_color = vec4(result, 1.0); +} diff --git a/advanced_lighting/8.deferred_shading/shaders/gbuffer.frag b/advanced_lighting/8.deferred_shading/shaders/gbuffer.frag new file mode 100644 index 0000000..5f82c0b --- /dev/null +++ b/advanced_lighting/8.deferred_shading/shaders/gbuffer.frag @@ -0,0 +1,23 @@ +#version 330 core + +in vert_t { + vec3 position; + vec3 normal; + vec2 tex_coords; +} vert; + +layout (location = 0) out vec3 position; +layout (location = 1) out vec3 normal; +layout (location = 2) out vec4 color_specular; + +uniform sampler2D texture_diffuse; + +void main() +{ + position = vert.position; + normal = vert.normal; + color_specular.rgb = texture(texture_diffuse, vert.tex_coords).rgb; + // TODO(pryazha): add specular texture + // color_specular.a = texture(texture_specular, vert.tex_coords).r; + color_specular.a = 1; +} diff --git a/advanced_lighting/8.deferred_shading/shaders/gbuffer.vert b/advanced_lighting/8.deferred_shading/shaders/gbuffer.vert new file mode 100644 index 0000000..1e825c8 --- /dev/null +++ b/advanced_lighting/8.deferred_shading/shaders/gbuffer.vert @@ -0,0 +1,24 @@ +#version 330 core + +layout (location = 0) in vec3 position; +layout (location = 1) in vec3 normal; +layout (location = 2) in vec2 tex_coords; + +out vert_t { + vec3 position; + vec3 normal; + vec2 tex_coords; +} vert; + +uniform mat4 projection; +uniform mat4 view; +uniform mat4 model; + +void main() +{ + vert.position = vec3(model * vec4(position, 1.0)); + mat3 matrix_normal = transpose(inverse(mat3(model))); + vert.normal = matrix_normal * normal; + vert.tex_coords = tex_coords; + gl_Position = projection * view * model * vec4(position, 1.0); +} diff --git a/advanced_lighting/8.deferred_shading/shaders/light.frag b/advanced_lighting/8.deferred_shading/shaders/light.frag new file mode 100644 index 0000000..e654b0e --- /dev/null +++ b/advanced_lighting/8.deferred_shading/shaders/light.frag @@ -0,0 +1,11 @@ +#version 330 core + +out vec4 frag_color; + +uniform vec3 light_color; + +void main() +{ + frag_color = vec4(light_color, 1.0); +} + diff --git a/advanced_lighting/8.deferred_shading/shaders/light.vert b/advanced_lighting/8.deferred_shading/shaders/light.vert new file mode 100644 index 0000000..03ac7e2 --- /dev/null +++ b/advanced_lighting/8.deferred_shading/shaders/light.vert @@ -0,0 +1,12 @@ +#version 330 core + +layout(location = 0) in vec3 position; + +uniform mat4 projection; +uniform mat4 view; +uniform mat4 model; + +void main() +{ + gl_Position = projection * view * model * vec4(position, 1.0); +} diff --git a/advanced_lighting/8.deferred_shading/shaders/screen.frag b/advanced_lighting/8.deferred_shading/shaders/screen.frag new file mode 100644 index 0000000..3ae592d --- /dev/null +++ b/advanced_lighting/8.deferred_shading/shaders/screen.frag @@ -0,0 +1,14 @@ +#version 330 core + +in vert_t { + vec2 tex_coords; +} vert; + +out vec4 frag_color; + +uniform sampler2D colorbuffer; + +void main() +{ + frag_color = vec4(texture(colorbuffer, vert.tex_coords).rgb, 1.0); +} diff --git a/advanced_lighting/8.deferred_shading/shaders/screen.vert b/advanced_lighting/8.deferred_shading/shaders/screen.vert new file mode 100644 index 0000000..335635b --- /dev/null +++ b/advanced_lighting/8.deferred_shading/shaders/screen.vert @@ -0,0 +1,16 @@ +#version 330 core + +layout (location = 0) in vec3 position; +layout (location = 2) in vec2 tex_coords; + +out vert_t { + vec2 tex_coords; +} vert; + +uniform mat4 model; + +void main() +{ + vert.tex_coords = tex_coords; + gl_Position = model * vec4(position, 1.0); +} diff --git a/advanced_lighting/8.deferred_shading/shaders/specular.frag b/advanced_lighting/8.deferred_shading/shaders/specular.frag new file mode 100644 index 0000000..e6ea10e --- /dev/null +++ b/advanced_lighting/8.deferred_shading/shaders/specular.frag @@ -0,0 +1,14 @@ +#version 330 core + +in vert_t { + vec2 tex_coords; +} vert; + +out vec4 frag_color; + +uniform sampler2D colorbuffer; + +void main() +{ + frag_color = vec4(vec3(texture(colorbuffer, vert.tex_coords).a), 1.0); +} |