Refactor deferred_renderer::render
This commit is contained in:
parent
5cb74583a4
commit
22f1dde2dc
1 changed files with 44 additions and 183 deletions
|
|
@ -938,6 +938,44 @@ void main()
|
|||
if (o.mat->casts_shadow) casts_shadow_bbox |= o.bbox;
|
||||
}
|
||||
|
||||
auto render_all = [&](auto & program, auto && predicate)
|
||||
{
|
||||
for (auto const & p : objects_by_mask)
|
||||
{
|
||||
std::uint32_t mask = p.first;
|
||||
|
||||
if (!predicate(mask)) continue;
|
||||
|
||||
if (p.second.empty()) continue;
|
||||
|
||||
program["u_flag_mask"] = mask;
|
||||
|
||||
for (std::size_t i : p.second)
|
||||
{
|
||||
auto const & o = objects[i];
|
||||
|
||||
if (mask & O_UNIFORM_COLOR)
|
||||
program["u_color"] = *o.mat->color;
|
||||
|
||||
if (mask & O_TEXTURE_COLOR)
|
||||
{
|
||||
gl::ActiveTexture(gl::TEXTURE0);
|
||||
o.mat->texture->bind();
|
||||
}
|
||||
|
||||
if (mask & O_PRE_TRANSFORM)
|
||||
program["u_pre_transform"] = *o.pre_transform;
|
||||
|
||||
if (mask & O_POST_TRANSFORM)
|
||||
program["u_post_transform"] = *o.post_transform;
|
||||
|
||||
program["u_material"] = geom::vector<float, 3>{o.mat->diffuse, o.mat->specular.intensity, o.mat->specular.shininess};
|
||||
|
||||
o.mesh->draw();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Resize g-buffer if needed
|
||||
|
||||
auto const buffer_size = geom::cast<std::size_t>(target.viewport.dimensions());
|
||||
|
|
@ -1065,41 +1103,7 @@ void main()
|
|||
impl().g_buffer_pass_program["u_camera_transform"] = camera_transform;
|
||||
impl().g_buffer_pass_program["u_max_intensity"] = opts.max_intensity;
|
||||
|
||||
for (auto const & p : objects_by_mask)
|
||||
{
|
||||
std::uint32_t mask = p.first;
|
||||
|
||||
if (mask & O_TRANSPARENT)
|
||||
continue;
|
||||
|
||||
if (p.second.empty()) continue;
|
||||
|
||||
impl().g_buffer_pass_program["u_flag_mask"] = mask;
|
||||
|
||||
for (std::size_t i : p.second)
|
||||
{
|
||||
auto const & o = objects[i];
|
||||
|
||||
if (mask & O_UNIFORM_COLOR)
|
||||
impl().g_buffer_pass_program["u_color"] = *o.mat->color;
|
||||
|
||||
if (mask & O_TEXTURE_COLOR)
|
||||
{
|
||||
gl::ActiveTexture(gl::TEXTURE0);
|
||||
o.mat->texture->bind();
|
||||
}
|
||||
|
||||
if (mask & O_PRE_TRANSFORM)
|
||||
impl().g_buffer_pass_program["u_pre_transform"] = *o.pre_transform;
|
||||
|
||||
if (mask & O_POST_TRANSFORM)
|
||||
impl().g_buffer_pass_program["u_post_transform"] = *o.post_transform;
|
||||
|
||||
impl().g_buffer_pass_program["u_material"] = geom::vector<float, 3>{o.mat->diffuse, o.mat->specular.intensity, o.mat->specular.shininess};
|
||||
|
||||
o.mesh->draw();
|
||||
}
|
||||
}
|
||||
render_all(impl().g_buffer_pass_program, [](auto mask){ return !(mask & O_TRANSPARENT); });
|
||||
|
||||
// Render unlit transparent objects
|
||||
|
||||
|
|
@ -1115,39 +1119,7 @@ void main()
|
|||
|
||||
gl::DepthMask(gl::FALSE);
|
||||
|
||||
for (auto const & p : objects_by_mask)
|
||||
{
|
||||
std::uint32_t mask = p.first;
|
||||
|
||||
if (!(mask & O_TRANSPARENT))
|
||||
continue;
|
||||
|
||||
if (p.second.empty()) continue;
|
||||
|
||||
impl().transparent_pass_program["u_flag_mask"] = mask;
|
||||
|
||||
for (std::size_t i : p.second)
|
||||
{
|
||||
auto const & o = objects[i];
|
||||
|
||||
if (mask & O_UNIFORM_COLOR)
|
||||
impl().transparent_pass_program["u_color"] = *o.mat->color;
|
||||
|
||||
if (mask & O_TEXTURE_COLOR)
|
||||
{
|
||||
gl::ActiveTexture(gl::TEXTURE0);
|
||||
o.mat->texture->bind();
|
||||
}
|
||||
|
||||
if (mask & O_PRE_TRANSFORM)
|
||||
impl().transparent_pass_program["u_pre_transform"] = *o.pre_transform;
|
||||
|
||||
if (mask & O_POST_TRANSFORM)
|
||||
impl().transparent_pass_program["u_post_transform"] = *o.post_transform;
|
||||
|
||||
o.mesh->draw();
|
||||
}
|
||||
}
|
||||
render_all(impl().transparent_pass_program, [](auto mask){ return (mask & O_TRANSPARENT); });
|
||||
|
||||
// Render bloom
|
||||
|
||||
|
|
@ -1167,41 +1139,7 @@ void main()
|
|||
impl().bloom_pass_program["u_camera_transform"] = camera_transform;
|
||||
impl().bloom_pass_program["u_max_intensity"] = opts.max_intensity;
|
||||
|
||||
for (auto const & p : objects_by_mask)
|
||||
{
|
||||
std::uint32_t mask = p.first;
|
||||
|
||||
if (!(mask & O_BLOOMING))
|
||||
continue;
|
||||
|
||||
if (p.second.empty()) continue;
|
||||
|
||||
impl().bloom_pass_program["u_flag_mask"] = mask;
|
||||
|
||||
for (std::size_t i : p.second)
|
||||
{
|
||||
auto const & o = objects[i];
|
||||
|
||||
if (mask & O_UNIFORM_COLOR)
|
||||
impl().bloom_pass_program["u_color"] = *o.mat->color;
|
||||
|
||||
if (mask & O_TEXTURE_COLOR)
|
||||
{
|
||||
gl::ActiveTexture(gl::TEXTURE0);
|
||||
o.mat->texture->bind();
|
||||
}
|
||||
|
||||
if (mask & O_PRE_TRANSFORM)
|
||||
impl().bloom_pass_program["u_pre_transform"] = *o.pre_transform;
|
||||
|
||||
if (mask & O_POST_TRANSFORM)
|
||||
impl().bloom_pass_program["u_post_transform"] = *o.post_transform;
|
||||
|
||||
impl().bloom_pass_program["u_material"] = geom::vector<float, 3>{o.mat->diffuse, o.mat->specular.intensity, o.mat->specular.shininess};
|
||||
|
||||
o.mesh->draw();
|
||||
}
|
||||
}
|
||||
render_all(impl().bloom_pass_program, [](auto mask){ return (mask & O_BLOOMING); });
|
||||
}
|
||||
|
||||
// Render unlit transparent objects to bloom
|
||||
|
|
@ -1215,40 +1153,7 @@ void main()
|
|||
gl::Enable(gl::BLEND);
|
||||
gl::BlendFuncSeparate(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA, gl::ZERO, gl::ONE);
|
||||
|
||||
for (auto const & p : objects_by_mask)
|
||||
{
|
||||
std::uint32_t mask = p.first;
|
||||
|
||||
if (!(mask & O_TRANSPARENT))
|
||||
continue;
|
||||
|
||||
if (p.second.empty()) continue;
|
||||
|
||||
impl().transparent_pass_program["u_flag_mask"] = mask;
|
||||
|
||||
for (std::size_t i : p.second)
|
||||
{
|
||||
auto const & o = objects[i];
|
||||
|
||||
if (mask & O_UNIFORM_COLOR)
|
||||
impl().transparent_pass_program["u_color"] = *o.mat->color;
|
||||
|
||||
if (mask & O_TEXTURE_COLOR)
|
||||
{
|
||||
gl::ActiveTexture(gl::TEXTURE0);
|
||||
o.mat->texture->bind();
|
||||
}
|
||||
|
||||
if (mask & O_PRE_TRANSFORM)
|
||||
impl().transparent_pass_program["u_pre_transform"] = *o.pre_transform;
|
||||
|
||||
if (mask & O_POST_TRANSFORM)
|
||||
impl().transparent_pass_program["u_post_transform"] = *o.post_transform;
|
||||
|
||||
o.mesh->draw();
|
||||
}
|
||||
}
|
||||
|
||||
render_all(impl().transparent_pass_program, [](auto mask){ return (mask & O_TRANSPARENT); });
|
||||
}
|
||||
|
||||
gl::Disable(gl::BLEND);
|
||||
|
|
@ -1434,29 +1339,7 @@ void main()
|
|||
impl().shadow_builder_program.bind();
|
||||
impl().shadow_builder_program["u_light_transform"] = light_transform;
|
||||
|
||||
for (auto const & p : objects_by_mask)
|
||||
{
|
||||
if (p.second.empty()) continue;
|
||||
|
||||
std::uint32_t mask = p.first;
|
||||
|
||||
if (!(mask & O_CASTS_SHADOW)) continue;
|
||||
|
||||
impl().shadow_builder_program["u_flag_mask"] = mask;
|
||||
|
||||
for (std::size_t i : p.second)
|
||||
{
|
||||
auto const & o = objects[i];
|
||||
|
||||
if (mask & O_PRE_TRANSFORM)
|
||||
impl().shadow_builder_program["u_pre_transform"] = *o.pre_transform;
|
||||
|
||||
if (mask & O_POST_TRANSFORM)
|
||||
impl().shadow_builder_program["u_post_transform"] = *o.post_transform;
|
||||
|
||||
o.mesh->draw();
|
||||
}
|
||||
}
|
||||
render_all(impl().shadow_builder_program, [](auto mask){ return (mask & O_CASTS_SHADOW); });
|
||||
}
|
||||
|
||||
target.bind();
|
||||
|
|
@ -1617,29 +1500,7 @@ void main()
|
|||
impl().cubemap_shadow_builder_program["u_layer_transform[4]"] = transform[4] * translate_by_light;
|
||||
impl().cubemap_shadow_builder_program["u_layer_transform[5]"] = transform[5] * translate_by_light;
|
||||
|
||||
for (auto const & p : objects_by_mask)
|
||||
{
|
||||
if (p.second.empty()) continue;
|
||||
|
||||
std::uint32_t mask = p.first;
|
||||
|
||||
if (!(mask & O_CASTS_SHADOW)) continue;
|
||||
|
||||
impl().cubemap_shadow_builder_program["u_flag_mask"] = mask;
|
||||
|
||||
for (std::size_t i : p.second)
|
||||
{
|
||||
auto const & o = objects[i];
|
||||
|
||||
if (mask & O_PRE_TRANSFORM)
|
||||
impl().cubemap_shadow_builder_program["u_pre_transform"] = *o.pre_transform;
|
||||
|
||||
if (mask & O_POST_TRANSFORM)
|
||||
impl().cubemap_shadow_builder_program["u_post_transform"] = *o.post_transform;
|
||||
|
||||
o.mesh->draw();
|
||||
}
|
||||
}
|
||||
render_all(impl().cubemap_shadow_builder_program, [](auto mask){ return (mask & O_CASTS_SHADOW); });
|
||||
}
|
||||
|
||||
target.bind();
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue