我尝试在我的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中。任何人都可以提出一些建议吗?
答案 0 :(得分:2)
不确定为您提供正确的指针,您应该提供有关您的设置以及您所追求的内容的更多详细信息。
作为一般说明,如果您尝试使用OSG渲染到QtQuick小部件中,最好的方法是让osg在单独的共享GL上下文中呈现给FBO,并将FBO内容复制回qtquick小部件。 我前几次测试过这种方法,请看这里的代码: https://github.com/rickyviking/qmlosg
此处的另一个类似项目:https://github.com/podsvirov/osgqtquick