From 73f00bd8420a9125a8a5f8c5bbfed1a3be80f849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Garc=C3=ADa=20Li=C3=B1=C3=A1n?= Date: Sun, 22 Mar 2020 16:49:18 +0100 Subject: [PATCH] Compositor: Added support for logarithmic depth buffer. --- simgear/scene/viewer/Compositor.cxx | 11 +++++++++++ simgear/scene/viewer/Compositor.hxx | 2 ++ simgear/scene/viewer/CompositorPass.cxx | 5 ++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/simgear/scene/viewer/Compositor.cxx b/simgear/scene/viewer/Compositor.cxx index e91b1d44..ffaccdba 100644 --- a/simgear/scene/viewer/Compositor.cxx +++ b/simgear/scene/viewer/Compositor.cxx @@ -129,6 +129,8 @@ Compositor::Compositor(osg::View *view, new osg::Uniform("fg_PrevProjectionMatrixInverse", osg::Matrixf()), new osg::Uniform("fg_CameraPositionCart", osg::Vec3f()), new osg::Uniform("fg_CameraPositionGeod", osg::Vec3f()), + new osg::Uniform("fg_NearFarPlanes", osg::Vec3f()), + new osg::Uniform("fg_Fcoef", 0.0f), new osg::Uniform("fg_LightDirection", osg::Vec3f()) } { @@ -165,6 +167,9 @@ Compositor::update(const osg::Matrix &view_matrix, SGGeod camera_pos_geod = SGGeod::fromCart( SGVec3d(camera_pos.x(), camera_pos.y(), camera_pos.z())); + double left, right, bottom, top, zNear, zFar; + proj_matrix.getFrustum(left, right, bottom, top, zNear, zFar); + osg::Matrixf prev_view_matrix, prev_view_matrix_inv; _uniforms[VIEW_MATRIX]->get(prev_view_matrix); _uniforms[VIEW_MATRIX_INV]->get(prev_view_matrix_inv); @@ -203,6 +208,12 @@ Compositor::update(const osg::Matrix &view_matrix, camera_pos_geod.getLatitudeRad(), camera_pos_geod.getElevationM())); break; + case NEAR_FAR_PLANES: + u->set(osg::Vec3f(-zFar, -zFar * zNear, zFar - zNear)); + break; + case FCOEF: + u->set(2.0f / log2(float(zFar) + 1.0f)); + break; default: // Unknown uniform break; diff --git a/simgear/scene/viewer/Compositor.hxx b/simgear/scene/viewer/Compositor.hxx index 23855347..f7e538c9 100644 --- a/simgear/scene/viewer/Compositor.hxx +++ b/simgear/scene/viewer/Compositor.hxx @@ -57,6 +57,8 @@ public: PREV_PROJECTION_MATRIX_INV, CAMERA_POSITION_CART, CAMERA_POSITION_GEOD, + NEAR_FAR_PLANES, + FCOEF, LIGHT_DIRECTION, TOTAL_BUILTIN_UNIFORMS }; diff --git a/simgear/scene/viewer/CompositorPass.cxx b/simgear/scene/viewer/CompositorPass.cxx index aa727305..dd89237f 100644 --- a/simgear/scene/viewer/CompositorPass.cxx +++ b/simgear/scene/viewer/CompositorPass.cxx @@ -385,7 +385,6 @@ public: virtual void operator()(osg::Node *node, osg::NodeVisitor *nv) { osg::Camera *camera = static_cast(node); - EffectCullVisitor *cv = dynamic_cast(nv); traverse(node, nv); @@ -720,6 +719,10 @@ public: } } + osg::StateSet *ss = camera->getOrCreateStateSet(); + auto &uniforms = compositor->getUniforms(); + ss->addUniform(uniforms[Compositor::FCOEF]); + return pass.release(); } };