2023-09-14 22:32:55 +02:00
|
|
|
return {
|
|
|
|
radius = 0.2,
|
|
|
|
intensity = 3,
|
|
|
|
use_temporal = true,
|
|
|
|
blur = false,
|
|
|
|
current_frame_weight = 0.05,
|
|
|
|
history_buf = -1,
|
|
|
|
enabled = true,
|
2019-09-26 22:48:35 +02:00
|
|
|
|
2023-09-14 22:32:55 +02:00
|
|
|
gui = function(self)
|
|
|
|
_, self.enabled = ImGui.Checkbox("Enabled", self.enabled)
|
|
|
|
_, self.intensity = ImGui.DragFloat("Intensity", self.intensity)
|
|
|
|
_, self.radius = ImGui.DragFloat("Radius", self.radius)
|
|
|
|
_, self.use_temporal = ImGui.Checkbox("Temporal", self.use_temporal)
|
|
|
|
end,
|
2021-10-03 01:32:55 +02:00
|
|
|
|
2023-09-14 22:32:55 +02:00
|
|
|
postprocess = function(self, env, hdr_buffer, gbuffer, shadowmap) : ()
|
|
|
|
if not self.enabled then return end
|
|
|
|
env.ssao_shader = env.ssao_shader or env.preloadShader("pipelines/ssao.shd")
|
|
|
|
env.blur_shader = env.blur_shader or env.preloadShader("pipelines/blur.shd")
|
|
|
|
env.ssao_blit_shader = env.ssao_blit_shader or env.preloadShader("pipelines/ssao_blit.shd")
|
|
|
|
env.ssao_resolve_shader = env.ssao_resolve_shader or env.preloadShader("pipelines/ssao_resolve.shd")
|
|
|
|
env.ssao_rb_desc = env.ssao_rb_desc or env.createRenderbufferDesc { rel_size = {0.5, 0.5}, format = "r8", debug_name = "ssao", compute_write = true }
|
2021-10-03 01:32:55 +02:00
|
|
|
|
2023-09-14 22:32:55 +02:00
|
|
|
local w = math.floor(env.viewport_w * 0.5)
|
|
|
|
local h = math.floor(env.viewport_h * 0.5)
|
|
|
|
local ssao_rb = env.createRenderbuffer(env.ssao_rb_desc)
|
2021-10-03 01:32:55 +02:00
|
|
|
|
2023-09-14 22:32:55 +02:00
|
|
|
if self.use_temporal and self.history_buf == -1 then
|
|
|
|
self.history_buf = env.createRenderbuffer(env.ssao_rb_desc)
|
|
|
|
env.setRenderTargets(self.history_buf)
|
|
|
|
env.clear(env.CLEAR_ALL, 1, 1, 1, 1, 0)
|
|
|
|
end
|
2021-02-22 21:19:03 +01:00
|
|
|
|
2023-09-14 22:32:55 +02:00
|
|
|
env.setRenderTargets()
|
2021-10-03 01:32:55 +02:00
|
|
|
|
2023-09-14 22:32:55 +02:00
|
|
|
env.beginBlock("ssao " .. tostring(w) .. "x" .. tostring(h))
|
|
|
|
env.drawcallUniforms(self.radius, self.intensity, w, h)
|
|
|
|
env.bindTextures({gbuffer.DS, gbuffer.B}, 0)
|
2021-10-04 22:31:00 +02:00
|
|
|
env.bindImageTexture(ssao_rb, 2)
|
2023-09-14 22:32:55 +02:00
|
|
|
env.dispatch(env.ssao_shader, (w + 15) / 16, (h + 15) / 16, 1)
|
|
|
|
|
|
|
|
env.ssao_blur_rb_desc = env.ssao_blur_rb_desc or env.createRenderbufferDesc { format = "r8", rel_size = {0.5, 0.5}, debug_name = "ssao_blur" }
|
|
|
|
if self.use_temporal then
|
|
|
|
env.beginBlock("ssao_resolve " .. tostring(w) .. "x" .. tostring(h))
|
|
|
|
env.drawcallUniforms( w, h, 0, 0, self.current_frame_weight, 0, 0, 0 )
|
|
|
|
env.bindTextures({gbuffer.DS, self.history_buf}, 0)
|
|
|
|
env.bindImageTexture(ssao_rb, 2)
|
|
|
|
env.dispatch(env.ssao_resolve_shader, (w + 15) / 16, (h + 15) / 16, 1)
|
|
|
|
env.endBlock()
|
|
|
|
if self.blur then
|
|
|
|
env.blur(ssao_rb, w, h, env.ssao_blur_rb_desc)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
if self.blur then
|
|
|
|
env.blur(ssao_rb, w, h, env.ssao_blur_rb_desc)
|
|
|
|
end
|
2022-05-08 09:39:44 +02:00
|
|
|
end
|
2021-10-03 01:32:55 +02:00
|
|
|
|
2023-09-14 22:32:55 +02:00
|
|
|
env.beginBlock("ssao_blit " .. tostring(env.viewport_w) .. "x" .. tostring(env.viewport_h))
|
|
|
|
env.drawcallUniforms( env.viewport_w, env.viewport_h, 0, 0 )
|
|
|
|
env.bindTextures({ssao_rb}, 0)
|
|
|
|
env.bindImageTexture(gbuffer.B, 1)
|
|
|
|
env.dispatch(env.ssao_blit_shader, (env.viewport_w + 15) / 16, (env.viewport_h + 15) / 16, 1)
|
|
|
|
env.endBlock()
|
|
|
|
env.endBlock()
|
2021-10-03 01:32:55 +02:00
|
|
|
|
2023-09-14 22:32:55 +02:00
|
|
|
if self.use_temporal then
|
|
|
|
self.history_buf = ssao_rb
|
|
|
|
env.keepRenderbufferAlive(self.history_buf)
|
|
|
|
end
|
2021-10-03 01:32:55 +02:00
|
|
|
end
|
2023-09-14 22:32:55 +02:00
|
|
|
}
|