Re: [osg-users] Unwanted effect with two effect nodes in the line of sight (see-through)

2013-10-02 Thread Florian Kolbe
Ok, I think I solved it.
There is quite a catch to the following OSG FX method:


Code:
void Technique::addPass(osg::StateSet* ss)
{
if (ss) {
_passes.push_back(ss);
ss->setRenderBinDetails(static_cast(_passes.size()), "RenderBin");
}
}



Then again, this is was setRenderingHints does (yes, that's source code comment 
is in there, it's the 3.2.0 source):


Code:
void StateSet::setRenderingHint(int hint)
{
_renderingHint = hint;
// temporary hack to get new render bins working.
switch(_renderingHint)
{
case(TRANSPARENT_BIN):
{
_binMode = USE_RENDERBIN_DETAILS;
_binNum = 10;
_binName = "DepthSortedBin";
break;
}
case(OPAQUE_BIN):
{
_binMode = USE_RENDERBIN_DETAILS;
_binNum = 0;
_binName = "RenderBin";
break;
}
default: // DEFAULT_BIN
{
setRenderBinToInherit();
break;
}
}
}



So what I did before (in Technique::add_passes) did NOT work:


Code:

stateSet->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);   
addPass(stateSet.get());




But reversing the order DOES work:

Code:

addPass(stateSet.get());
stateSet->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);   



The order makes the difference since both have functionality similar to 
"setRenderBinDetails" - but with different settings.

Good to know how addPass() and setRenderingHint() work.

Is my interpretation correct?

Cheers,
Florian

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





___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] Unwanted effect with two effect nodes in the line of sight (see-through)

2013-10-01 Thread Florian Kolbe
Hi David and all,
  thank you for taking your time to answer this. To make things clear, I am 
using self-written subclasses of the "Effect" class (from the osgFX namespace).

Simply adding the second pass to the transparent bin did not help.

Though I have to admit I do not have the expertise (yet) to understand the 
interaction between multi-pass and multi-bin.

I suspect that I need a transparency effect in two passes, not in one pass.
This would explain why the single pass transparency occludes my second pass of 
the other effect node, right?

I would like to understand this a bit more, before I start trying things out, 
so my question are:
1. how do multi-pass and multiple bins play together?
2. if have nodes using two-pass rendering, does my transparency effect node 
also need two-pass (AND transparent bin) in order to take effect OVER the other 
effect nodes?

As another hint: I am also using the built-in osgFX::Scribe node which suffers 
from the effect, that the scribed nodes gets completely occluded by the 
"transparent" wall (left, in the attached screenshot scribe-gets-occluded.png).

Thank you!

Cheers,
  Florian

Links I found (relevant?):
http://forum.openscenegraph.org/viewtopic.php?t=11180
http://forum.openscenegraph.org/viewtopic.php?t=12791

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




Attachments: 
http://forum.openscenegraph.org//files/scribe_gets_occluded_175.png


___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] Unwanted effect with two effect nodes in the line of sight (see-through)

2013-09-25 Thread David Callu
Hi Florian

We can't really help you without know how work your multi pass system.

My guess is that osg draw your first  pass #1 - draw original with a little
offset, then transparency pass, then pass #2 - draw "tinted".
You can use osg::StateSet::RenderingHint(osg::StateSet::TRANSPARENT_BIN) in
your transparency stateSet
this will tell to osg that your geometry is transparency and have to be
draw after other drawable and from front to back order

Take a look to osg::StateSet::setRenderBinDetails and osgUtil::RenderBin
and how all of this work.

HTH
David


2013/9/25 Florian Kolbe 

> Hi,
>
> 1. for transparent walls we use our own node (derived from "Effect") - see
> code below
> 2. for "tinting" objects, we also use an effect node derived from "Effect"
> - see code below
>
> Used by themselves, everything works fine. But if we have a "tinted"
> object behind a "transparent" object, the "tinting" effect is gone (see
> screenshot).
>
> Code for transparency effect:
>
> Code:
> void define_passes()
> {
> // implement pass #1
> {
> // s.a. http://www.mail-archive.com//msg13796.html
> osg::ref_ptr stateSet = new osg::StateSet;
>
> // mat
> osg::Material* mat = new osg::Material;
> mat->setAlpha(osg::Material::FRONT_AND_BACK, alpha);
> stateSet->setAttributeAndModes(mat,
> osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
>
> // backface culling, führt dazu dass innere Rückseiten
> nicht angezeigt werden
> osg::CullFace* cull = new osg::CullFace();
> cull->setMode(osg::CullFace::BACK);
> stateSet->setAttributeAndModes(cull,
> osg::StateAttribute::ON);
>
> // turn on blending
> osg::BlendFunc* bf = new
> osg::BlendFunc(osg::BlendFunc::SRC_ALPHA,
> osg::BlendFunc::ONE_MINUS_SRC_ALPHA );
> stateSet->setMode(GL_BLEND, osg::StateAttribute::ON |
> osg::StateAttribute::OVERRIDE);
> stateSet->setAttributeAndModes(bf);
> // rendering hints
> stateSet->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
> // lighting
> stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
>
> addPass(stateSet.get());
> }
> }
>
>
>
> Code for "coloring" effect:
>
> Code:
> void define_passes()
> {
> // implement pass #1 - draw original with a little offset
> {
> osg::ref_ptr ss = new osg::StateSet;
>
> osg::ref_ptr polyoffset = new
> osg::PolygonOffset;
> polyoffset->setFactor(1.0f);
> polyoffset->setUnits(1.0f);
> ss->setAttributeAndModes(polyoffset.get(),
> osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
>
> addPass(ss.get());
> }
> // implement pass #2 - draw "tinted"
> {
> osg::ref_ptr ss = new osg::StateSet;
> // Material überschreiben
> ss->setAttributeAndModes(_wf_mat.get(),
> osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
>
> // notwendig, damit alpha greift
>
> ss->setMode(GL_BLEND,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
>
> addPass(ss.get());
> }
> }
>
>
>
> See attached image:
> The fire extinguisher should be all yellow, but behind the transparent
> wall - it is as if it was rendered without the effect.
>
> I hope someone can sched some light on this issue?
>
> Thank you!
>
> Florian
>
> PS sorry if the code snippets come out weird, leading space for
> indentation somehow goes wrong...[/img][/code]
>
> --
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=56477#56477
>
>
>
>
> Attachments:
> http://forum.openscenegraph.org//files/transparency_bug_132.png
>
>
> ___
> osg-users mailing list
> osg-users@lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


[osg-users] Unwanted effect with two effect nodes in the line of sight (see-through)

2013-09-25 Thread Florian Kolbe
Hi,

1. for transparent walls we use our own node (derived from "Effect") - see code 
below
2. for "tinting" objects, we also use an effect node derived from "Effect" - 
see code below

Used by themselves, everything works fine. But if we have a "tinted" object 
behind a "transparent" object, the "tinting" effect is gone (see screenshot).

Code for transparency effect:

Code:
void define_passes()
{
// implement pass #1
{
// s.a. http://www.mail-archive.com//msg13796.html
osg::ref_ptr stateSet = new osg::StateSet;

// mat
osg::Material* mat = new osg::Material;
mat->setAlpha(osg::Material::FRONT_AND_BACK, alpha);
stateSet->setAttributeAndModes(mat, osg::StateAttribute::ON | 
osg::StateAttribute::OVERRIDE);

// backface culling, führt dazu dass innere Rückseiten nicht 
angezeigt werden
osg::CullFace* cull = new osg::CullFace();
cull->setMode(osg::CullFace::BACK);
stateSet->setAttributeAndModes(cull, osg::StateAttribute::ON);

// turn on blending
osg::BlendFunc* bf = new 
osg::BlendFunc(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA );
stateSet->setMode(GL_BLEND, osg::StateAttribute::ON | 
osg::StateAttribute::OVERRIDE);
stateSet->setAttributeAndModes(bf);
// rendering hints
stateSet->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
// lighting
stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);

addPass(stateSet.get());
}
}



Code for "coloring" effect:

Code:
void define_passes()
{
// implement pass #1 - draw original with a little offset
{
osg::ref_ptr ss = new osg::StateSet;

osg::ref_ptr polyoffset = new 
osg::PolygonOffset;
polyoffset->setFactor(1.0f);
polyoffset->setUnits(1.0f);
ss->setAttributeAndModes(polyoffset.get(), 
osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);

addPass(ss.get());
}
// implement pass #2 - draw "tinted"
{
osg::ref_ptr ss = new osg::StateSet;
// Material überschreiben
ss->setAttributeAndModes(_wf_mat.get(), 
osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);

// notwendig, damit alpha greift

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

addPass(ss.get());
}
}



See attached image:
The fire extinguisher should be all yellow, but behind the transparent wall - 
it is as if it was rendered without the effect.

I hope someone can sched some light on this issue?

Thank you!

Florian

PS sorry if the code snippets come out weird, leading space for indentation 
somehow goes wrong...[/img][/code]

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




Attachments: 
http://forum.openscenegraph.org//files/transparency_bug_132.png


___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org