OSG визуализирует сцену в изображение

Я пытаюсь преобразовать сцену OSG в изображение в своей программе Qt. Обратитесь к примеру SnapImageDrawCallback(https://www.mail-archive.com/[email protected]/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;


};

Я установил это как FinalDrawCallback камеры osg::Viewer, но у меня не получилось с пустым изображением, и я получил это предупреждение «Предупреждение: обнаружена ошибка OpenGL« недопустимая операция »в начале State::apply()» при вызове изображения-> readPixels, My osgViewer::Viewer встроен в QQuickFramebufferObject. Может ли кто-нибудь дать несколько предложений?


person Shengwei Zhang    schedule 20.05.2016    source источник


Ответы (1)


Не уверен, что даст вам правильный указатель, вы должны предоставить более подробную информацию о своей настройке и о том, что вам нужно.

В качестве общего замечания, если вы пытаетесь выполнить рендеринг с OSG в виджет QtQuick, лучшим подходом является использование osg для рендеринга в FBO в отдельном общем контексте GL и копирование содержимого FBO обратно в виджет qtquick. Я тестировал этот подход несколько раз назад, см. код здесь: https://github.com/rickyviking/qmlosg

Еще один похожий проект здесь: https://github.com/podsvirov/osgqtquick

person rickyviking    schedule 20.05.2016