aboutsummaryrefslogtreecommitdiff
path: root/apps/openmb/resources/shaders/godrays_radial.frag
diff options
context:
space:
mode:
Diffstat (limited to 'apps/openmb/resources/shaders/godrays_radial.frag')
-rw-r--r--apps/openmb/resources/shaders/godrays_radial.frag44
1 files changed, 44 insertions, 0 deletions
diff --git a/apps/openmb/resources/shaders/godrays_radial.frag b/apps/openmb/resources/shaders/godrays_radial.frag
new file mode 100644
index 0000000..3dfac87
--- /dev/null
+++ b/apps/openmb/resources/shaders/godrays_radial.frag
@@ -0,0 +1,44 @@
+#version 330 core
+in vec2 vTex;
+out vec4 FragColor;
+
+uniform sampler2D occlusionTex;
+uniform vec2 lightScreenPos; // in [0,1]
+uniform vec3 sunColor;
+uniform float sunIntensity;
+uniform float globalIntensity;
+uniform int samples;
+uniform float density;
+uniform float weight;
+uniform float decay;
+
+void main()
+{
+ vec2 texCoord = vTex;
+ // vector from current pixel to light
+ vec2 delta = lightScreenPos - texCoord;
+ float dist = length(delta);
+ vec2 stepv = delta * (1.0 / float(samples)) * density;
+
+ vec3 illumination = vec3(0.0);
+ float illumDecay = 1.0;
+
+ vec2 coord = texCoord;
+ for (int i = 0; i < samples; ++i)
+ {
+ coord += stepv;
+ vec3 sample = texture(occlusionTex, coord).rgb;
+ // occlusion tex stores white where geometry present
+ float occ = sample.r;
+ illumination += occ * illumDecay * weight;
+ illumDecay *= decay;
+ }
+
+ vec3 result = illumination * sunColor * sunIntensity * globalIntensity;
+ // tone-map / clamp to avoid extreme brightness
+ result = clamp(result, vec3(0.0), vec3(1.0));
+ // use luminance as alpha so we can composite less aggressively
+ float lum = dot(result, vec3(0.299, 0.587, 0.114));
+ float alpha = clamp(lum, 0.0, 1.0);
+ FragColor = vec4(result, alpha);
+}