summaryrefslogtreecommitdiff
path: root/advanced_lighting/8.deferred_shading/shaders
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-06-15 16:11:31 +0500
committerpryazha <pryadeiniv@mail.ru>2025-06-15 16:11:31 +0500
commit9d944f26d359e4bc1ffd8e44350b0df9f0935b18 (patch)
tree9759a83a76ab741a587b99f00c2463eafd05d813 /advanced_lighting/8.deferred_shading/shaders
parentd65ddd07a43d5ffdcf2ddf90d6f86626cf9b92d8 (diff)
something
Diffstat (limited to 'advanced_lighting/8.deferred_shading/shaders')
-rw-r--r--advanced_lighting/8.deferred_shading/shaders/deferred.frag46
-rw-r--r--advanced_lighting/8.deferred_shading/shaders/gbuffer.frag23
-rw-r--r--advanced_lighting/8.deferred_shading/shaders/gbuffer.vert24
-rw-r--r--advanced_lighting/8.deferred_shading/shaders/light.frag11
-rw-r--r--advanced_lighting/8.deferred_shading/shaders/light.vert12
-rw-r--r--advanced_lighting/8.deferred_shading/shaders/screen.frag14
-rw-r--r--advanced_lighting/8.deferred_shading/shaders/screen.vert16
-rw-r--r--advanced_lighting/8.deferred_shading/shaders/specular.frag14
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);
+}