osgShadow.ViewDependentShadowTechnique是从视角角度计算阴影的一种阴影技术。
osgShadow.ViewDependentShadowTechnique使用了ShadowedScene的平面投影面光源数据,以及从观察位置得到的相机投影矩阵。 结合这些数据,osgShadow.ViewDependentShadowTechnique可以在正确的位置正确地显示阴影。
这种阴影技术的优点是它可以在视点移动时改变阴影。 但是,由于阴影与视角相关,因此在重新计算阴影时引入了更多的计算开销。
osgShadow.ViewDependentShadowTechnique支持以下参数:
ShadowCastingFaceHint
:指定在处理阴影时应考虑什么面。 默认值为FRONT
。 另一种值是BACK
,表示投影应用于背面而不是前面。
ComputeNearFarMode
:指定将近和远剪切平面如何用于更新视角依赖性阴影。 此参数可以是以下值之一:
DO_NOT_COMPUTE_NEAR_FAR
:不计算近和远剪切平面COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES
:使用场景中所有可见物体的边界框计算接近和远剪切平面。COMPUTE_NEAR_FAR_USING_PRIMITIVES
:使用场景中的所有可见物体的基元计算近和远剪切平面。ReceivesShadowTraversalMask
和CastsShadowTraversalMask
:指定应该被阴影遮挡的场景的遍历掩码以及投射阴影的场景的遍历掩码。
LightSpaceCullMask
:表示应用程序可以指定用于在阴影中获取非自发光物体的灯光的遮挡剪裁遍历掩码。
MaximumShadowMapDistance
:表示可见距离内不会在外部投影纹理细节级别中显示更多的细节。 此参数可以用于优化性能。
要使用osgShadow.ViewDependentShadowTechnique,请首先创建一个osgShadow::ConvexPolyhedron类的对象以描述阴影视锥体。 然后创建一个osgShadow::ShadowMap类的对象来生成投影纹理贴图,最后创建并配置osgShadow.ViewDependentShadowTechnique类的对象即可。
以下是使用osgShadow.ViewDependentShadowTechnique的示例代码:
osg::ref_ptr<osgShadow::ConvexPolyhedron> polyhedron = new osgShadow::ConvexPolyhedron;
// ... 为 ConvexPolyhedron 对象设置参数
osg::ref_ptr<osgShadow::ShadowMap> sm = new osgShadow::ShadowMap;
sm->setTextureSize( osg::Vec2s(2048,2048) );
// ... 为 ShadowMap 对象设置参数
osg::ref_ptr<osgShadow::ViewDependentShadowTechnique> vdst = new osgShadow::ViewDependentShadowTechnique;
vdst->setPolyhedron( polyhedron.get() );
vdst->setShadowMap( sm.get() );
// ... 为 ViewDependentShadowTechnique 对象设置参数
osg::ref_ptr<osgShadow::ShadowedScene> shadowedScene = new osgShadow::ShadowedScene;
shadowedScene->setShadowTechnique( vdst.get() );
// ... 为 ShadowedScene 对象设置参数
请参阅OpenSceneGraph文档以获取更多有关osgShadow.ViewDependentShadowTechnique的详细信息和使用示例。