Deferred renderer: implement primitive camera clipping
This commit is contained in:
parent
22f1dde2dc
commit
f4c94e318f
1 changed files with 21 additions and 5 deletions
|
|
@ -910,6 +910,7 @@ void main()
|
||||||
assert(opts.camera);
|
assert(opts.camera);
|
||||||
auto const camera_transform = opts.camera->transform();
|
auto const camera_transform = opts.camera->transform();
|
||||||
auto const camera_position = opts.camera->position();
|
auto const camera_position = opts.camera->position();
|
||||||
|
auto const camera_direction = opts.camera->direction();
|
||||||
|
|
||||||
// Sort objects by mask & compute bbox
|
// Sort objects by mask & compute bbox
|
||||||
|
|
||||||
|
|
@ -938,7 +939,7 @@ void main()
|
||||||
if (o.mat->casts_shadow) casts_shadow_bbox |= o.bbox;
|
if (o.mat->casts_shadow) casts_shadow_bbox |= o.bbox;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto render_all = [&](auto & program, auto && predicate)
|
auto render_all = [&](auto & program, auto && predicate, bool clip_by_camera = false)
|
||||||
{
|
{
|
||||||
for (auto const & p : objects_by_mask)
|
for (auto const & p : objects_by_mask)
|
||||||
{
|
{
|
||||||
|
|
@ -954,6 +955,21 @@ void main()
|
||||||
{
|
{
|
||||||
auto const & o = objects[i];
|
auto const & o = objects[i];
|
||||||
|
|
||||||
|
if (clip_by_camera)
|
||||||
|
{
|
||||||
|
bool clipped = true;
|
||||||
|
for (int c = 0; c < 8; ++c)
|
||||||
|
{
|
||||||
|
if (dot(o.bbox.corner(c & 1, (c & 2) >> 1, (c & 4) >> 1) - camera_position, camera_direction) > 0.f)
|
||||||
|
{
|
||||||
|
clipped = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (clipped)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (mask & O_UNIFORM_COLOR)
|
if (mask & O_UNIFORM_COLOR)
|
||||||
program["u_color"] = *o.mat->color;
|
program["u_color"] = *o.mat->color;
|
||||||
|
|
||||||
|
|
@ -1103,7 +1119,7 @@ void main()
|
||||||
impl().g_buffer_pass_program["u_camera_transform"] = camera_transform;
|
impl().g_buffer_pass_program["u_camera_transform"] = camera_transform;
|
||||||
impl().g_buffer_pass_program["u_max_intensity"] = opts.max_intensity;
|
impl().g_buffer_pass_program["u_max_intensity"] = opts.max_intensity;
|
||||||
|
|
||||||
render_all(impl().g_buffer_pass_program, [](auto mask){ return !(mask & O_TRANSPARENT); });
|
render_all(impl().g_buffer_pass_program, [](auto mask){ return !(mask & O_TRANSPARENT); }, true);
|
||||||
|
|
||||||
// Render unlit transparent objects
|
// Render unlit transparent objects
|
||||||
|
|
||||||
|
|
@ -1119,7 +1135,7 @@ void main()
|
||||||
|
|
||||||
gl::DepthMask(gl::FALSE);
|
gl::DepthMask(gl::FALSE);
|
||||||
|
|
||||||
render_all(impl().transparent_pass_program, [](auto mask){ return (mask & O_TRANSPARENT); });
|
render_all(impl().transparent_pass_program, [](auto mask){ return (mask & O_TRANSPARENT); }, true);
|
||||||
|
|
||||||
// Render bloom
|
// Render bloom
|
||||||
|
|
||||||
|
|
@ -1139,7 +1155,7 @@ void main()
|
||||||
impl().bloom_pass_program["u_camera_transform"] = camera_transform;
|
impl().bloom_pass_program["u_camera_transform"] = camera_transform;
|
||||||
impl().bloom_pass_program["u_max_intensity"] = opts.max_intensity;
|
impl().bloom_pass_program["u_max_intensity"] = opts.max_intensity;
|
||||||
|
|
||||||
render_all(impl().bloom_pass_program, [](auto mask){ return (mask & O_BLOOMING); });
|
render_all(impl().bloom_pass_program, [](auto mask){ return (mask & O_BLOOMING); }, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render unlit transparent objects to bloom
|
// Render unlit transparent objects to bloom
|
||||||
|
|
@ -1153,7 +1169,7 @@ void main()
|
||||||
gl::Enable(gl::BLEND);
|
gl::Enable(gl::BLEND);
|
||||||
gl::BlendFuncSeparate(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA, gl::ZERO, gl::ONE);
|
gl::BlendFuncSeparate(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA, gl::ZERO, gl::ONE);
|
||||||
|
|
||||||
render_all(impl().transparent_pass_program, [](auto mask){ return (mask & O_TRANSPARENT); });
|
render_all(impl().transparent_pass_program, [](auto mask){ return (mask & O_TRANSPARENT); }, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
gl::Disable(gl::BLEND);
|
gl::Disable(gl::BLEND);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue