2016-05-20 2 views
1

J'essaie de rendre une scène OSG dans une image de mon programme Qt. Reportez-vous à l'exemple de SnapImageDrawCallback (https://www.mail-archive.com/[email protected]/msg45360.html).OSG rend la scène dans l'image

class SnapImageDrawCallback : public osg::CameraNode::DrawCallback { 
public: 
     SnapImageDrawCallback() 
     { 
       _snapImageOnNextFrame = false; 
     } 

     void setFileName(const std::string& filename) { _filename = filename; } 
     const std::string& getFileName() const { return _filename; } 

     void setSnapImageOnNextFrame(bool flag) { _snapImageOnNextFrame = flag;} 
     bool getSnapImageOnNextFrame() const { return _snapImageOnNextFrame; } 

     virtual void operator() (const osg::CameraNode& camera) const 
     { 
       if (!_snapImageOnNextFrame) return; 

       int x,y,width,height; 
       x = camera.getViewport()->x(); 
       y = camera.getViewport()->y(); 
       width = camera.getViewport()->width(); 
       height = camera.getViewport()->height(); 

       osg::ref_ptr<osg::Image> image = new osg::Image; 
       image->readPixels(x,y,width,height,GL_RGB,GL_UNSIGNED_BYTE); 

       if (osgDB::writeImageFile(*image,_filename)) 
       { 
         std::cout << "Saved screen image to `"<<_filename 
         <<"`"<< std::endl; 
       } 

       _snapImageOnNextFrame = false; 
     } 

protected: 

     std::string _filename; 
     mutable bool  _snapImageOnNextFrame; 


}; 

-je ceci comme le osg :: FinalDrawCallback de l'appareil photo de Viewer, mais j'échoué avec une image vierge et obtenir cet avertissement « Attention: au début de l'état détecté une erreur OpenGL « opération non valide » :: appliquer () "lorsque invoke image-> readPixels, mon osgViewer :: Viewer est incorporé dans QQuickFramebufferObject. Quelqu'un peut-il donner quelques suggestions?

Répondre

2

Vous n'êtes pas sûr de vous donner le bon pointeur, vous devez fournir plus de détails sur votre configuration et ce que vous recherchez. En règle générale, si vous essayez de rendre avec OSG dans un widget QtQuick, la meilleure approche est d'avoir osg à rendre à un FBO dans un contexte GL partagé séparé, et de copier le contenu FBO du widget qtquick . Je l'avais testé cette approche il y a quelques temps, voir le code ici: https://github.com/rickyviking/qmlosg

Un autre projet similaire ici: https://github.com/podsvirov/osgqtquick