2016-05-20 8 views
1

QtプログラムでOSGシーンをイメージにレンダリングしようとしています。 SnapImageDrawCallback(https://www.mail-archive.com/[email protected]/msg45360.html)の例を参照してください。 (状態の開始時に、OpenGLのエラー 『無効な操作』を検出した::適用されます。OSGシーンをイメージに変換

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; 


}; 

私はOSG :: ViewerのカメラのFinalDrawCallbackとしてこれを設定するが、私は警告が」白紙画像で失敗しましたし、この警告を取得します) "を呼び出すと、image-> readPixels、My osgViewer :: ViewerがQQuickFramebufferObjectに埋め込まれます。誰にでも何か示唆を与えることはできますか?

答えて

2

あなたに正しいポインタを渡すことができない場合は、セットアップの詳細と後の内容を提供する必要があります。

一般的な注意として、OSGをQtQuickウィジェットにレンダリングしようとする場合、別の共有GLコンテキストでFBOにレンダリングし、FBOの内容をqtquickウィジェットにコピーするosgを持つことをお勧めします。 https://github.com/rickyviking/qmlosg

別の同様のプロジェクトをここに:https://github.com/podsvirov/osgqtquick

私はここのコードを参照、いくつかの時間前にこのアプローチをテストしていました
関連する問題