osgShadow.ShadowMap
是OpenSceneGraph的可阴影地图类。它实现了阴影映射来产生灯光投射的阴影。阴影映射通常通过深度贴图来实现阴影渲染,具有高效和可扩展性的特点。
使用osgShadow.ShadowMap
创建阴影,需要遵循以下步骤:
创建光源
首先,需要创建光源。光源可以是osg::Light
对象,或者是任何继承自osg::PositionAttitudeTransform
的物体,如osg::MatrixTransform
、osg::Node
或osg::Geode
。
创建阴影渲染组
然后,需要创建一个用于渲染阴影的osgShadow.ShadowedScene
对象。这个对象包含了需要生成阴影的所有场景图物体。
创建阴影映射器
创建osgShadow.ShadowMap
对象,并将光源和渲染组设置到它的属性中:
osg::ref_ptr<osgShadow::ShadowMap> sm = new osgShadow::ShadowMap;
sm->setLight(light);
sm->setShadowedScene(shadowedScene.get());
设置阴影参数
根据需要,可以通过以下属性调整阴影的外观:
// 设置阴影贴图大小
sm->setTextureSize(osg::Vec2s(1024,1024));
// 设置阴影偏移
sm->setBaseShadowMatrix(osg::Matrixf::translate(osg::Vec3d(0.5,0.5,0.5))*osg::Matrixf::scale(0.5,0.5,0.5));
// 设置阴影模糊
sm->setAmbientBias(osg::Vec2(0.5, 0.5));
sm->setFilter(osgShadow::ShadowMap::LINEAR);
sm->setBlurSize(5.0f);
详细的属性参见osgShadow.ShadowMap
类定义。
渲染阴影
最后,需要将阴影映射器添加到场景图中,并使用osgViewer
对象渲染场景:
// 添加阴影映射器到场景图中
root->addChild(sm->getOrCreateStateSet());
root->addChild(shadowedScene.get());
// 渲染场景
osgViewer::Viewer viewer;
viewer.setSceneData(root.get());
viewer.run();
要使用阴影映射器,需要开启OpenGL的深度测试(GL_DEPTH_TEST
)和深度缓冲(GL_DEPTH_BUFFER_BIT
)。
多阴影映射器(multiple-shadow-mapping)的使用可以提高阴影的质量和效率,但是会增加编程难度,需要自己处理阴影映射之间的相互作用。