From 694f1b0ec3c119d4625dd1ab10145aed23642a6b Mon Sep 17 00:00:00 2001 From: Hunter Kvalevog Date: Thu, 13 Nov 2025 18:14:17 -0600 Subject: gl-vfog --- gl-vfog/fs.glsl | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 gl-vfog/fs.glsl (limited to 'gl-vfog/fs.glsl') diff --git a/gl-vfog/fs.glsl b/gl-vfog/fs.glsl new file mode 100644 index 0000000..00ec9b1 --- /dev/null +++ b/gl-vfog/fs.glsl @@ -0,0 +1,60 @@ +#version 330 core + +in vec3 f_p; + +out vec4 f_color; + +uniform vec3 u_cam; +uniform float u_time; +uniform int u_mode; +uniform float u_sigma; + +// Ray-AABB intersection +// ref: https://tavianator.com/2022/ray_box_boundary.html +bool intersect(vec3 ro, vec3 rd, vec3 bbmin, vec3 bbmax, out float t0, out float t1) +{ + vec3 inv = 1.0f / rd; + vec3 ta = (bbmin - ro) * inv; + vec3 tb = (bbmax - ro) * inv; + vec3 tmin = min(ta, tb); + vec3 tmax = max(ta, tb); + t0 = max(max(tmin.x, tmin.y), tmin.z); + t1 = min(min(tmax.x, tmax.y), tmax.z); + return t1 >= max(t0, 0.0f); +} + +// Mode 0: Basic +void main_0() +{ + vec3 bbmin = vec3(0.0f, 0.0f, 0.0f); + vec3 bbmax = vec3(1.0f, 1.0f, 1.0f); + + vec3 ro = u_cam; + vec3 rd = normalize(f_p - ro); + + float t0 = 0.0f; + float t1 = 0.0f; + if (!intersect(ro, rd, bbmin, bbmax, t0, t1)) { + f_color = vec4(0.0f, 0.0f, 0.0f, 0.0f); + return; + } + + // Clamp entry point in front of camera + float t_enter = max(t0, 0.0f); + float t_exit = t1; + float t_len = max(0.0f, t_exit - t_enter); + + // Beer-Lambert attenuation + // ref: https://en.wikipedia.org/wiki/Beer%E2%80%93Lambert_law + float a = 1.0f - exp(-u_sigma * t_len); + + f_color = vec4(vec3(1.0f), a); +} + +void main() +{ + switch (u_mode) { + case 0: { main_0(); } break; + default: { f_color = vec4(0.0f, 1.0f, 0.0f, 1.0f); } break; + } +} -- cgit v1.2.3