summaryrefslogtreecommitdiffstats
path: root/data/shaders
diff options
context:
space:
mode:
authoruntodesu <kirill@untode.su>2025-03-15 16:22:09 +0500
committeruntodesu <kirill@untode.su>2025-03-15 16:22:09 +0500
commit3bf42c6ff3805a0d42bbc661794a95ff31bedc26 (patch)
tree05049955847504808d6bed2bb7b155f8b03807bb /data/shaders
parent02294547dcde0d4ad76e229106702261e9f10a51 (diff)
downloadvoxelius-3bf42c6ff3805a0d42bbc661794a95ff31bedc26.tar.bz2
voxelius-3bf42c6ff3805a0d42bbc661794a95ff31bedc26.zip
Add whatever I was working on for the last month
Diffstat (limited to 'data/shaders')
-rw-r--r--data/shaders/chunk_quad.frag25
-rw-r--r--data/shaders/chunk_quad.vert85
-rw-r--r--data/shaders/outline.frag11
-rw-r--r--data/shaders/outline.vert21
4 files changed, 142 insertions, 0 deletions
diff --git a/data/shaders/chunk_quad.frag b/data/shaders/chunk_quad.frag
new file mode 100644
index 0000000..5a08099
--- /dev/null
+++ b/data/shaders/chunk_quad.frag
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: CC-BY-SA-4.0
+#version 330 core
+#pragma variant[0] WORLD_CURVATURE
+#pragma variant[1] WORLD_FOG
+
+in vec3 vs_TexCoord;
+in float vs_Shade;
+
+#if WORLD_FOG
+in float vs_FogFactor;
+#endif
+
+out vec4 frag_Target;
+
+uniform vec4 u_FogColor;
+uniform sampler2DArray u_Textures;
+
+void main(void)
+{
+ frag_Target = vs_Shade * texture(u_Textures, vs_TexCoord);
+
+#if WORLD_FOG
+ frag_Target = mix(frag_Target, u_FogColor, vs_FogFactor);
+#endif
+}
diff --git a/data/shaders/chunk_quad.vert b/data/shaders/chunk_quad.vert
new file mode 100644
index 0000000..50b343a
--- /dev/null
+++ b/data/shaders/chunk_quad.vert
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: CC-BY-SA-4.0
+#version 330 core
+#pragma variant[0] WORLD_CURVATURE
+#pragma variant[1] WORLD_FOG
+
+layout(location = 0) in vec3 vert_Position;
+layout(location = 1) in uvec2 vert_Quad;
+
+out vec3 vs_TexCoord;
+out float vs_Shade;
+
+#if WORLD_FOG
+out float vs_FogFactor;
+#endif
+
+uniform mat4x4 u_ViewProjMatrix;
+uniform vec3 u_WorldPosition;
+uniform uvec3 u_Timings;
+uniform float u_ViewDistance;
+
+void main(void)
+{
+ vec3 quad_offset;
+ quad_offset.x = float(0x00FFU & (vert_Quad.x >> 24U)) / 16.0;
+ quad_offset.y = float(0x00FFU & (vert_Quad.x >> 16U)) / 16.0;
+ quad_offset.z = float(0x00FFU & (vert_Quad.x >> 8U)) / 16.0;
+
+ vec2 quad_scale;
+ quad_scale.x = float((0x000FU & (vert_Quad.x >> 4U)) + 1U) / 16.0;
+ quad_scale.y = float((0x000FU & (vert_Quad.x >> 0U)) + 1U) / 16.0;
+
+ uint quad_facing = (0x000FU & (vert_Quad.y >> 28U));
+ uint quad_toffset = (0x07FFU & (vert_Quad.y >> 17));
+ uint quad_tframes = max(1U, (0x001FU & (vert_Quad.y >> 12)));
+
+ gl_Position.xyz = vert_Position;
+ gl_Position.x *= quad_scale.x;
+ gl_Position.z *= quad_scale.y;
+
+ vec3 positions[6]; // FIXME: 16
+ positions[0x00U] = vec3(gl_Position.x, 1.0 - gl_Position.z, 1.0);
+ positions[0x01U] = vec3(gl_Position.x, gl_Position.z, 0.0);
+ positions[0x03U] = vec3(1.0, 1.0 - gl_Position.x, gl_Position.z);
+ positions[0x02U] = vec3(0.0, gl_Position.x, gl_Position.z);
+ positions[0x04U] = vec3(gl_Position.x, 1.0, gl_Position.z);
+ positions[0x05U] = vec3(gl_Position.x, 0.0, 1.0 - gl_Position.z);
+
+ vec2 texcoords[6]; // FIXME: 16
+ texcoords[0x00U] = vec2(vert_Position.x, 1.0 - vert_Position.z);
+ texcoords[0x01U] = vec2(1.0 - vert_Position.x, vert_Position.z);
+ texcoords[0x03U] = vec2(-vert_Position.z, 1.0 - vert_Position.x);
+ texcoords[0x02U] = vec2(1.0 + vert_Position.z, vert_Position.x);
+ texcoords[0x04U] = vec2(1.0 - vert_Position.x, vert_Position.z);
+ texcoords[0x05U] = vec2(1.0 - vert_Position.x, vert_Position.z);
+
+ float shades[6]; // FIXME: 16
+ shades[0x00U] = 0.8;
+ shades[0x01U] = 0.8;
+ shades[0x02U] = 0.6;
+ shades[0x03U] = 0.6;
+ shades[0x04U] = 1.0;
+ shades[0x05U] = 0.4;
+
+ vs_TexCoord.xy = texcoords[quad_facing];
+ vs_TexCoord.z = floor(float(quad_toffset + u_Timings.z % quad_tframes) + 0.5);
+ vs_Shade = shades[quad_facing];
+
+ gl_Position.w = 1.0;
+ gl_Position.xyz = positions[quad_facing] + quad_offset + u_WorldPosition;
+ gl_Position = u_ViewProjMatrix * gl_Position;
+
+#if WORLD_CURVATURE
+ gl_Position.y -= gl_Position.z * gl_Position.z / u_ViewDistance / 32.0;
+ gl_Position.y -= gl_Position.x * gl_Position.x / u_ViewDistance / 32.0;
+#endif
+
+#if WORLD_FOG == 1
+ // Use a simple linear fog factor
+ vs_FogFactor = 1.0 - clamp((u_ViewDistance - length(gl_Position.xyz)) / (u_ViewDistance - 16.0), 0.0, 1.0);
+#elif WORLD_FOG == 2
+ // Use a fancy exponential fog factor
+ float fogd = 2.0 / u_ViewDistance * length(gl_Position.xyz);
+ vs_FogFactor = 1.0 - clamp(exp2(fogd * fogd * -1.442695), 0.0, 1.0);
+#endif
+}
diff --git a/data/shaders/outline.frag b/data/shaders/outline.frag
new file mode 100644
index 0000000..d8cae02
--- /dev/null
+++ b/data/shaders/outline.frag
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: CC-BY-SA-4.0
+#version 330 core
+
+out vec4 frag_Target;
+
+uniform vec4 u_Modulate;
+
+void main(void)
+{
+ frag_Target = u_Modulate;
+}
diff --git a/data/shaders/outline.vert b/data/shaders/outline.vert
new file mode 100644
index 0000000..07626af
--- /dev/null
+++ b/data/shaders/outline.vert
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: CC-BY-SA-4.0
+#version 330 core
+#pragma variant[0] WORLD_CURVATURE
+
+layout(location = 0) in vec3 vert_Position;
+
+uniform mat4x4 u_ViewProjMatrix;
+uniform vec3 u_WorldPosition;
+uniform float u_ViewDistance;
+uniform vec3 u_Scale;
+
+void main(void)
+{
+ gl_Position = u_ViewProjMatrix * vec4((u_WorldPosition + u_Scale * vert_Position), 1.0);
+ gl_Position.z -= 0.00025;
+
+#if WORLD_CURVATURE
+ gl_Position.y -= gl_Position.z * gl_Position.z / u_ViewDistance / 32.0;
+ gl_Position.y -= gl_Position.x * gl_Position.x / u_ViewDistance / 32.0;
+#endif
+}