osgShadow.MinimalDrawBoundsShadowMap是OpenSceneGraph中的阴影映射实现之一,使用非常高效,可以处理大型场景中的阴影渲染。
osgShadow.MinimalDrawBoundsShadowMap是一种基于边界框的实现,使用场景中节点的边界框作为阴影对象的计算。该方法更加高效,可以在大型场景中运行,但是渲染质量可能会低于其他阴影映射技术。
该方法可以适用于有限的灯光数量和较小的阴影深度图大小。
使用osgShadow.MinimalDrawBoundsShadowMap需要在阴影节点上设置相应的参数和属性,例如:
osg::ref_ptr<osgShadow::MinimalDrawBoundsShadowMap> sm = new osgShadow::MinimalDrawBoundsShadowMap;
sm->setTextureSize(osg::Vec2s(1024,1024));
sm->setMinimumShadowMapNearFarRatio(0.1f);
sm->setLight(viewer->getLight());
sm->setBaseTextureUnit(1);
在场景中添加阴影节点,例如:
osg::ref_ptr<osgShadow::ShadowedScene> root = new osgShadow::ShadowedScene;
root->addChild(scene);
root->setShadowTechnique(sm.get());
当渲染场景的时候,需要使用阴影视图进行渲染,例如:
viewer.setCameraManipulator(new osgGA::TrackballManipulator);
osg::ref_ptr<osgShadow::ShadowMap> sm = dynamic_cast<osgShadow::ShadowMap*>(root->getShadowTechnique());
if (sm)
{
viewer.addSlave(sm->getShadowedLightCamera(), sm->getTextureCamera());
}
设置阴影深度贴图的大小,例如:
sm->setTextureSize(osg::Vec2s(1024,1024));
设置阴影光源,例如:
sm->setLight(viewer->getLight());
设置阴影近平面和远平面的比例系数,例如:
sm->setMinimumShadowMapNearFarRatio(0.1f);
设置阴影贴图的纹理单元,例如:
sm->setBaseTextureUnit(1);
设置节点接收阴影的遍历掩码,例如:
osg::ref_ptr<osg::ShapeDrawable> sphere = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3d(0,0,0), 1.0));
sphere->setTraversalMask(osg::Drawable::SHADOW_RECEIVE);
设置节点投射阴影的遍历掩码,例如:
osg::ref_ptr<osg::ShapeDrawable> sphere = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3d(0,0,0), 1.0));
sphere->setTraversalMask(osg::Drawable::SHADOW_CASTER);