Hi Pavlos, Using shaders is certainly more flexible, but it does bring its own complexities.
FYI, the complexities in handling standard OpenGL lighting with more than the max supported comes down to the way that the OSG handles that fact that lights are positional state, and positional state has to be bound to a specific modelview matrix to position it in the correct place - OpenGL lights can't just be assigned at any time in the draw traversal as their modelview matrices will be indeterminate and end up jumping around the place relative to different chunks of your scene graph. To cope with the correct binding of position state with the intended modelview matrix the OSG detects the LightSource nodes in the scene graph during cull traversal and then binds the modelview matrix inhertied down to this LightSource with the Light attached to the LightSource, then this pairing of matrix and light are assigned to the current RenderStage (a render backend object that manages the rendering of a single stage in the rendering pipeline). Each RenderStage can only have up to the max supported lights assigned to at any one time and a single light can't be in more than one place at one time as there is only one entry for it. To handle more lights you need to segment you scene up so that different parts render into different RenderStage, these RenderStage will need to be chain so that the first one does the usual OpenGL clear of colour and depth buffers(as is default for a RenderStage), the subsequent ones then switch off the clear, so they overlay on top. You can do custom control of the RenderStage by using a cull callback that creates/maintains them appropriately. Robert. On Jan 3, 2008 9:03 AM, Pavlos Mavridis <[EMAIL PROTECTED]> wrote: > Hi Paul, > Your suggestion to use shaders and perhaps pass the light parameters > using uniforms, > as Terry suggested, seems very reasonable to me. That way we can bypass > the OSG > backend and manage the lights in our code. And it's probably simpler > than messing > with the backend. > > Of course, if there's a better or more elegant approach I would like to > hear it. > > Pavlos > > > Paul Martz wrote: > > As Robert said, using the fixed function pipe involves knowledge of > > the backend. I believe multiple RenderStages would allow multiple > > PositionalState, which means you could support more than the fixed > > function limit for lights. This gets complex. > > > > It'd probably be easier to use shaders to do what you want, as they > > aren't limited by the number of fixed function lights. > > > > Paul Martz > > Skew Matrix Software > > > > > > On Jan 2, 2008, at 5:06 PM, "Terry Welsh" <[EMAIL PROTECTED]> wrote: > > > > > >> Hi Pavlos, > >> I'm interested in this topic too. I haven't found the discussions in > >> the archives, but I probably just haven't picked the right search > >> keywords. > >> > >> My problem is very similar to yours I think. I want to have a lot of > >> lights in my scene that falloff completely after a reasonable distance > >> and only apply 3 of them to each piece of geometry, probably choosing > >> them based on proximity and/or brightness. I was thinking of only > >> activating lights 0, 1, and 2 and applying a cull callback to all my > >> geodes that would set different light positions and colors for each > >> geode that doesn't get culled. The positions and colors would be > >> chosen from a much larger pool of lights that I store in my own data > >> structures outside of OpenGL and OSG. I haven't figured out if I > >> would do this by setting parameters for OpenGL lights 0, 1, and 2, or > >> by setting custom shader Uniforms. > >> > >> Or there might be a much better approach I haven't thought of. > >> Anyway, I'd like to discuss this more or hear from anyone who has done > >> this.... > >> - Terry > >> > >> > >>> Message: 3 > >>> Date: Wed, 2 Jan 2008 16:42:37 +0000 > >>> From: "Robert Osfield" <[EMAIL PROTECTED]> > >>> Subject: Re: [osg-users] Selective lighting in OSG > >>> To: "OpenSceneGraph Users" <[email protected]> > >>> Message-ID: > >>> <[EMAIL PROTECTED]> > >>> Content-Type: text/plain; charset=ISO-8859-1 > >>> > >>> Hi Pavlos, > >>> > >>> I'm afraid handling more than max number of OpenGL lights is awkward > >>> in the OSG, it is possible but you'll need to learn quite a bit about > >>> the internals of how the rendering back end is setup and traversed. > >>> This topic has been discussed in the past on osg-users so have a bash > >>> at going through the email archives. > >>> > >>> Robert. > >>> > >>> On Jan 2, 2008 4:13 PM, Pavlos Mavridis <[EMAIL PROTECTED]> wrote: > >>> > >>>> Selective lighting in OSG > >>>> > >>>> Hello everyone, > >>>> what is the best way to define a light that affects not the entire > >>>> scenegraph, but only a part of it? > >>>> > >>>> For example I have a scene with many objects. Each one of them is > >>>> lit by > >>>> one light that is > >>>> different from one object to another. So the number of lights can be > >>>> greater than GL_MAX_LIGHTS, > >>>> but since each object is lit only by one light, using opengl we > >>>> could > >>>> render the entire scene using > >>>> only one hardware light (lets say GL_LIGHT0), by resetting its > >>>> parameters per object. > >>>> > >>>> In the general case we can have more than one light per object and > >>>> the > >>>> lights can be > >>>> turned on and off per frame. So, what is the best way to do this > >>>> in OSG? > >>>> > >>>> I've tried passing the stateset of the sub-tree I want to light on a > >>>> lighsource node using: > >>>> lightsource->setStateSetModes(stateset,osg::StateAttribute::ON); > >>>> but it doesn't work as expected. > >>>> > >>>> Also I've tried changing the stateset of the sub-tree I want to > >>>> light > >>>> directly, > >>>> without using any lighsource nodes: > >>>> stateset->setAttributeAndModes(light, osg::StateAttribute::ON); > >>>> stateset->setMode( GL_LIGHT0 + num, osg::StateAttribute::ON ); > >>>> to enable a light and > >>>> stateset->setAttributeAndModes(light, osg::StateAttribute::OFF); > >>>> to remove it. > >>>> > >>>> The last method seems to work when the number of lights is > >>>> constant per > >>>> frame, > >>>> but it brakes when I try to dynamically turn on and off lights per > >>>> frame. (perhaps > >>>> because I have to manually enable/disable the corresponding opengl > >>>> lights?) > >>>> > >>>> So, what is the best way to do this in OSG? > >>>> > >>>> Thanks in advance > >>>> > >>>> Pavlos Mavridis > >>>> > >>>> > >> _______________________________________________ > >> osg-users mailing list > >> [email protected] > >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > >> > > _______________________________________________ > > osg-users mailing list > > [email protected] > > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > > > > > _______________________________________________ > osg-users mailing list > [email protected] > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > _______________________________________________ osg-users mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

