[osg-users] 回复: Is it possible to load texture without applying to adrawable

Garfield Pig yuqicxy at foxmail.com
Thu May 9 09:35:50 PDT 2019

Hi Steve,
I meet the similar question yesterday,how about use osg::texture::apply method with a new state under a new GraphicContext.

this is the source of my idea.

In osg3.6.3 osgConv application.
osgConv.cpp line 152

void 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;

        osg::ref_ptr<osg::State> state = new osg::State;

        for(TextureSet::iterator itr=_textureSet.begin();
            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))

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

                // get OpenGL driver to create texture from image.

                // restore the original setting



Thank you!

Qi Yu

------------------ 原始邮件 ------------------
发件人: "Steve Powers"<stevenapowers at gmail.com>;
发送时间: 2019年5月9日(星期四) 晚上11:33
收件人: "osg-users"<osg-users at lists.openscenegraph.org>;

主题: [osg-users] Is it possible to load texture without applying to adrawable

I am attempting to load a Texture2D into memory in order to pass the texture ID to a 3rd party OpenGL object that will use the ID within it's own drawable class.

The issue is that the TextureObject attached to the texture is not getting instantiated and I think this is because it is not assigned to a drawable object and thus not getting visited.

Instead, I set the texture to a stateset on an osg::Group node 

stateset = group->getOrCreateStateSet();
stateset->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);

Is there a way to have this texture object instantiate without physically using the texture on a drawable?

Thank you!

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20190510/70b65c2a/attachment.html>

More information about the osg-users mailing list