LumixEngine/data/pipelines/ssao.lua
2020-04-07 20:07:00 +02:00

73 lines
No EOL
1.9 KiB
Lua

radius = 0.2
intensity = 1
local ssao_size = 1024
function blur(env, buffer, format, w, h, tmp_rb_dbg_name)
local blur_buf = env.createRenderbuffer(w, h, false, format, tmp_rb_dbg_name)
env.setRenderTargets(blur_buf)
env.viewport(0, 0, w, h)
env.drawArray(0, 4, env.blur_shader
, { buffer }
, { {1.0 / w, 1.0 / h, 0, 0 }}
, "BLUR_H"
, { depth_test = false, depth_write = false }
)
env.setRenderTargets(buffer)
env.viewport(0, 0, w, h)
env.drawArray(0, 4, env.blur_shader
, { blur_buf }
, { {1.0 / w, 1.0 / h, 0, 0 } }
, {}
, { depth_test = false, depth_write = false }
)
end
function postprocess(env, transparent_phase, hdr_buffer, gbuffer0, gbuffer1, gbuffer_depth, shadowmap)
if not enabled then return hdr_buffer end
if transparent_phase ~= "pre" then return hdr_buffer end
env.beginBlock("ssao")
if env.ssao_shader == nil then
env.ssao_shader = env.preloadShader("pipelines/ssao.shd")
end
if env.blur_shader == nil then
env.blur_shader = env.preloadShader("pipelines/blur.shd")
end
if env.ssao_blit_shader == nil then
env.ssao_blit_shader = env.preloadShader("pipelines/ssao_blit.shd")
end
local ssao_rb = env.createRenderbuffer(ssao_size, ssao_size, false, "r8", "ssao")
env.setRenderTargets(ssao_rb)
local state = {
depth_write = false,
depth_test = false
}
env.viewport(0, 0, ssao_size, ssao_size)
env.drawArray(0
, 4
, env.ssao_shader
, { gbuffer_depth, gbuffer1 }
, { {radius, intensity, 0, 0} }
, {}
, state
)
blur(env, ssao_rb, "r8", ssao_size, ssao_size, "ssao_blur")
env.setRenderTargets(hdr_buffer)
env.drawArray(0, 4, env.ssao_blit_shader
, { ssao_rb }
, {}
, {}
, { depth_test = false, depth_write = false, blending = "multiply" });
env.endBlock()
return hdr_buffer
end
function awake()
_G["postprocesses"] = _G["postprocesses"] or {}
_G["postprocesses"]["ssao"] = postprocess
end
function onDestroy()
_G["postprocesses"]["ssao"] = nil
end