Re: [osg-users] Custom Drawable GLSL

2012-09-05 Thread Jeremy Moles
On Tue, 2012-09-04 at 19:21 +0100, Robert Osfield wrote:
 Hi Jeremy,
 
 It should be possible to do a
 
 drawImplementation(..)
 {
 
   state.apply(stateSetOne);
   // do stuff
   state.apply(stateSetTwo);
  // do more stuff
 
 }

I've settled on:

drawImplementation() {
state.pushStateSet(ss1);
state.apply();
// do stuff
state.popStateSet();
state.apply()

state.pushStateSet(ss1);
state.apply();
// do more stuff
state.popStateSet();
state.apply()
}

Does this seem like an abomination? :) Just calling state.apply() ALMOST
worked, but there was some state leakage (for example, the shader was
applied to all subsequent fragment processing, regardless of it's
location in the graph).

 I'm not 100% sure what will happen with the progress of draw traversal
 w.r.t how the drawable StateSet if any is applied and then later
 assumed to be applied by other state calls.  I think it will probably
 work out OK though so try it, and if something breaks then considering
 adding an extra state.apply(drawwablesStateSet) or a perhaps a state
 dirty.
 
 This is something we can workout if required though, try the simplest
 thing first then if need be investigate more complicated routes...
 
 Robert.
 ___
 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] Custom Drawable GLSL

2012-09-04 Thread Jeremy Moles
I am creating a custom Drawable that needs to push a Fragment Shader
into the current rendering state and then, after a single extension
call, subsequently remove this shader from the state.

I have some code I noodled through to make this work, but I feel like
there is probably a better way. It goes something like this:



drawImplementaion(RenderInfo ri) {
State* state = ri.getState();
unsigned int contextID = state-getContextID();

_program.apply(state);

myExtensions-doMycall();

GL2Extensions::Get(contextID, true)-glUseProgram(0);

state-setLastAppliedProgramObject(0);
}



Like I said above, this works, but I feel like there is probably a
cleaner way to achieve what I want. Note that _program is a ref_ptr to a
properly create osg::Program object, since I certainly do NOT want to
recreate all the goodness it provides. :)

Any API advice?

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


Re: [osg-users] Custom Drawable GLSL

2012-09-04 Thread Paul Martz
Doesn't a Drawable's state get applied prior to the call to 
Drawable::drawImplementation()? If so, you could just put the _program in your 
Drawable's StateSet?


It's easy to verify that things are happening in the right order using a 
debugger with breakpoints set at your drawImplementation() and also at 
Program::apply().


If it doesn't happen as I describe above, then I believe what you're doing below 
is the most robust, as that code would work with all other rendering in the 
scene graph, both shader and non-shader rendering.


Honestly it's been too long since I played at this level. But I seem to recall 
that the difference between:

_program-apply( state );
and
state-apply( _program.get() );
is that the latter tracks the currently bound program, doesn't bother to apply 
it if it's already in use, and would probably allow you to remove the call to 
setLastAppliedProgramObject(0).

   -Paul


On 9/4/2012 9:58 AM, Jeremy Moles wrote:

I am creating a custom Drawable that needs to push a Fragment Shader
into the current rendering state and then, after a single extension
call, subsequently remove this shader from the state.

I have some code I noodled through to make this work, but I feel like
there is probably a better way. It goes something like this:



drawImplementaion(RenderInfo  ri) {
State* state = ri.getState();
unsigned int contextID = state-getContextID();

_program.apply(state);

myExtensions-doMycall();

GL2Extensions::Get(contextID, true)-glUseProgram(0);

state-setLastAppliedProgramObject(0);
}



Like I said above, this works, but I feel like there is probably a
cleaner way to achieve what I want. Note that _program is a ref_ptr to a
properly create osg::Program object, since I certainly do NOT want to
recreate all the goodness it provides. :)

Any API advice?

___
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


Re: [osg-users] Custom Drawable GLSL

2012-09-04 Thread Jeremy Moles
On Tue, 2012-09-04 at 11:05 -0600, Paul Martz wrote:
 Doesn't a Drawable's state get applied prior to the call to 
 Drawable::drawImplementation()? If so, you could just put the _program in 
 your 
 Drawable's StateSet?

I'm working on a nodekit for NV_path_rendering, which takes an as of
yet unseen approach to rendering; new go OpenGL, at any rate. :)

They call it the Stencil then Cover approach, and like most 2D vector
drawing libraries, there is a notion of both STROKING _and_ FILLING. In
order to support arbitrary shading on both the affected stroke fragments
and affected fill fragments, I need to be able to potentially set two
different shaders during a single drawable drawImplementation.

Now, having said that--which I potentially should have mentioned in the
first email--does that change any advice you might have? :)

(Thanks for the response, btw... good info.)

 It's easy to verify that things are happening in the right order using a 
 debugger with breakpoints set at your drawImplementation() and also at 
 Program::apply().
 
 If it doesn't happen as I describe above, then I believe what you're doing 
 below 
 is the most robust, as that code would work with all other rendering in the 
 scene graph, both shader and non-shader rendering.
 
 Honestly it's been too long since I played at this level. But I seem to 
 recall 
 that the difference between:
  _program-apply( state );
 and
  state-apply( _program.get() );
 is that the latter tracks the currently bound program, doesn't bother to 
 apply 
 it if it's already in use, and would probably allow you to remove the call to 
 setLastAppliedProgramObject(0).
 -Paul
 
 
 On 9/4/2012 9:58 AM, Jeremy Moles wrote:
  I am creating a custom Drawable that needs to push a Fragment Shader
  into the current rendering state and then, after a single extension
  call, subsequently remove this shader from the state.
 
  I have some code I noodled through to make this work, but I feel like
  there is probably a better way. It goes something like this:
 
  
 
  drawImplementaion(RenderInfo  ri) {
  State* state = ri.getState();
  unsigned int contextID = state-getContextID();
 
  _program.apply(state);
 
  myExtensions-doMycall();
 
  GL2Extensions::Get(contextID, true)-glUseProgram(0);
 
  state-setLastAppliedProgramObject(0);
  }
 
  
 
  Like I said above, this works, but I feel like there is probably a
  cleaner way to achieve what I want. Note that _program is a ref_ptr to a
  properly create osg::Program object, since I certainly do NOT want to
  recreate all the goodness it provides. :)
 
  Any API advice?
 
  ___
  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 mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] Custom Drawable GLSL

2012-09-04 Thread Robert Osfield
Hi Jeremy,

It should be possible to do a

drawImplementation(..)
{

  state.apply(stateSetOne);
  // do stuff
  state.apply(stateSetTwo);
 // do more stuff

}

I'm not 100% sure what will happen with the progress of draw traversal
w.r.t how the drawable StateSet if any is applied and then later
assumed to be applied by other state calls.  I think it will probably
work out OK though so try it, and if something breaks then considering
adding an extra state.apply(drawwablesStateSet) or a perhaps a state
dirty.

This is something we can workout if required though, try the simplest
thing first then if need be investigate more complicated routes...

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


Re: [osg-users] Custom Drawable GLSL

2012-09-04 Thread Jean-Sébastien Guay

Hi Jeremy,

In the past I've done similar low-level 2-pass rendering in a Drawable, 
by doing as Robert suggests. Apply one stateset, draw, apply another, 
draw again (same or different geometry).


A Program is just state, so you need to draw something in between 
setting different Programs. Otherwise setting the first Program has no 
(visible) effect. I know it sounds obvious but I thought I'd just throw 
that out there so there's no ambiguity :-)


Hope this helps,

J-S


On 04/09/2012 1:23 PM, Jeremy Moles wrote:

On Tue, 2012-09-04 at 11:05 -0600, Paul Martz wrote:

Doesn't a Drawable's state get applied prior to the call to
Drawable::drawImplementation()? If so, you could just put the _program in your
Drawable's StateSet?

I'm working on a nodekit for NV_path_rendering, which takes an as of
yet unseen approach to rendering; new go OpenGL, at any rate. :)

They call it the Stencil then Cover approach, and like most 2D vector
drawing libraries, there is a notion of both STROKING _and_ FILLING. In
order to support arbitrary shading on both the affected stroke fragments
and affected fill fragments, I need to be able to potentially set two
different shaders during a single drawable drawImplementation.

Now, having said that--which I potentially should have mentioned in the
first email--does that change any advice you might have? :)

(Thanks for the response, btw... good info.)


It's easy to verify that things are happening in the right order using a
debugger with breakpoints set at your drawImplementation() and also at
Program::apply().

If it doesn't happen as I describe above, then I believe what you're doing below
is the most robust, as that code would work with all other rendering in the
scene graph, both shader and non-shader rendering.

Honestly it's been too long since I played at this level. But I seem to recall
that the difference between:
  _program-apply( state );
and
  state-apply( _program.get() );
is that the latter tracks the currently bound program, doesn't bother to apply
it if it's already in use, and would probably allow you to remove the call to
setLastAppliedProgramObject(0).
 -Paul


On 9/4/2012 9:58 AM, Jeremy Moles wrote:

I am creating a custom Drawable that needs to push a Fragment Shader
into the current rendering state and then, after a single extension
call, subsequently remove this shader from the state.

I have some code I noodled through to make this work, but I feel like
there is probably a better way. It goes something like this:



drawImplementaion(RenderInfo  ri) {
State* state = ri.getState();
unsigned int contextID = state-getContextID();

_program.apply(state);

myExtensions-doMycall();

GL2Extensions::Get(contextID, true)-glUseProgram(0);

state-setLastAppliedProgramObject(0);
}



Like I said above, this works, but I feel like there is probably a
cleaner way to achieve what I want. Note that _program is a ref_ptr to a
properly create osg::Program object, since I certainly do NOT want to
recreate all the goodness it provides. :)

Any API advice?

___
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 mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org




--
__
Jean-Sebastien Guay  jean_...@videotron.ca
http://whitestar02.dyndns-web.com/

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


Re: [osg-users] Custom Drawable GLSL

2012-09-04 Thread Jeremy Moles
On Tue, 2012-09-04 at 19:15 -0400, Jean-Sébastien Guay wrote:
 Hi Jeremy,
 
 In the past I've done similar low-level 2-pass rendering in a Drawable, 
 by doing as Robert suggests. Apply one stateset, draw, apply another, 
 draw again (same or different geometry).
 
 A Program is just state, so you need to draw something in between 
 setting different Programs. Otherwise setting the first Program has no 
 (visible) effect. I know it sounds obvious but I thought I'd just throw 
 that out there so there's no ambiguity :-)
 
 Hope this helps,

Hey Paul. :)

It's not simply an issue of setting two similar state attributes in
sequence; the NV_path_rendering API is different enough in that for the
stroke you may want to use a shader and for the fill you may want to
reset the state and use whatever fixed state was available previously,
which is why I've had the issues. HOWEVER, I could just implement
everything as shaders anyways.

What I really seem to need is like a State::save(), State::restore()
kind of thing...

 J-S
 
 
 On 04/09/2012 1:23 PM, Jeremy Moles wrote:
  On Tue, 2012-09-04 at 11:05 -0600, Paul Martz wrote:
  Doesn't a Drawable's state get applied prior to the call to
  Drawable::drawImplementation()? If so, you could just put the _program in 
  your
  Drawable's StateSet?
  I'm working on a nodekit for NV_path_rendering, which takes an as of
  yet unseen approach to rendering; new go OpenGL, at any rate. :)
 
  They call it the Stencil then Cover approach, and like most 2D vector
  drawing libraries, there is a notion of both STROKING _and_ FILLING. In
  order to support arbitrary shading on both the affected stroke fragments
  and affected fill fragments, I need to be able to potentially set two
  different shaders during a single drawable drawImplementation.
 
  Now, having said that--which I potentially should have mentioned in the
  first email--does that change any advice you might have? :)
 
  (Thanks for the response, btw... good info.)
 
  It's easy to verify that things are happening in the right order using a
  debugger with breakpoints set at your drawImplementation() and also at
  Program::apply().
 
  If it doesn't happen as I describe above, then I believe what you're doing 
  below
  is the most robust, as that code would work with all other rendering in the
  scene graph, both shader and non-shader rendering.
 
  Honestly it's been too long since I played at this level. But I seem to 
  recall
  that the difference between:
_program-apply( state );
  and
state-apply( _program.get() );
  is that the latter tracks the currently bound program, doesn't bother to 
  apply
  it if it's already in use, and would probably allow you to remove the call 
  to
  setLastAppliedProgramObject(0).
   -Paul
 
 
  On 9/4/2012 9:58 AM, Jeremy Moles wrote:
  I am creating a custom Drawable that needs to push a Fragment Shader
  into the current rendering state and then, after a single extension
  call, subsequently remove this shader from the state.
 
  I have some code I noodled through to make this work, but I feel like
  there is probably a better way. It goes something like this:
 
  
 
  drawImplementaion(RenderInfo  ri) {
State* state = ri.getState();
unsigned int contextID = state-getContextID();
 
_program.apply(state);
 
myExtensions-doMycall();
 
GL2Extensions::Get(contextID, true)-glUseProgram(0);
 
state-setLastAppliedProgramObject(0);
  }
 
  
 
  Like I said above, this works, but I feel like there is probably a
  cleaner way to achieve what I want. Note that _program is a ref_ptr to a
  properly create osg::Program object, since I certainly do NOT want to
  recreate all the goodness it provides. :)
 
  Any API advice?
 
  ___
  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 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