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