diff options
Diffstat (limited to 'intermediate/ts.glsl')
-rw-r--r-- | intermediate/ts.glsl | 54 |
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 |