查看: 1808|回复: 7

合并同名Image的texture2D遇到晦涩的问题,请高手指点:谢谢

[复制链接]

该用户从未签到

发表于 2009-8-4 21:49:46 | 显示全部楼层 |阅读模式
本帖最后由 woshijiameizhou 于 2009-8-4 21:54 编辑

想实现的思想如下:
1.通过一个  visitor 遍历所有stateset,获得所有的Texture2D,保存在一个vector<Texture*> texList里面。

2.先声明一个map:  std::map<std::string ,osg::ref_ptr<osg::Texture>> TextureMap
对保存所有texture的texList循环遍历,判断texList 的image的文件名,

     如果TextureMap中没有这个键,则TextureMap 中 insert 这个键和相应的值texList;   

      如果TextureMap有这个键,则通过这个键find到对应的值:比如valueTex,且 texList->getparent(i) 遍历他所有的stateset 父亲 ss;
      接着,有:
      for(unsigned int j=0;j< ss->getTextureAttributeList().size();++j) {
            osg::Texture* tt = dynamic_cast<osg::Texture*>(ss->getTextureAttribute(j,osg::StateAttribute::TEXTURE));
            if(tt == texList)
                 ss->setTextureAttribute(j, valueTex.get());
}



不知道我说清楚没有,在具体一下:比如一个场景有300个texture* ,但是所用贴图文件只有10张jpg文件,则texture*冗余,假如每个texture*对应一个stateset,那么可以将image为同一张jpg的texture* 用一个texture_1*置换掉。则场景中最后只有10个texture_1*。

最后的问题:我用开始的那个思想处理了所有texture,在重新指认的时候,会随机的出现内存错误,会有image或者texture的野指针出现,而注释了这句:ss->setTextureAttribute(j, valueTex.get());  即不重新指认,空跑一遍,则不会出错,恳请高人指点问题出在哪里,需要如何处理,谢谢!

该用户从未签到

发表于 2009-8-5 09:54:27 | 显示全部楼层
可以考虑保存10个image,然后设置给300个texture。texture其实并不太占资源,只是一个GL的设置而已。

该用户从未签到

 楼主| 发表于 2009-8-5 10:40:47 | 显示全部楼层
2# liangzheng2k
谢谢你的回答。我的问题是重新指认的时候会出错,一个内存错误,有随机出现的野指针。再有,
图一和图二 所示的两种数据结构在场景中 所占的资源是一样的吗?保存场景到一个ive文件,ive文件的大小也是一样的吗?应该不一样吧。
image.JPG

该用户从未签到

发表于 2009-8-5 11:10:58 | 显示全部楼层
本帖最后由 liangzheng2k 于 2009-8-5 11:14 编辑

1、看你的描述没有十分了解你的意图。vector<Texture*> texList中使用Texture*是不安全的,最好使用osg::ref_ptr。另外,如果是在仿真循环中动态加载,应该设置setDataVariance(osg::Object:YNAMIC)
2、osgDB::readImageFile会产生内存占用,来保存图像内容,如果image1~6都是通过readImageFile来生成的,那么上面的图会比下面的资源占用多很多。至于导出IVE文件,我没有试过,我判断应该不一样,毕竟图1多了很多texture和image的定义,但是image的读入还是运行期进行的,所以图像的资源占用不会体现在ive中。

该用户从未签到

发表于 2009-8-5 13:33:46 | 显示全部楼层
你重新指定后并没有释放,,共享TEXTURE2D对象就可以了~~~~最好使用智能指针处理~

该用户从未签到

 楼主| 发表于 2009-8-6 10:11:52 | 显示全部楼层
本帖最后由 woshijiameizhou 于 2009-8-6 10:13 编辑

5# FlySky
请问 FlySky,我应该释放什么,释放这个textureList吗? 我还是没有搞定啊,请明示,谢谢!

该用户从未签到

发表于 2009-8-6 13:52:24 | 显示全部楼层
释放和更新TEXTURE2D对象,,这个才是解决问题的关键~~~~

该用户从未签到

 楼主| 发表于 2009-8-6 20:03:15 | 显示全部楼层
7# FlySky
嗯,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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