Hello Andreas,

On 09/11/2012 07:35 AM, Alexander Lang wrote:
> DepthPeelingStage::renderEnter(Action* action)
> {
>      beginPartitionGroup
>      pushPartition
>
>      //init similar to HDR implementation
>
>      setRenderTarget(myFBO)
>      renderPartition->setBackground(background);
>      background->clear()
>      //initialize depth buffer: draw Scene
>      this->recurseFromThis()
>
>      for (number of passes)
>      {
>          setRenderTarget(myOtherFBO)
>          setBackground(...)
>          background->setAlpha(...)
>          background->clear()
>
>          renderPartition->pushState()
>          //set new state for pass i: add blend, texture and depth chunks
>          renderPartition->addOverride(...)
>          this->recurseFromThis()
>          renderPartition->popState()
>
>          //Post process: draw quad textured with contents of this pass
>          //similar to HDR stage implementation
>          pushPartition()
>          //setup projection
>          RenderPartition::SimpleDrawCallback f;
>
>          f = boost::bind(&DepthPeelingStage::postProcess,
>                this, _1);

possibly a typo, but pPart->dropFunctor(f); is missing here, otherwise 
the post processing is not being run.

>          popPartition()
>
>      }
>
>      popPartition
>      endPartitionGroup
> }
>
> DepthPeelingStage::postProcess(DrawEnv*)
> {
>      //get data
>      //activate FBO if not final
>      //activate material state
>      //draw quad with glBegin()/glEnd()
>      //deactivate material state
>      //deactivate FBO
> }
>
> With this setup the scene gets rendered to a texture which is displayed by
> the quad but i do not see effects of other passes.
> Therefore, i have several questions, hopefully you could help me
> understand the internals of OpenSG better:
>
> - Does this sound like a valid setup with the main work done in
> renderEnter()?

yes, keep in mind though that during scene traversal (i.e. when 
renderEnter() is called) nothing is actually drawn, only the partitions 
are set up and the work they are to do at draw time is specified.

> - Why is the SimpleCallback required?

see above, the actual work is done after scene traversal, so you need to 
delay work until then.

> Could postProcess not be called
> directly within renderEnter()? When is the callback executed in regards to
> the for-loop?

every iteration of the loop must create a new partition, using 
pushPartition() and then getActivePartition() to get a pointer to it and 
set things like the FBO etc.

> - What does a RenderPartition do?

a render partition is a pass or a chunk of work to be done when objects 
are drawn.

> When do you have to call
> beginPartitionGroup() and pushPartition()?

pushPartition() creates a new partition, so you need to call it when you 
start a new pass. Partitions are normally processed in reverse order 
from when they are created, if you begin a group the partitions in the 
group are processed in the order they are created in.

> Does each render pass have to
> be wrapped in such a pair or does it suffice to call these at the begin
> and end of renderEnter()

each pass needs to be a partition, otherwise state sorting will draw 
objects in whatever order it deems most efficient without respecting 
pass boundaries.

> - How could i have a texture that is set up within this stage available in
> the shader code of the user? I tried:
>
> pRenderPartition->addOverride(pTextureObjChunk->getClassId(),
> pTextureObjChunk);

IIRC that should make the texture available in texture unit 0.

> followed by the call to recurseFromThis() but this showed no effect. I
> replaced pTextureObjChunk->getClassId() with 0 or 1 since i assumed this
> would set the texture unit but that did not work either.

the class id is not the texture unit; class id + 0 is texture unit 0, 
class id + 1 is texture unit 1, etc. (at least that's what it used to be).

> - The HDR stage and others use direct OpenGL calls. Can any FC
> implementation call arbitrary OpenGL functions that work in a distributed
> environment?

OpenSG does not contain crystal ball technology ;) You have to know what 
you are doing and in particular be careful to reset any state you 
change, otherwise OpenSG's state tracking is going to be confused and 
you get "interesting" result.

> I look forward to any answer. My concern is to have a way to correctly
> display transparent geometry within OpenSG.
> As a last note, what is required to integrate new OpenGL functions into
> OpenSG? More specifically if the functionality of glBindImageTexture() was
> available in OpenSG, the A-Buffer algorithm (see Cyril Crassin's approach:
> http://blog.icare3d.org/2010/06/fast-and-accurate-single-pass-buffer.html)
> could be used and multiple render passes would not be required any longer
> for correct transparency.

Is there an OpenGL extension that makes glBindImageTexture() available 
in OpenGL 2 contexts?
If so, you can add prototypes for the extension to 
Source/Base/Base/OSGGLFuncProtos.h
Add a static UInt32 _extSomeExtension extension id to your stage.
Add for each function added by the extension static UInt32 
FuncIdBindImageTexture extension function ids to your stage.
You register the extension and extension functions in 
DepthPeelingStage::initMethod() - see 
Source/System/State/Shader/Base/OSGShaderProgram.cpp for an example.
To call such an extension function you place a line like:

OSGGETGLFUNCBYID_GL3_ES(glCreateShader,
                         osgGlCreateShader,
                         FuncIdCreateShader,
                         pWin);

before you call it, to get a function pointer that is valid for the 
current context and then use osgGlCreateShader() as if it was 
glCreateShader() - again OSGShaderProgram.cpp has example usage.

        Cheers, 
                Carsten

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Opensg-users mailing list
Opensg-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to