shadows WIP
This commit is contained in:
parent
e9ace829a2
commit
4021dcab1b
4 changed files with 95 additions and 16 deletions
49
data/pipelines/blur.shd
Normal file
49
data/pipelines/blur.shd
Normal 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;
|
||||
}
|
||||
]]
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue