osg具有雾效果,也是非常简单可以实现的。先看一下效果:
设置回调函数:
#pragma once
#include <osg/StateSet>
class FogCallBack : public osg::StateSet::Callback {
public:
FogCallBack();
~FogCallBack();
virtual void operator() (osg::StateSet* ss, osg::NodeVisitor*nv)override;
};
#include "FogCallBack.h"
#include <osg/Fog>
#include <osg/StateAttribute>
FogCallBack::FogCallBack() {
}
FogCallBack::~FogCallBack() {
}
void FogCallBack::operator() (osg::StateSet* ss, osg::NodeVisitor*nv) {
osg::Fog* fog = dynamic_cast<osg::Fog*>(ss->getAttribute(osg::StateAttribute::FOG));
if (fog){
float start = fog->getStart();
if (start<fog->getEnd()){
fog->setStart(start + 2.0);
}
}
}
void createFog() {
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::Node> cowNode = osgDB::readNodeFile("lz.osgt");
root->addChild(cowNode);
osg::ref_ptr<osg::Fog> fog = new osg::Fog;
fog->setColor(osg::Vec4(1.0, 1.0, 1.0, 0.5));//设置颜色
fog->setStart(1.0);//设置雾效的近距离
fog->setEnd(2000.0);//设置雾效的远距离
fog->setDensity(10.0);//设置雾效的密度
fog->setMode(osg::Fog::LINEAR);//设置雾效的类型-线型
root->getOrCreateStateSet()->setUpdateCallback(new FogCallBack);
root->getOrCreateStateSet()->setAttributeAndModes(fog.get(), osg::StateAttribute::ON| osg::StateAttribute::OVERRIDE);
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
viewer->addEventHandler(new osgViewer::WindowSizeHandler());
viewer->addEventHandler(new osgViewer::StatsHandler());
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
}
aaa