Compositor: Add the LOD scale parameter to scene passes

This should allow us to change the LOD level for WS 3.0 on a per-pass basis.
This commit is contained in:
Fernando García Liñán 2021-08-16 17:02:21 +02:00
parent 910225532e
commit 6d3089ad6b
3 changed files with 7 additions and 10 deletions

View File

@ -148,7 +148,6 @@ Compositor::Compositor(osg::View *view,
new osg::Uniform("fg_CameraPositionGeod", osg::Vec3f()), new osg::Uniform("fg_CameraPositionGeod", osg::Vec3f()),
new osg::Uniform("fg_NearFar", osg::Vec2f()), new osg::Uniform("fg_NearFar", osg::Vec2f()),
new osg::Uniform("fg_Planes", osg::Vec3f()), new osg::Uniform("fg_Planes", osg::Vec3f()),
new osg::Uniform("fg_Fcoef", 0.0f),
new osg::Uniform("fg_SunDirection", osg::Vec3f()), new osg::Uniform("fg_SunDirection", osg::Vec3f()),
new osg::Uniform("fg_SunDirectionWorld", osg::Vec3f()), new osg::Uniform("fg_SunDirectionWorld", osg::Vec3f()),
} }
@ -237,10 +236,6 @@ Compositor::update(const osg::Matrix &view_matrix,
case SG_UNIFORM_SUN_DIRECTION: case SG_UNIFORM_SUN_DIRECTION:
u->set(osg::Vec3f(sun_dir_view.x(), sun_dir_view.y(), sun_dir_view.z())); u->set(osg::Vec3f(sun_dir_view.x(), sun_dir_view.y(), sun_dir_view.z()));
break; break;
case SG_UNIFORM_FCOEF:
if (zFar != 0.0)
u->set(2.0f / log2(float(zFar) + 1.0f));
break;
default: default:
// Unknown uniform // Unknown uniform
break; break;

View File

@ -59,7 +59,6 @@ public:
SG_UNIFORM_CAMERA_POSITION_GEOD, SG_UNIFORM_CAMERA_POSITION_GEOD,
SG_UNIFORM_NEAR_FAR, SG_UNIFORM_NEAR_FAR,
SG_UNIFORM_PLANES, SG_UNIFORM_PLANES,
SG_UNIFORM_FCOEF,
SG_UNIFORM_SUN_DIRECTION, SG_UNIFORM_SUN_DIRECTION,
SG_UNIFORM_SUN_DIRECTION_WORLD, SG_UNIFORM_SUN_DIRECTION_WORLD,
SG_TOTAL_BUILTIN_UNIFORMS SG_TOTAL_BUILTIN_UNIFORMS
@ -113,7 +112,7 @@ public:
typedef std::array< typedef std::array<
osg::ref_ptr<osg::Uniform>, osg::ref_ptr<osg::Uniform>,
SG_TOTAL_BUILTIN_UNIFORMS> BuiltinUniforms; SG_TOTAL_BUILTIN_UNIFORMS> BuiltinUniforms;
const BuiltinUniforms &getUniforms() const { return _uniforms; } const BuiltinUniforms &getBuiltinUniforms() const { return _uniforms; }
void addBuffer(const std::string &name, Buffer *buffer); void addBuffer(const std::string &name, Buffer *buffer);
void addPass(Pass *pass); void addPass(Pass *pass);

View File

@ -451,7 +451,7 @@ public:
| osg::StateAttribute::PROTECTED); | osg::StateAttribute::PROTECTED);
osg::StateSet *ss = camera->getOrCreateStateSet(); osg::StateSet *ss = camera->getOrCreateStateSet();
for (const auto &uniform : compositor->getUniforms()) for (const auto &uniform : compositor->getBuiltinUniforms())
ss->addUniform(uniform); ss->addUniform(uniform);
return pass.release(); return pass.release();
@ -743,6 +743,10 @@ public:
osg::Camera *camera = pass->camera; osg::Camera *camera = pass->camera;
camera->setAllowEventFocus(true); camera->setAllowEventFocus(true);
const SGPropertyNode *p_lod_scale = root->getNode("lod-scale");
if (p_lod_scale)
camera->setLODScale(p_lod_scale->getFloatValue());
const SGPropertyNode *p_clustered = root->getNode("clustered-shading"); const SGPropertyNode *p_clustered = root->getNode("clustered-shading");
ClusteredShading *clustered = nullptr; ClusteredShading *clustered = nullptr;
if (p_clustered) { if (p_clustered) {
@ -760,8 +764,7 @@ public:
pass->update_callback = new SceneUpdateCallback(cubemap_face, zNear, zFar); pass->update_callback = new SceneUpdateCallback(cubemap_face, zNear, zFar);
osg::StateSet *ss = camera->getOrCreateStateSet(); osg::StateSet *ss = camera->getOrCreateStateSet();
auto &uniforms = compositor->getUniforms(); auto &uniforms = compositor->getBuiltinUniforms();
ss->addUniform(uniforms[Compositor::SG_UNIFORM_FCOEF]);
ss->addUniform(uniforms[Compositor::SG_UNIFORM_SUN_DIRECTION]); ss->addUniform(uniforms[Compositor::SG_UNIFORM_SUN_DIRECTION]);
ss->addUniform(uniforms[Compositor::SG_UNIFORM_SUN_DIRECTION_WORLD]); ss->addUniform(uniforms[Compositor::SG_UNIFORM_SUN_DIRECTION_WORLD]);