[osg-users] Transparency on a drawable

dimi christop dimi_christop at yahoo.com
Tue Jul 15 03:11:39 PDT 2008


This is because when you set alpha to the vertices and attach also an material 
and a blending function you have to setColorMode (AMBIENT_DIFFUSE) on the material.

Dimi



----- Original Message ----
From: Vincent Bourdier <vincent.bourdier at gmail.com>
To: OpenSceneGraph Users <osg-users at lists.openscenegraph.org>
Sent: Tuesday, July 15, 2008 11:09:23 AM
Subject: Re: [osg-users] Transparency on a drawable



Hi Paul.

Nothing changes with color's alpha changed...



2008/7/15 Paul Speed <pspeed at progeeks.com>:



Vincent Bourdier wrote:

Hi

Yes, no solutions seems to work on my problem.
Because all the propositions concern nodes, I permit to remember that I am looking at a way to set alpha level on a osg::Geometry ...

On node I already have a method using material : set alpha channel, and it works good...  But on my geometry nothing look to work good...

This is all my geometry creator code :

   osg::ref_ptr<osg::Geometry> builtGeometry(){

       double alpha = 0.1;
       osg::Vec4 grey(0.4,0.4,0.4,1.0);
       osg::Vec4 yellow(1.0,1.0,0.0,1.0);


What happens if you put alpha for the fourth value in your color?
-Paul



       osg::Geometry* g = new osg::Geometry;
       osg::Vec3Array* vertices    = new osg::Vec3Array();
       osg::Vec3Array* normals        = new osg::Vec3Array();
       osg::Vec4Array* colors        = new osg::Vec4Array();

       normals->push_back(osg::Vec3(0,0,1));
       colors->push_back(grey);

       //----
       //QUAD
       vertices->push_back(osg::Vec3( _width/2.0, _height + _dist,
   _offset));
       vertices->push_back(osg::Vec3(-_width/2.0, _height + _dist,
   _offset));
       vertices->push_back(osg::Vec3(-_width/2.0, 0.0       + _dist,
   _offset));
       vertices->push_back(osg::Vec3( _width/2.0, 0.0       + _dist,
   _offset));

       if(!_empty)
           g->addPrimitiveSet(new
   osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4));
       else
           g->addPrimitiveSet(new
   osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP,0,4));


       //-----
       //LINE

       vertices->push_back(osg::Vec3(0.0, 1.0, _offset));
       vertices->push_back(osg::Vec3(0.0, _dist, _offset));
       colors->push_back(grey);
       g->addPrimitiveSet(new
   osg::DrawArrays(osg::PrimitiveSet::LINES,4,2));


       //----
       //LINE_LOOP

       vertices->push_back(osg::Vec3( _width/2.0, _height + _dist,
   _offset/2.0));
       vertices->push_back(osg::Vec3(-_width/2.0, _height + _dist,
   _offset/2.0));
       vertices->push_back(osg::Vec3(-_width/2.0, 0.0       + _dist,
   _offset/2.0));
       vertices->push_back(osg::Vec3( _width/2.0, 0.0       + _dist,
   _offset/2.0));

       colors->push_back(yellow);
       g->addPrimitiveSet(new
   osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP,6,4));

       g->setNormalArray(normals);
       g->setVertexArray(vertices);
       g->setColorArray(colors);

       g->setNormalBinding(osg::Geometry::BIND_OVERALL);
       g->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET);
       g->setDataVariance(osg::Object::DYNAMIC);


   //TRANSPARENCY

       osg::StateSet* state = g->getOrCreateStateSet();
          state->setMode(GL_BLEND,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
       osg::Material* mat = new osg::Material;           mat->setAlpha(osg::Material::FRONT_AND_BACK, alpha);
       state->setAttributeAndModes(mat,osg::StateAttribute::ON |
   osg::StateAttribute::OVERRIDE);

       osg::BlendFunc* bf = new
   osg::BlendFunc(osg::BlendFunc::SRC_ALPHA,
   osg::BlendFunc::ONE_MINUS_SRC_ALPHA );
       state->setAttributeAndModes(bf);

       state->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
       state->setMode(GL_LIGHTING, osg::StateAttribute::OFF);

       g->setStateSet(state);

       return g;
   }


Thanks for your help.

Regards,

Vincent.


2008/7/15 dimi christop <dimi_christop at yahoo.com <mailto:dimi_christop at yahoo.com>>:


   Hi Vincent,
   I see you still havent found a solution. So here I send you a
   complete example of transpareny.
   Its a modification of the Viewer example from the Qucik start guide.
   It loads up a cow and overrides the alpha to 0.1.
   Hope you can start from there.

   Dimi

   // Viewer Example, A minimal OSG viewer
   #include <osgDB/WriteFile>
   #include <osg/Notify>
   #include <osgViewer/Viewer>
   #include <osgDB/ReadFile>
   #include <osg/MatrixTransform>
   #include <osg/Geode>
   #include <osg/Geometry>
   #include <osg/StateSet>
   #include <osg/StateAttribute>
   #include <osg/CullFace>
   #include <osg/Point>
   #include <osg/Light>
   #include <osg/LightSource>
   #include <osg/BlendFunc>
   #include <osg/Material>
   #include <osg/PolygonMode>
   #include <osg/Notify>
        int
   main( int, char ** )
   {
       // Create a Viewer.
       osgViewer::Viewer viewer;
            // Load a model and add it to the Viewer.
       osg::ref_ptr<osg::Node> nde = osgDB::readNodeFile( "cow.osg" );
            // Create StateSet and Material
       osg::StateSet* state2 = nde->getOrCreateStateSet();
       osg::ref_ptr<osg::Material> mat2 = new osg::Material;
              // Set alpha to 0.1
       mat2->setAlpha(osg::Material::FRONT_AND_BACK, 0.1);
       state2->setAttributeAndModes( mat2.get() ,
   osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
               // Turn on blending
       osg::BlendFunc* bf = new
   osg::BlendFunc(osg::BlendFunc::SRC_ALPHA,
   osg::BlendFunc::ONE_MINUS_SRC_ALPHA );
       state2->setAttributeAndModes(bf);
            viewer.setSceneData(nde.get());
            if (!viewer.getSceneData())
       {
           osg::notify( osg::FATAL ) << "Unable to load data file.
   Exiting." << std::endl;
           return 1;
       }

       // Display, and main loop.
       return viewer.run();
   }

   ----- Original Message ----
   From: Vincent Bourdier <vincent.bourdier at gmail.com

   <mailto:vincent.bourdier at gmail.com>>
   To: OpenSceneGraph Users <osg-users at lists.openscenegraph.org

   <mailto:osg-users at lists.openscenegraph.org>>
   Sent: Tuesday, July 15, 2008 9:04:23 AM
   Subject: Re: [osg-users] Transparency on a drawable

   Hi Ulrich

   thanks for help.

   I use/try this code for the moment :

       osg::StateSet* state = g->getOrCreateStateSet();
                  state->setMode(GL_BLEND,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
           osg::Material* mat =
       (osg::Material*)state->getAttribute(osg::StateAttribute::MATERIAL);
           if(!mat) {
               mat = new osg::Material;                   }
           mat->setAlpha(osg::Material::FRONT_AND_BACK, alpha);
           state->setAttributeAndModes(mat,osg::StateAttribute::ON);
           state->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
           state->setMode(GL_LIGHTING, osg::StateAttribute::OFF);

   But nothing appear transparent...

   Regards,
      Vincent

   2008/7/12 Ulrich Hertlein <u.hertlein at sandbox.de

   <mailto:u.hertlein at sandbox.de>>:


       Vincent Bourdier wrote:

           I do exactly the same things, on Nodes...

               stateset->setMode(GL_BLEND,                  osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON );

               stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);


       Are you sure you're doing this last line?  It's not in the code
       snippet you posted initially...

       Cheers,
       /ulrich


              double opacity = 0.1;

                 osg::StateSet* state = mygometry->getOrCreateStateSet();
                 state->setMode(GL_BLEND,osg::StateAttribute::ON|
                 osg::StateAttribute::OVERRIDE);
                 osg::Material* mat = (osg::Material*)state->getAttribute
                 (osg::StateAttribute::MATERIAL);
                 if(!mat) {
                     mat = new osg::Material;
                     mat->setAlpha(osg::Material::FRONT_AND_BACK, opacity);
                                state->setAttributeAndModes(mat,osg::StateAttribute::ON);
                 }


       _______________________________________________
       osg-users mailing list
       osg-users at lists.openscenegraph.org

       <mailto:osg-users at lists.openscenegraph.org>

       http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org




   _______________________________________________
   osg-users mailing list
   osg-users at lists.openscenegraph.org

   <mailto:osg-users at lists.openscenegraph.org>

   http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org



------------------------------------------------------------------------

_______________________________________________
osg-users mailing list
osg-users at lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


_______________________________________________
osg-users mailing list
osg-users at lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20080715/ee1a0cd6/attachment-0003.htm>


More information about the osg-users mailing list