查看: 3167|回复: 4

关于osg::readImageFile()读取图片的问题

[复制链接]

该用户从未签到

发表于 2012-8-23 13:42:53 | 显示全部楼层 |阅读模式
各位大虾:
我弄了一个QVector<osg::Image*> mImage来存取多个从osg::readImageFile()读取的图片,以期在一个模型中随时间变换贴不同的图片。但是当我在另一个函数中调用mImage容器中的图片时却发现,模型只能贴一遍vector中的图。也就是这样说,当我读两个图片放如到mImage容器中时,先将一个图片at(0)贴在模型上,过了一秒,利用setImage(mImage.at(1))将图片1再贴到模型上,这些都是可以的,但是当再过一秒后,又要将at(0)图片贴到模型上时却出现了问题,程序异常终止,请问这是什么原因呢?

我开始以为:osg::readImageFile()放到一个函数中,当函数的作用域到了的时候osg::readImageFile()返回的指针指向的内存被释放掉了,但是这样的话第一次贴图mImage.at(1)就应该不正确才是。

请问各位大侠我是哪里出错误了呢?

该用户从未签到

发表于 2012-8-23 13:51:00 | 显示全部楼层
1.Dynamic
2.Dirty

该用户从未签到

 楼主| 发表于 2012-8-23 14:02:17 | 显示全部楼层
liuzhiyu123 发表于 2012-8-23 13:51
1.Dynamic
2.Dirty

好的,我现在就试试。

该用户从未签到

 楼主| 发表于 2012-8-23 14:19:21 | 显示全部楼层
liuzhiyu123 发表于 2012-8-23 13:51
1.Dynamic
2.Dirty

貌似不行,我的代码是这样的。在osgviewerQT头文件中:
    QString mStringModel;
    QStringList mStringTextures;
    QTimer mTimeChangeTexture;
    osg::Group* mRoot;
    //osg::Image* mImage;////反复读nodefile,开销大
    QVector<osg::Image*> mImage;
    osg::Node *mNode;
    osg::Texture2D *mTexture2D;
    osg::StateSet *mStateset;
    int mCountTextures;//用于计数,指示设置的是第几个纹理

构造函数中代码:
mRoot=new osg::Group();

    mTexture2D=new osg::Texture2D();
    mTexture2D->setFilter(osg::Texture::MIN_FILTER,osg::Texture::NEAREST);
    mTexture2D->setFilter(osg::Texture::MAG_FILTER,osg::Texture::NEAREST);
    mTexture2D->setWrap(osg::Texture::WRAP_S,osg::Texture::CLAMP_TO_EDGE);
    mTexture2D->setWrap(osg::Texture::WRAP_T,osg::Texture::CLAMP_TO_EDGE);
    mTexture2D->setDataVariance(osg::Object:YNAMIC);

    //mImage=new osg::Image;
    mStateset=new osg::StateSet();
    mNode=new osg::Node();
    mCountTextures=0;
    connect(&mTimeChangeTexture,SIGNAL(timeout()),this,SLOT(ResetTexture()));

首先装载一个模型:
mStringModel = QFileDialog::getOpenFileName(this, tr("Load Scene Model File"), "",  tr("ive(*.ive);;Allfile(*.*);"));
    if(mStringModel!=NULL)
    {

       mNode = osgDB::readNodeFile(mStringModel.toStdString ());
       mRoot->addChild(mNode);
       setSceneData(mNode);
    }
然后读入要加的贴图:
mStringTextures = QFileDialog::getOpenFileNames(this, tr("Load Scene Texture File"), "",  tr("Images (*.png *.xpm *.jpg *.bmp)"));
    if(mStringTextures.size()>0&&mNode!=NULL)
    {
      /*////反复读nodefile,开销大
        mImage=osgDB::readImageFile(mStringTextures.at(0).toStdString());
        mTexture2D->setImage(mImage);
        mStateset->setTextureAttributeAndModes(0, mTexture2D, osg::StateAttribute::ON);

        mNode->setStateSet(mStateset);
      */

      for(int i=0;i<mStringTextures.size();i++)
      {
          osg::Image *img=new osg::Image;
          img=osgDB::readImageFile(mStringTextures.at(i).toStdString());
          mImage.push_back(img);
      }
      mTexture2D->setImage(mImage.at(0));
      mStateset->setTextureAttributeAndModes(0, mTexture2D, osg::StateAttribute::ON);

      mNode->setStateSet(mStateset);

    }
    if(mStringTextures.size()>1)
    {
        mCountTextures++;
        mTimeChangeTexture.start(1000);
    }
定时器操作,每一秒调用函数重新贴图:
/*//反复读nodefile,开销大
    if(mStringTextures.size()<=0)
        QMessageBox::information(NULL,"ERROR",QString::fromLocal8Bit("No texture is available, please choose at least on testure"));
    else
    {
        mCountTextures=mCountTextures%mStringTextures.size();

        //mTexture2D->

        mImage=osgDB::readImageFile(mStringTextures.at(mCountTextures).toStdString());

        mTexture2D->setImage(mImage);

        mCountTextures++;
    }
    */

    if(mStringTextures.size()<=0)
        QMessageBox::information(NULL,"ERROR",QString::fromLocal8Bit("No texture is available, please choose at least on testure"));
    else
    {
        mCountTextures=mCountTextures%mStringTextures.size();
        mImage.at(mCountTextures)->dirty();

        mTexture2D->setImage(mImage.at(mCountTextures));
        mCountTextures++;
    }

该用户从未签到

发表于 2012-8-28 10:42:19 | 显示全部楼层
Qt的定时器是否是一个独立的线程,这个我不是特别清楚。如果是的话,那么这个操作完全不是线程安全的,保险的做法是在更新回调中设置新图像给setImage(),计时也可以在回调中,或者在定时器中加锁并传递一个指令到更新回调中解析
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表