osgFX.BumpMapping是OpenSceneGraph中的一个插件,可以实现凹凸贴图的效果。该插件利用法线贴图来使表面看起来更具有立体感。
使用osgDB::readNodeFile
从文件中读取场景,然后将其添加到场景图中。使用下列代码添加BumpMapping效果:
osg::ref_ptr<osgFX::BumpMapping> bumpMapping = new osgFX::BumpMapping;
sceneGraph->addChild(bumpMapping.get());
在osgFX.BumpMapping中,可以设置以下参数:
bumpTexture:法线贴图的纹理。初始值为NULL。
scale:放大法线的比例。初始值为1.0。
bias:进行bump mapping时将加上的偏移值。初始值为0.1。
light:光源。初始值为NULL。
lightMultiplier:能量多项式。初始值为1.0。
technique:使用的着色技术。初始值为Phong。
backfaceCulling:是否取消背面面剔除。值为false时,不进行背面面剔除。初始值为true。
osg::ref_ptr<osgFX::BumpMapping> bumpMapping = new osgFX::BumpMapping;
osg::ref_ptr<osg::Texture2D> bumpTexture = new osg::Texture2D;
bumpTexture->setImage(osgDB::readImageFile("bump.jpg"));
bumpMapping->setBumpTexture(bumpTexture.get());
bumpMapping->setScale(2.0f);
osg::ref_ptr<osg::StateSet> stateSet = bumpMapping->getOrCreateStateSet();
stateSet->setMode(GL_LIGHTING, osg::StateAttribute::ON);
osg::ref_ptr<osg::Light> light = new osg::Light;
//设置光源信息
bumpMapping->setLight(light.get());
bumpMapping->setLightMultiplier(1.5f);
sceneGraph->addChild(bumpMapping.get());
osgFX.BumpMapping支持以下的着色技术:
Lambert:使用Lambert着色模型。它是一种比较基础的着色技术,用于实现一个物体的基础明暗效果。
Phong:使用Phong模型着色技术。 它对于实现高亮区域比较有效,而且它适用于多点光源的情况。
Blinn:使用Blinn-Phong模型进行着色。比Phong模型更合适处理间接光照问题,因为它可以更好的处理光照的散射等问题。