[osg-users] writeNode after readNode makes the osgb model much bigger size

tangrijing tangrijing at qq.com
Thu Jan 11 22:57:41 PST 2018


Hi,

I read 123.osgb file to a node, and then write it to 456.osgb ,however,the 456.osgb has a 10 times bigger size than 123.osgb. My code is here:

osg::ref_ptr<osg::Node> node = osgDB::readRefNodeFile(123.osgb);

osg::ref_ptr<osgDB::ReaderWriter::Options> options = new osgDB::ReaderWriter::Options;
options->setOptionString("WriteImageHint=IncludeData");

osgDB::ReaderWriter::WriteResult result = osgDB::Registry::instance()->writeNode(*node, “456.osgb”,options);


I than use a  texure compress method cited from osgconv.cpp, the result is still 2 times bigger size than the original file.


void MyNodeVisitor::compress()
{
        MyGraphicsContext context;
        if (!context.valid())
        {
                osg::notify(osg::NOTICE) << "Error: Unable to create graphis context, problem with running osgViewer-" << osgViewerGetVersion() << ", cannot run compression." << std::endl;
                return;
        }

        osg::ref_ptr<osg::State> state = new osg::State;
        state->initializeExtensionProcs();

        for (TextureSet::iterator itr = _textureSet.begin();
                itr != _textureSet.end();
                ++itr)
        {
                osg::Texture* texture = const_cast<osg::Texture*>(itr->get());

                osg::Texture2D* texture2D = dynamic_cast<osg::Texture2D*>(texture);
                osg::Texture3D* texture3D = dynamic_cast<osg::Texture3D*>(texture);

                osg::ref_ptr<osg::Image> image = texture2D ? texture2D->getImage() : (texture3D ? texture3D->getImage() : 0);
                if (image.valid() &&
                        (image->getPixelFormat() == GL_RGB || image->getPixelFormat() == GL_RGBA) &&
                        (image->s() >= 32 && image->t() >= 32))
                {
                        texture->setInternalFormatMode(_internalFormatMode);

                        // need to disable the unref after apply, otherwise the image could go out of scope.
                        bool unrefImageDataAfterApply = texture->getUnRefImageDataAfterApply();
                        texture->setUnRefImageDataAfterApply(false);

                        // get OpenGL driver to create texture from image.
                        texture->apply(*state);

                        // restore the original setting
                        texture->setUnRefImageDataAfterApply(unrefImageDataAfterApply);

                        image->readImageFromCurrentTexture(0, true);

                        texture->setInternalFormatMode(osg::Texture::USE_IMAGE_DATA_FORMAT);
                }
        }
}



my question is ,how can i make the 456.osgb has the same size with 123.osgb

Thank you!

Cheers,
tangrijing

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=72745#72745







More information about the osg-users mailing list