[osg-users] Transparency on a drawable
dimi christop
dimi_christop at yahoo.com
Tue Jul 15 03:32:17 PDT 2008
Ok,
I fixed your osg file so that it displays varrying tranparency (top transparent, bottom opaque).
I assume this is what you wanted.
Do an diff on the files and see what you did wrong.... You set the colors per primitive and not per vertex.
----- Original Message ----
From: Vincent Bourdier <vincent.bourdier at gmail.com>
To: OpenSceneGraph Users <osg-users at lists.openscenegraph.org>
Sent: Tuesday, July 15, 2008 1:19:23 PM
Subject: Re: [osg-users] Transparency on a drawable
Hi Dimi,
this is my code :
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);
mat->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
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);
there is no difference at all...
thanks for help.
Vincent.
2008/7/15 dimi christop <dimi_christop at yahoo.com>:
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
_______________________________________________
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/1531cdbc/attachment-0003.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: node_debug.osg
Type: application/octet-stream
Size: 1525 bytes
Desc: not available
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20080715/1531cdbc/attachment-0003.obj>
More information about the osg-users
mailing list