Compositor: add new uniforms

Provide the sunlight direction in view and world space and the near/far distance given by the CameraGroup.
This commit is contained in:
Fernando García Liñán 2021-07-26 12:04:56 +02:00
parent 420555c69c
commit 908dc467a8
2 changed files with 24 additions and 7 deletions

View File

@ -34,11 +34,13 @@
#include "CompositorUtil.hxx" #include "CompositorUtil.hxx"
class SunDirectionCallback : public osg::Uniform::Callback { class SunDirectionWorldCallback : public osg::Uniform::Callback {
public: public:
virtual void operator()(osg::Uniform *uniform, osg::NodeVisitor *nv) { virtual void operator()(osg::Uniform *uniform, osg::NodeVisitor *nv) {
SGUpdateVisitor *uv = dynamic_cast<SGUpdateVisitor *>(nv); SGUpdateVisitor *uv = dynamic_cast<SGUpdateVisitor *>(nv);
uniform->set(toOsg(uv->getLightDirection())); osg::Vec3f l = toOsg(uv->getLightDirection());
l.normalize();
uniform->set(l);
} }
}; };
@ -138,12 +140,14 @@ Compositor::Compositor(osg::View *view,
new osg::Uniform("fg_PrevProjectionMatrixInverse", osg::Matrixf()), new osg::Uniform("fg_PrevProjectionMatrixInverse", osg::Matrixf()),
new osg::Uniform("fg_CameraPositionCart", osg::Vec3f()), new osg::Uniform("fg_CameraPositionCart", osg::Vec3f()),
new osg::Uniform("fg_CameraPositionGeod", osg::Vec3f()), new osg::Uniform("fg_CameraPositionGeod", osg::Vec3f()),
new osg::Uniform("fg_NearFarPlanes", osg::Vec3f()), new osg::Uniform("fg_NearFar", osg::Vec2f()),
new osg::Uniform("fg_Planes", osg::Vec3f()),
new osg::Uniform("fg_Fcoef", 0.0f), 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()),
} }
{ {
_uniforms[SUN_DIRECTION]->setUpdateCallback(new SunDirectionCallback); _uniforms[SUN_DIRECTION_WORLD]->setUpdateCallback(new SunDirectionWorldCallback);
} }
Compositor::~Compositor() Compositor::~Compositor()
@ -186,6 +190,11 @@ Compositor::update(const osg::Matrix &view_matrix,
_uniforms[PREV_PROJECTION_MATRIX]->set(prev_proj_matrix); _uniforms[PREV_PROJECTION_MATRIX]->set(prev_proj_matrix);
_uniforms[PREV_PROJECTION_MATRIX_INV]->set(prev_proj_matrix_inv); _uniforms[PREV_PROJECTION_MATRIX_INV]->set(prev_proj_matrix_inv);
osg::Vec3f sun_dir_world;
_uniforms[SUN_DIRECTION_WORLD]->get(sun_dir_world);
osg::Vec4f sun_dir_view = osg::Vec4f(
sun_dir_world.x(), sun_dir_world.y(), sun_dir_world.z(), 0.0f) * view_matrix;
for (int i = 0; i < TOTAL_BUILTIN_UNIFORMS; ++i) { for (int i = 0; i < TOTAL_BUILTIN_UNIFORMS; ++i) {
osg::ref_ptr<osg::Uniform> u = _uniforms[i]; osg::ref_ptr<osg::Uniform> u = _uniforms[i];
switch (i) { switch (i) {
@ -212,9 +221,15 @@ Compositor::update(const osg::Matrix &view_matrix,
camera_pos_geod.getLatitudeRad(), camera_pos_geod.getLatitudeRad(),
camera_pos_geod.getElevationM())); camera_pos_geod.getElevationM()));
break; break;
case NEAR_FAR_PLANES: case NEAR_FAR:
u->set(osg::Vec2f(zNear, zFar));
break;
case PLANES:
u->set(osg::Vec3f(-zFar, -zFar * zNear, zFar - zNear)); u->set(osg::Vec3f(-zFar, -zFar * zNear, zFar - zNear));
break; break;
case SUN_DIRECTION:
u->set(osg::Vec3f(sun_dir_view.x(), sun_dir_view.y(), sun_dir_view.z()));
break;
case FCOEF: case FCOEF:
if (zFar != 0.0) if (zFar != 0.0)
u->set(2.0f / log2(float(zFar) + 1.0f)); u->set(2.0f / log2(float(zFar) + 1.0f));

View File

@ -57,9 +57,11 @@ public:
PREV_PROJECTION_MATRIX_INV, PREV_PROJECTION_MATRIX_INV,
CAMERA_POSITION_CART, CAMERA_POSITION_CART,
CAMERA_POSITION_GEOD, CAMERA_POSITION_GEOD,
NEAR_FAR_PLANES, NEAR_FAR,
PLANES,
FCOEF, FCOEF,
SUN_DIRECTION, SUN_DIRECTION,
SUN_DIRECTION_WORLD,
TOTAL_BUILTIN_UNIFORMS TOTAL_BUILTIN_UNIFORMS
}; };