|
本帖最后由 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()); 即不重新指认,空跑一遍,则不会出错,恳请高人指点问题出在哪里,需要如何处理,谢谢! |
|