LumixEngine/data/pipelines/bloom.lua

174 lines
5.4 KiB
Lua
Raw Normal View History

2020-09-15 13:10:22 +02:00
enabled = false
2020-09-17 02:02:18 +02:00
debug = false
2020-09-20 14:03:06 +02:00
only_autoexposure = false
2020-09-15 13:10:22 +02:00
luma_limit = 1
2020-09-17 02:02:18 +02:00
accomodation_speed = 1
2020-09-15 13:10:22 +02:00
local state = {
depth_write = false,
depth_test = false
}
2020-09-20 14:03:06 +02:00
function blurUpscale(env, buffer, smaller_buffer, format, w, h, tmp_rb_dbg_name)
local blur_buf = env.createRenderbuffer(w, h, format, tmp_rb_dbg_name)
env.setRenderTargets(blur_buf)
env.drawcallUniforms(1.0 / w, 1.0 / h, 0, 0)
env.viewport(0, 0, w, h)
env.drawArray(0, 3, env.bloom_blur_shader
, { buffer, smaller_buffer }
, { depth_test = false, depth_write = false }
, "BLUR_H"
)
env.setRenderTargets(buffer)
env.viewport(0, 0, w, h)
env.drawArray(0, 3, env.blur_shader
, { blur_buf }
, { depth_test = false, depth_write = false }
)
end
2020-09-15 13:10:22 +02:00
function blur(env, buffer, format, w, h, tmp_rb_dbg_name)
local blur_buf = env.createRenderbuffer(w, h, format, tmp_rb_dbg_name)
env.setRenderTargets(blur_buf)
2020-09-15 13:54:33 +02:00
env.drawcallUniforms(1.0 / w, 1.0 / h, 0, 0)
2020-09-15 13:10:22 +02:00
env.viewport(0, 0, w, h)
2020-09-20 14:03:06 +02:00
env.drawArray(0, 3, env.blur_shader
2020-09-15 13:10:22 +02:00
, { buffer }
, { depth_test = false, depth_write = false }
2020-09-15 13:54:33 +02:00
, "BLUR_H"
2020-09-15 13:10:22 +02:00
)
env.setRenderTargets(buffer)
env.viewport(0, 0, w, h)
2020-09-20 14:03:06 +02:00
env.drawArray(0, 3, env.blur_shader
2020-09-15 13:10:22 +02:00
, { blur_buf }
, { depth_test = false, depth_write = false }
)
end
function downscale(env, big, w, h)
local small = env.createRenderbuffer(w, h, "rgba16f", "bloom_downscaled")
env.setRenderTargets(small)
env.viewport(0, 0, w, h)
env.drawArray(0
2020-09-20 14:03:06 +02:00
, 3
2020-09-23 01:08:54 +02:00
, env.bloom_shader
2020-09-15 13:10:22 +02:00
, { big }
, state
2020-09-23 01:08:54 +02:00
, "DOWNSCALE"
2020-09-15 13:10:22 +02:00
)
return small
end
2020-09-17 02:02:18 +02:00
function autoexposure(env, hdr_buffer)
if env.PROBE ~= nil then
return hdr_buffer
end
env.beginBlock("autoexposure")
2020-09-23 01:08:54 +02:00
if env.lum_buf == nil then
env.lum_buf = env.createBuffer(2048);
2020-09-17 02:02:18 +02:00
end
2020-10-03 15:07:07 +02:00
env.setRenderTargets()
env.bindShaderBuffer(env.lum_buf, 1, true)
2020-09-23 01:08:54 +02:00
env.dispatch(env.avg_luminance_shader, 256, 1, 1, "PASS0");
env.bindRenderbuffers({ hdr_buffer }, 0)
2020-10-03 15:07:07 +02:00
env.bindShaderBuffer(env.lum_buf, 1, true)
2020-09-23 01:08:54 +02:00
env.drawcallUniforms(env.viewport_w, env.viewport_h, accomodation_speed)
env.dispatch(env.avg_luminance_shader, (env.viewport_w + 15) / 16, (env.viewport_h + 15) / 16, 1);
2020-10-03 15:07:07 +02:00
env.bindShaderBuffer(env.lum_buf, 1, true)
2020-09-23 01:08:54 +02:00
env.dispatch(env.avg_luminance_shader, 256, 1, 1, "PASS2");
2020-09-17 02:02:18 +02:00
env.endBlock()
end
function tonemap(env, hdr_buffer)
env.beginBlock("tonemap")
local rb
if env.APP ~= nil or env.PREVIEW ~= nil or env.screenshot_request == 1 then
rb = env.createRenderbuffer(env.viewport_w, env.viewport_h, "rgba8", "tonemap_bloom")
else
rb = env.createRenderbuffer(env.viewport_w, env.viewport_h, "rgba16f", "tonemap_bloom")
end
env.setRenderTargets(rb)
2020-10-03 15:07:07 +02:00
env.bindShaderBuffer(env.lum_buf, 5, false)
2020-09-20 14:03:06 +02:00
env.drawArray(0, 3, env.bloom_tonemap_shader
2020-09-23 01:08:54 +02:00
, { hdr_buffer }
2020-09-17 02:02:18 +02:00
, { depth_test = false }
)
env.endBlock()
return rb
end
2020-09-15 13:10:22 +02:00
function postprocess(env, transparent_phase, hdr_buffer, gbuffer0, gbuffer1, gbuffer_depth, shadowmap)
if not enabled then return hdr_buffer end
2020-10-03 15:07:07 +02:00
env.custom_tonemap = true
2020-09-17 02:02:18 +02:00
if transparent_phase == "tonemap" then return tonemap(env, hdr_buffer) end
2020-09-15 13:10:22 +02:00
if transparent_phase ~= "post" then return hdr_buffer end
2020-09-23 01:08:54 +02:00
if env.bloom_shader == nil then
env.avg_luminance_shader = env.preloadShader("pipelines/avg_luminance.shd")
2020-09-15 13:10:22 +02:00
env.bloom_shader = env.preloadShader("pipelines/bloom.shd")
2020-09-17 02:02:18 +02:00
env.bloom_tonemap_shader = env.preloadShader("pipelines/bloom_tonemap.shd")
2020-09-20 14:03:06 +02:00
env.bloom_blur_shader = env.preloadShader("pipelines/bloom_blur.shd")
2020-09-17 02:02:18 +02:00
env.textured_quad_shader = env.preloadShader("pipelines/textured_quad.shd")
2020-09-15 13:10:22 +02:00
end
if env.blur_shader == nil then
env.blur_shader = env.preloadShader("pipelines/blur.shd")
end
2020-09-17 02:02:18 +02:00
autoexposure(env, hdr_buffer)
2020-09-20 14:03:06 +02:00
if not only_autoexposure then
env.beginBlock("bloom")
local bloom_rb = env.createRenderbuffer(0.5 * env.viewport_w, 0.5 * env.viewport_h, "rgba16f", "bloom")
2020-09-15 13:10:22 +02:00
2020-09-20 14:03:06 +02:00
env.setRenderTargets(bloom_rb)
env.viewport(0, 0, 0.5 * env.viewport_w, 0.5 * env.viewport_h)
2020-09-23 01:08:54 +02:00
env.drawcallUniforms(luma_limit)
2020-10-03 15:07:07 +02:00
env.bindShaderBuffer(env.lum_buf, 5, false)
2020-09-20 14:03:06 +02:00
env.drawArray(0
, 3
2020-09-23 01:08:54 +02:00
, env.bloom_shader
, { hdr_buffer }
2020-09-20 14:03:06 +02:00
, state
2020-09-23 01:08:54 +02:00
, "EXTRACT"
2020-09-20 14:03:06 +02:00
)
2020-09-23 01:08:54 +02:00
if debug then
env.debugRenderbuffer(bloom_rb, hdr_buffer, {1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}, {0, 0, 0, 1})
else
local bloom2_rb = downscale(env, bloom_rb, env.viewport_w * 0.25, env.viewport_h * 0.25)
local bloom4_rb = downscale(env, bloom2_rb, env.viewport_w * 0.125, env.viewport_h * 0.125)
local bloom8_rb = downscale(env, bloom4_rb, env.viewport_w * 0.0625, env.viewport_h * 0.0625)
local bloom16_rb = downscale(env, bloom8_rb, env.viewport_w * 0.03125, env.viewport_h * 0.03125)
blur(env, bloom16_rb, "rgba16f", env.viewport_w * 0.03125, env.viewport_h * 0.03125, "bloom_blur")
blurUpscale(env, bloom8_rb, bloom16_rb, "rgba16f", env.viewport_w * 0.0625, env.viewport_h * 0.0625, "bloom_blur")
blurUpscale(env, bloom4_rb, bloom8_rb, "rgba16f", env.viewport_w * 0.125, env.viewport_h * 0.125, "bloom_blur")
blurUpscale(env, bloom2_rb, bloom4_rb, "rgba16f", env.viewport_w * 0.25, env.viewport_h * 0.25, "bloom_blur")
blurUpscale(env, bloom_rb, bloom2_rb, "rgba16f", env.viewport_w * 0.5, env.viewport_h * 0.5, "bloom_blur")
env.setRenderTargets(hdr_buffer)
env.drawArray(0, 3, env.bloom_shader
, { bloom_rb }
, { depth_test = false, depth_write = false, blending = "add" });
end
2020-09-20 14:03:06 +02:00
env.endBlock()
end
2020-09-17 02:02:18 +02:00
2020-09-15 13:10:22 +02:00
return hdr_buffer
end
function awake()
_G["postprocesses"] = _G["postprocesses"] or {}
_G["postprocesses"]["bloom"] = postprocess
end
function onDestroy()
_G["postprocesses"]["bloom"] = nil
end