summaryrefslogtreecommitdiff
path: root/intermediate/ts.glsl
diff options
context:
space:
mode:
Diffstat (limited to 'intermediate/ts.glsl')
-rw-r--r--intermediate/ts.glsl54
1 files changed, 37 insertions, 17 deletions
diff --git a/intermediate/ts.glsl b/intermediate/ts.glsl
index 61dd728..d80d6e4 100644
--- a/intermediate/ts.glsl
+++ b/intermediate/ts.glsl
@@ -35,6 +35,10 @@ dimension: 2
name: depthmap
stage: fragment
dimension: 2
+[texture]
+name: prev_occlusion
+stage: fragment
+dimension: 2
[struct]
name: Config
@@ -72,6 +76,9 @@ stage: fragment
[target]
name: shadow_amount
type: float
+[target]
+name: occlusion
+type: float
#endif
@@ -103,25 +110,25 @@ vec2 poissonDisk[16] = vec2[](
vec2(0.14383161, -0.14100790)
);
-float random(vec3 seed, int i){
- vec4 seed4 = vec4(seed,i);
+float random(vec3 seed, int i) {
+ vec4 seed4 = vec4(seed, i);
float dot_product = dot(seed4, vec4(12.9898,78.233,45.164,94.673));
return fract(sin(dot_product) * 43758.5453);
}
-float get_shadow(int id, vec3 wpos) {
+float get_shadow(int id, mat4 proj, vec3 wpos) {
const int taps = 4;
const float w = 1.0 / float(taps);
const float m = 1.0 / 1000.0;
int i;
float d = 0.0f;
- Caster caster = casters[id];
- vec4 surf = caster.projection * vec4(wpos, 1.0);
+ vec4 surf = proj * vec4(wpos, 1.0);
surf /= surf.w;
surf.xy = surf.xy * 0.5 + 0.5;
surf.z -= 0.005;
for (i = 0; i < taps; i++) {
- int index = int(16.0 * random(floor(wpos.xyz * 1000.0), i + globals.frame)) % 16;
+ float r = random(floor(wpos.xyz * 1000.0), i + globals.frame);
+ int index = int(16.0 * r) % 16;
vec2 coord = surf.xy + poissonDisk[index] * m;
vec4 vec = vec4(coord, float(id), surf.z);
d += texture(shadowmaps, vec).r * w;
@@ -129,31 +136,44 @@ float get_shadow(int id, vec3 wpos) {
return d;
}
-vec3 get_world_pos(float depth, vec2 uv) {
+vec4 get_world_pos(float depth, vec2 uv) {
float z = depth;
vec4 clip = vec4(uv * 2.0 - 1.0, z, 1.0);
vec4 view = config.inv_proj * clip;
view /= view.w;
- return (config.inv_view * view).xyz;
+ return config.inv_view * view;
}
void main() {
- float w_prev = 0.9;
- float w_cur = 0.1;
+ float w_prev = 0.99;
+ float w_cur = 0.01;
+ Caster caster = casters[caster_config.index];
vec2 uv = interpolator.uv;
float d = texture(depthmap, uv).r;
- vec3 wpos = get_world_pos(d, uv);
- vec4 prev_pos = config.prev_vp * vec4(wpos, 1.0);
+ float o = texture(prev_occlusion, uv).r;
+ vec4 wpos = get_world_pos(d, uv);
+ vec4 prev_pos = config.prev_vp * vec4(wpos.xyz, 1.0);
vec2 prev_uv = (prev_pos.xy / prev_pos.w) * 0.5 + 0.5;
float prev = texture(previous, prev_uv).r;
- float current = get_shadow(caster_config.index, wpos);
+ float base = get_shadow(
+ caster_config.index,
+ caster.projection,
+ wpos.xyz
+ );
+ float jittered = get_shadow(
+ caster_config.index + max_casters,
+ caster.jittered,
+ wpos.xyz
+ );
if (
prev_uv.x < 0.0 || prev_uv.x > 1.0 ||
- prev_uv.y < 0.0 || prev_uv.y > 1.0
+ prev_uv.y < 0.0 || prev_uv.y > 1.0 ||
+ abs(d - o) > 0.001
) {
- w_prev = 0.0;
- w_cur = 1.0;
+ shadow_amount = base;
+ } else {
+ shadow_amount = prev * w_prev + jittered * w_cur;
}
- shadow_amount = (prev * w_prev + current * w_cur);
+ occlusion = d;
}
#endif