osgShadow.ProjectionShadowMap
是OpenSceneGraph中的一个阴影技术,用于创建投影阴影映射。它是基于光源的渲染,具有高质量和良好的性能。该技术可以应用于复杂的场景和动态对象,并支持多个光源。
osgShadow.ProjectionShadowMap
使用两个相机来实现:一个光源相机和一个观察相机。光源相机被放置在光源位置上,观察相机是观察场景的相机。
为了创建投影纹理,光源相机需要渲染相应的深度纹理,深度纹理包含了从光源位置视角看到的场景深度,即每个像素点与光源之间的距离。
观察相机渲染场景时,需要使用深度纹理进行投影。这在顶点着色器中完成,顶点的坐标与光源相机的透视投影矩阵相乘,得到阴影贴图的纹理坐标。
为了避免阴影贴图出现锯齿,需要进行PCF(Percentage Closer Filtering)过滤。这是一种多次采样纹理的技术,可以平滑地插值出纹理颜色。
osgShadow.ProjectionShadowMap
的使用方法如下:
// 创建阴影节点
osg::Group* shadowedGroup = new osg::Group();
osgShadow::ShadowedScene* shadowedScene = new osgShadow::ShadowedScene();
shadowedScene->setShadowTechnique(new osgShadow::ProjectionShadowMap());
// 设置光源
osg::Light* light = new osg::Light();
light->setPosition(osg::Vec4(0, 0, 1, 0));
light->setDirection(osg::Vec3(0, 0, -1));
osg::LightSource* lightSource = new osg::LightSource();
lightSource->setLight(light);
shadowedScene->addChild(lightSource);
// 添加场景节点
osg::Node* sceneNode = new osg::Node();
shadowedScene->addChild(shadowedGroup);
shadowedGroup->addChild(sceneNode);
osgShadow.ProjectionShadowMap
具有许多可配置的参数,包括阴影贴图分辨率、深度纹理滤波器等。这些参数可以在创建osgShadow::ProjectionShadowMap
对象时进行设置,例如:
osgShadow::ProjectionShadowMap* shadowTechnique = new osgShadow::ProjectionShadowMap();
shadowTechnique->setTextureSize(osg::Vec2s(1024, 1024));
shadowTechnique->setBaseTextureUnit(2);
shadowTechnique->setAmbientBias(osg::Vec4(0.1, 0.1, 0.1, 1.0));
使用osgShadow.ProjectionShadowMap
时需要注意以下几点:
osgShadow::ShadowedScene
,而不是普通的osg::Group
。osg::Light::setDirection
设置,否则阴影可能无法正确显示。setLightNum
方法可以为每个光源分配不同的阴影贴图单元。阴影贴图单元可以在着色器中使用,例如gl_TextureMatrix[1]
表示第二个阴影贴图的纹理矩阵。osgShadow.ProjectionShadowMap
适用于透视投影相机,不适用于正交投影相机。