shadows WIP

This commit is contained in:
Mikulas Florek 2019-01-06 16:26:34 +01:00
parent e9ace829a2
commit 4021dcab1b
4 changed files with 95 additions and 16 deletions

49
data/pipelines/blur.shd Normal file
View file

@ -0,0 +1,49 @@
vertex_shader [[
uniform vec4 u_inv_sm_size;
out vec4 v_tc0;
out vec4 v_tc1;
out vec4 v_tc2;
void main() {
vec2 uv = vec2(gl_VertexID & 1, (gl_VertexID & 2) * 0.5);
v_tc0 = vec4(uv, 0, 0);
#ifdef BLUR_H
v_tc1 = vec4(
uv.x + 1.3846153846 * u_inv_sm_size.x, uv.y,
uv.x + 3.2307692308 * u_inv_sm_size.x, uv.y
);
v_tc2 = vec4(
uv.x - 1.3846153846 * u_inv_sm_size.x, uv.y,
uv.x - 3.2307692308 * u_inv_sm_size.x, uv.y
);
#else
v_tc1 = vec4(
uv.x, uv.y + 1.3846153846 * u_inv_sm_size.y,
uv.x, uv.y + 3.2307692308 * u_inv_sm_size.y
);
v_tc2 = vec4(
uv.x, uv.y - 1.3846153846 * u_inv_sm_size.y,
uv.x, uv.y - 3.2307692308 * u_inv_sm_size.y
);
#endif
vec4 pos = vec4((gl_VertexID & 1) * 2 - 1, (gl_VertexID & 2) - 1, 0, 1);
gl_Position = pos;
}
]]
fragment_shader [[
layout (binding=0) uniform sampler2D u_input;
in vec4 v_tc0;
in vec4 v_tc1;
in vec4 v_tc2;
out vec4 o_color;
void main() {
o_color = texture2D(u_input, v_tc0.xy) * 0.2270270270
+ texture2D(u_input, v_tc1.xy) * 0.3162162162
+ texture2D(u_input, v_tc1.zw) * 0.0702702703
+ texture2D(u_input, v_tc2.xy) * 0.3162162162
+ texture2D(u_input, v_tc2.zw) * 0.0702702703;
}
]]

View file

@ -45,9 +45,10 @@ float getShadow(sampler2D shadowmap, vec3 wpos)
for (int i = 0; i < 4; ++i) {
vec4 sc = u_shadowmap_matrices[i] * pos;
sc = sc / sc.w;
if(all(lessThan(sc.xy, vec2(0.99))) && all(greaterThan(sc.xy, vec2(0.01)))) {
float d = textureLod(shadowmap, vec2(sc.x * 0.25 + i * 0.25, sc.y), 0).x;
return sc.z >= d - 0.00001 ? 1 : 0;
if (all(lessThan(sc.xy, vec2(0.99))) && all(greaterThan(sc.xy, vec2(0.01)))) {
vec2 sm_uv = vec2(sc.x * 0.25 + i * 0.25, sc.y);
float occluder = textureLod(shadowmap, sm_uv, 0).r;
return clamp(exp(5000 * (sc.z - occluder)), 0.0, 1.0);
}
}

View file

@ -4,6 +4,7 @@ local tonemap_shader = preloadShader("pipelines/tonemap.shd")
local environment_shader = preloadShader("pipelines/environment.shd")
local selection_outline_shader = preloadShader("pipelines/selection_outline.shd")
local local_light_shader = preloadShader("pipelines/local_light.shd")
local blur_shader = preloadShader("pipelines/blur.shd")
local prepare_terrain_shader = preloadShader("pipelines/prepare_terrain.shd")
local debug_shadowmap = false
@ -116,21 +117,46 @@ function debugRenderbuffer(rb, output)
, { depth_test = false });
end
function blur(buffer, format, w, h, tmp_rb_dbg_name)
local blur_buf = createRenderbuffer(w, h, false, format, tmp_rb_dbg_name)
setRenderTargets(blur_buf)
viewport(0, 0, w, h)
drawArray(0, 4, blur_shader
, { buffer }
, { u_inv_sm_size = {1.0 / w, 1.0 / h, 0, 0 }}
, "BLUR_H"
, { depth_test = false, depth_write = false }
)
setRenderTargets(buffer)
viewport(0, 0, w, h)
drawArray(0, 4, blur_shader
, { blur_buf }
, { u_inv_sm_size = {1.0 / w, 1.0 / h, 0, 0 }}
, {}
, { depth_test = false, depth_write = false }
)
end
function shadowPass()
beginBlock("shadows")
local rb = createRenderbuffer(4096, 1024, false, "depth24", "shadowmap")
setRenderTargets(rb)
clear(CLEAR_DEPTH, 0, 0, 0, 1, 0)
for slice = 0, 3 do
local view_params = getShadowCameraParams(slice, 4096)
local shadow_set = prepareCommands(view_params, { { layers = { "default" } } })
local rb = createRenderbuffer(4096, 1024, false, "r32f", "shadowmap")
local depthbuf = createRenderbuffer(4096, 1024, false, "depth24", "shadowmap_depth")
setRenderTargets(rb, depthbuf)
clear(CLEAR_ALL, 0, 0, 0, 1, 0)
viewport(slice * 1024, 0, 1024, 1024)
beginBlock("slice " .. tostring(slice + 1))
renderBucket(shadow_set, shadow_state)
endBlock()
end
for slice = 0, 3 do
local view_params = getShadowCameraParams(slice, 4096)
local shadow_set = prepareCommands(view_params, { { layers = { "default" } } })
viewport(slice * 1024, 0, 1024, 1024)
beginBlock("slice " .. tostring(slice + 1))
renderBucket(shadow_set, shadow_state)
endBlock()
end
endBlock()
beginBlock("shadow_blur")
blur(rb, "r32f", 4096, 1024, "shadowmap_blur")
endBlock()
return rb
end

View file

@ -89,7 +89,9 @@ fragment_shader [[
in vec3 v_normal;
in vec4 v_wpos;
#ifdef DEFERRED
#ifdef DEPTH
layout(location = 0) out float o_depth;
#elif defined DEFERRED
layout(location = 0) out vec4 o_gbuffer0;
layout(location = 1) out vec4 o_gbuffer1;
layout(location = 2) out vec4 o_gbuffer2;
@ -117,6 +119,7 @@ fragment_shader [[
data.albedo = texture(u_albedomap, v_uv);
if(data.albedo.a < 0.5) discard;
#endif
o_depth = gl_FragCoord.z;
}
#elif defined DEFERRED
void main()