LumixEngine/data/pipelines/sss.lua
2022-04-15 14:20:05 +02:00

57 lines
1.6 KiB
Lua

enabled = false
max_steps = 20
stride = 4
local sss_history = -1
function postprocess(env, phase, hdr_buffer, gbuffer0, gbuffer1, gbuffer2, gbuffer_depth, shadowmap)
if not enabled then return hdr_buffer end
if phase ~= "pre_lightpass" then return hdr_buffer end
env.sss_shader = env.sss_shader or env.preloadShader("pipelines/sss.shd")
env.sss_blit_shader = env.sss_blit_shader or env.preloadShader("pipelines/sss_blit.shd")
env.beginBlock("SSS")
local sss_rb = env.createRenderbuffer { width = env.viewport_w, height = env.viewport_h, format = "r8", debug_name = "sss_current", compute_write = true }
if sss_history == -1 then
sss_history = env.createRenderbuffer { width = env.viewport_w, height = env.viewport_h, format = "r8", debug_name = "sss_history", compute_write = true }
env.setRenderTargets(sss_history)
env.clear(env.CLEAR_ALL, 1, 1, 1, 1, 0)
end
env.setRenderTargets()
env.bindTextures({gbuffer_depth}, 0)
env.bindImageTexture(sss_rb, 1)
env.drawcallUniforms (
env.viewport_w,
env.viewport_h,
max_steps,
stride
)
env.dispatch(env.sss_shader, (env.viewport_w + 15) / 16, (env.viewport_h + 15) / 16, 1)
env.bindTextures({sss_history, gbuffer_depth}, 0)
env.bindImageTexture(gbuffer2, 0)
env.bindImageTexture(sss_rb, 1)
env.dispatch(env.sss_blit_shader, (env.viewport_w + 15) / 16, (env.viewport_h + 15) / 16, 1)
sss_history = sss_rb
env.keepRenderbufferAlive(sss_history)
env.endBlock()
end
function awake()
_G["postprocesses"] = _G["postprocesses"] or {}
_G["postprocesses"]["sss"] = postprocess
end
function onDestroy()
_G["postprocesses"]["sss"] = nil
end
function onUnload()
onDestroy()
end