查看: 1258|回复: 7

贴图丢失的问题

[复制链接]

该用户从未签到

发表于 2010-12-10 11:11:01 | 显示全部楼层 |阅读模式
我上次已经问过了,发现还是搞不清楚,请各位大哥帮忙看看,代码是这样的:

#include <osgViewer/Viewer>
#include <osg/Group>
#include <osg/Node>

#include <osgDB/ReadFile>
#include <osgDB/WriteFile>

#include <osgGA/GUIEventHandler>

#include <osgUtil/Optimizer>

class CWriteHandler : public osgGA::GUIEventHandler
{
public:
        CWriteHandler(osg::ref_ptr<osg::Group> root): m_root(root)
        {

        }
        ~CWriteHandler()
        {

        }

        bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
        {
                osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*> (&aa);
                if( !viewer )
                        return false;

                switch(ea.getEventType())
                {
                case(osgGA::GUIEventAdapter::KEYDOWN) :
                        {
                                if (ea.getKey() == 'z' || ea.getKey() == 'Z')
                                {
                                        osgDB::writeNodeFile(*(m_root.get()), "root.ive");
                                        return false;
                                }
                        }
                        return false;
                }
                return false;
        }

private:
        osg::ref_ptr<osg::Group> m_root;
};

void main()
{
        setlocale( LC_ALL, "chs" );


        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
        osg::ref_ptr<osg::Group> root = new osg::Group;

        osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
        root->addChild(node.get());


        osgUtil::Optimizer optimizer;
        optimizer.optimize(root.get());

        viewer->setSceneData(root.get());
        viewer->addEventHandler(new CWriteHandler(root.get()));
        viewer->realize();
        viewer->run();
}

写出来的 root.ive没有贴图了,注释掉osgUtil::Optimizer就正确了,我现在是想问下不注释掉osgUtil::Optimizer,让写出来的root.ive正确显示要怎么改?

该用户从未签到

发表于 2010-12-10 11:25:10 | 显示全部楼层
osgUtil::Optimizer优化的时候,纹理应用后内存给释放掉了吧~~~
加下面语句试试:
osg::Texture::setUnRefImageDataAfterApply(false);

该用户从未签到

 楼主| 发表于 2010-12-10 12:20:50 | 显示全部楼层
还是不对啊,我通过

  1. //创建纹理访问器
  2. CTextureVisitor textureTV;
  3. //启动访问器,执行遍历
  4. node->accept( textureTV );
复制代码
设置了

  1. tex2D->setUnRefImageDataAfterApply(false);
复制代码
结果贴图还是没有写出

该用户从未签到

发表于 2010-12-10 12:58:00 | 显示全部楼层
用optimize(osg::Node* node, unsigned int options)取代optimize(osg::Node* node),在options里面不要有OPTIMIZE_TEXTURE_SETTINGS,应该就可以了吧?

该用户从未签到

 楼主| 发表于 2010-12-10 13:17:28 | 显示全部楼层
在options里面不要有OPTIMIZE_TEXTURE_SETTINGS

意思是去掉源代码中的
  1.     if (options & OPTIMIZE_TEXTURE_SETTINGS)
  2.     {
  3.         osg::notify(osg::INFO)<<"Optimizer::optimize() doing OPTIMIZE_TEXTURE_SETTINGS"<<std::endl;

  4.         TextureVisitor tv(true,true, // unref image
  5.                           false,false, // client storage
  6.                           false,1.0, // anisotropic filtering
  7.                           this );
  8.         node->accept(tv);
  9.     }
复制代码
,是这样的吗,这个要怎么设置?

该用户从未签到

发表于 2010-12-10 14:15:16 | 显示全部楼层
我没试过,但大概是这样吧我觉得:
  1. optimizer.optimize(main_scene.get(),osgUtil::Optimizer::FLATTEN_STATIC_TRANSFORMS |
  2.                                 osgUtil::Optimizer::REMOVE_REDUNDANT_NODES |
  3.                                 osgUtil::Optimizer::REMOVE_LOADED_PROXY_NODES |
  4.                                 osgUtil::Optimizer::COMBINE_ADJACENT_LODS |
  5.                                 osgUtil::Optimizer::SHARE_DUPLICATE_STATE |
  6.                                 osgUtil::Optimizer::MERGE_GEOMETRY |
  7.                                                                 osgUtil::Optimizer::CHECK_GEOMETRY |
  8.                                 osgUtil::Optimizer::STATIC_OBJECT_DETECTION);
  9.        
复制代码

该用户从未签到

 楼主| 发表于 2010-12-10 16:24:59 | 显示全部楼层
谢谢,这样可以了

该用户从未签到

发表于 2010-12-13 10:34:45 | 显示全部楼层
真没仔细看过这个optimizer
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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