Hi Panagiotis I attach a osgviewer based example of use of multisample
You can switch on/off multisample with the key 'm' Cheers David 2007/10/14, Panagiotis Papadakos <[EMAIL PROTECTED]>: > > Hi David > > On Tue, 9 Oct 2007, David Callu wrote: > > > Hi Panagiotis > > > > 2007/10/6, Panagiotis Papadakos <[EMAIL PROTECTED]>: > >> > >> Hi. > >> > >> I want to add an option of using multisampling for my app. So I have > setup > >> DisplaySettings with setNumMultiSamples(4). The user is able to > >> enable/disable multisampling as he feels in the app, by > enabling/disabling > >> > >> the GL_MULTISAMPLE_ARB in the root stateset. My problem now is that > >> initially I want to have multisampling disabled, which I can't figure > out > >> how to do. I have tried setting GL_MULTISAMPLE_ARB OFF in the root > >> stateset, but this doesn't seem to help. Any ideas? > > > > > > > This seem to be the good method. > > you can try > > > > 1) do root->getOrCreateStateSet()->setMode(GLL_MULTISAMPLE_ARB, > > osg::StateAttribut::OFF | osg::StateAttribut::OVERRIDE) > > This is what I've been trying. More specifically > root->getOrCreateStateSet()->setMode(GL_MULTISAMPLE_ARB, > osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED | > osg::StateAttribute::OVERRIDE); > > after the viewer has been realized. > > > 2) I think that number of sample is define when the OpenGL context is > > created > > so recreate a context on each switch of the number os sample you > want. > > > Why should I recreate a context? I think I should be able to > enable/disable Multisampling with setting the state mode ON/OFF. > > > How did you know that multisample is enabling/disabling. > > Did you look the render ? > Yep, that is the case. I saw the render. > > > Did you do a request to OpenGL about multisample ? > > > > > > David > > > > > > Thanks > >> Panagiotis Papadakos > >> _______________________________________________ > >> osg-users mailing list > >> osg-users@lists.openscenegraph.org > >> > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > >> > > >
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield * * This application is open source and may be redistributed and/or modified * freely and without restriction, both in commericial and non commericial applications, * as long as this copyright notice is maintained. * * This application is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #include <osgDB/ReadFile> #include <osgUtil/Optimizer> #include <osg/CoordinateSystemNode> #include <osg/Multisample> #include <osg/Switch> #include <osgText/Text> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgGA/TrackballManipulator> #include <osgGA/FlightManipulator> #include <osgGA/DriveManipulator> #include <osgGA/KeySwitchMatrixManipulator> #include <osgGA/StateSetManipulator> #include <osgGA/AnimationPathManipulator> #include <osgGA/TerrainManipulator> #include <iostream> class SwitchMultisampleHandler : public osgGA::GUIEventHandler { public: SwitchMultisampleHandler(osg::StateSet * ss) : _useMultisample(false), _ss(ss) { _ss->setAttributeAndModes(new osg::Multisample, osg::StateAttribute::ON); _ss->setMode(GL_MULTISAMPLE, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE); } bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &) { if (ea.getHandled()) return false; switch (ea.getEventType()) { case (osgGA::GUIEventAdapter::KEYUP): { if (ea.getKey() == 'm') { if (_useMultisample == false) { _ss->setMode(GL_MULTISAMPLE, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); _useMultisample = true; } else { _ss->setMode(GL_MULTISAMPLE, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE); _useMultisample = false; } return true; } break; } default: break; } return false; } private: bool _useMultisample; osg::ref_ptr<osg::StateSet> _ss; }; int main(int argc, char** argv) { // use an ArgumentParser object to manage the program arguments. osg::ArgumentParser arguments(&argc,argv); arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName()); arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the standard OpenSceneGraph example which loads and visualises 3d models."); arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ..."); arguments.getApplicationUsage()->addCommandLineOption("--image <filename>","Load an image and render it on a quad"); arguments.getApplicationUsage()->addCommandLineOption("--dem <filename>","Load an image/DEM and render it on a HeightField"); arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display command line parameters"); arguments.getApplicationUsage()->addCommandLineOption("--help-env","Display environmental variables available"); arguments.getApplicationUsage()->addCommandLineOption("--help-keys","Display keyboard & mouse bindings available"); arguments.getApplicationUsage()->addCommandLineOption("--help-all","Display all command line, env vars and keyboard & mouse bindings."); arguments.getApplicationUsage()->addCommandLineOption("--SingleThreaded","Select SingleThreaded threading model for viewer."); arguments.getApplicationUsage()->addCommandLineOption("--CullDrawThreadPerContext","Select CullDrawThreadPerContext threading model for viewer."); arguments.getApplicationUsage()->addCommandLineOption("--DrawThreadPerContext","Select DrawThreadPerContext threading model for viewer."); arguments.getApplicationUsage()->addCommandLineOption("--CullThreadPerCameraDrawThreadPerContext","Select CullThreadPerCameraDrawThreadPerContext threading model for viewer."); // if user request help write it out to cout. bool helpAll = arguments.read("--help-all"); unsigned int helpType = ((helpAll || arguments.read("-h") || arguments.read("--help"))? osg::ApplicationUsage::COMMAND_LINE_OPTION : 0 ) | ((helpAll || arguments.read("--help-env"))? osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE : 0 ) | ((helpAll || arguments.read("--help-keys"))? osg::ApplicationUsage::KEYBOARD_MOUSE_BINDING : 0 ); if (helpType) { arguments.getApplicationUsage()->write(std::cout, helpType); return 1; } osgViewer::Viewer viewer(arguments); // report any errors if they have occurred when parsing the program arguments. if (arguments.errors()) { arguments.writeErrorMessages(std::cout); return 1; } if (arguments.argc()<=1) { arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION); return 1; } // set up the camera manipulators. { osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator; keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() ); keyswitchManipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() ); keyswitchManipulator->addMatrixManipulator( '3', "Drive", new osgGA::DriveManipulator() ); keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new osgGA::TerrainManipulator() ); std::string pathfile; char keyForAnimationPath = '5'; while (arguments.read("-p",pathfile)) { osgGA::AnimationPathManipulator* apm = new osgGA::AnimationPathManipulator(pathfile); if (apm || !apm->valid()) { unsigned int num = keyswitchManipulator->getNumMatrixManipulators(); keyswitchManipulator->addMatrixManipulator( keyForAnimationPath, "Path", apm ); keyswitchManipulator->selectMatrixManipulator(num); ++keyForAnimationPath; } } viewer.setCameraManipulator( keyswitchManipulator.get() ); } // add the state manipulator viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) ); // add the state manipulator viewer.addEventHandler( new SwitchMultisampleHandler(viewer.getCamera()->getOrCreateStateSet()) ); // add the thread model handler viewer.addEventHandler(new osgViewer::ThreadingHandler); // add the window size toggle handler viewer.addEventHandler(new osgViewer::WindowSizeHandler); // add the stats handler viewer.addEventHandler(new osgViewer::StatsHandler); // add the help handler viewer.addEventHandler(new osgViewer::HelpHandler(arguments.getApplicationUsage())); // add the record camera path handler viewer.addEventHandler(new osgViewer::RecordCameraPathHandler); // load the data osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments); if (!loadedModel) { std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl; return 1; } // any option left unread are converted into errors to write out later. arguments.reportRemainingOptionsAsUnrecognized(); // report any errors if they have occurred when parsing the program arguments. if (arguments.errors()) { arguments.writeErrorMessages(std::cout); return 1; } // optimize the scene graph, remove redundant nodes and state etc. osgUtil::Optimizer optimizer; optimizer.optimize(loadedModel.get()); viewer.setSceneData( loadedModel.get() ); viewer.realize(); viewer.run(); }
_______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org