OSG将场景渲染为图像

时间:2016-05-20 05:34:57

标签: opengl qtquick2 openscenegraph openglcontext qtopengl

我尝试在我的Qt程序中将OSG场景渲染成图像。请参阅SnapImageDrawCallback(https://www.mail-archive.com/osg-users@lists.openscenegraph.org/msg45360.html)的示例。

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,但是我失败了一张空白图片,并在调用时收到此警告“警告:检测到OpenGL错误'无效操作'在State :: apply()的开头” image-&gt; readPixels,我的osgViewer :: Viewer嵌入在QQuickFramebufferObject中。任何人都可以提出一些建议吗?

1 个答案:

答案 0 :(得分:2)

不确定为您提供正确的指针,您应该提供有关您的设置以及您所追求的内容的更多详细信息。

作为一般说明,如果您尝试使用OSG渲染到QtQuick小部件中,最好的方法是让osg在单独的共享GL上下文中呈现给FBO,并将FBO内容复制回qtquick小部件。 我前几次测试过这种方法,请看这里的代码: https://github.com/rickyviking/qmlosg

此处的另一个类似项目:https://github.com/podsvirov/osgqtquick