I've started a separate thread for the transformation problem with
subject: Transformation nodes with shaders

On Fri, May 13, 2011 at 2:42 PM, SkullCheck <[email protected]> wrote:
> Hi David,
>
> Thank you for your feedback. It looks like we are doing similar
> things, but a bit differently. I was distracted by another project the
> past couple of weeks but returned to this one and was given the go
> ahead to do a complete redesign. I have the UML of the design if
> you're interested. Basically I try to replicate the interface of
> osg::Light and osg::LightSource and automate all the uniform updates
> underneath. Also automated the setup of the shader programs.
> Unfortunately I need to wrap this all up next week so am not sure if
> we could've collaborated.
>
> But I have am still having one problem though. If there are some
> transform nodes in the scenegraph under the stateset containing the
> shader code, the vertex shader receives vertices in the transform
> node's local coordinates. The screenshot shows an example. There is a
> green light at the center of the spiral. I've placed a box offset from
> the center, but the green light from the center is showing up on the
> box instead of the peachish light that is nearby.
>
> Thanks,
> Chris
>
> On Tue, Apr 19, 2011 at 9:42 AM, David Callu <[email protected]> wrote:
>> Hi Chris, Hi Jean-Sébastien
>>
>> I just ending a similar work for a client and i could provide some advice on
>> the subject.
>> First, I derived from osg::LightSource to osgLighting::LightSource (that
>> could contain many light, not only one as osg::LightSource) and add a
>> cullCallback to do a similar job of
>> osgUtil::CullVisitor::accept(osg::LightSource).
>> I create a osgLighting::LightGroup (not a node) which contain light
>> parameter (ambient, diffuse, position, direction ...)
>> in uniforms arrays, and be shared by all lights
>> I derived from osg::Light to osgLighting::Light that contain an
>> osgLighting::LightGroup to store parameter in it.
>> Shader is handle by a shader generator so I can't help you on this point.
>> But I conclude after some test that per pixel lighting is not a choice.
>> If you want apply shadow per light, you have to combine each light/shadow
>> pair
>> in the pixel shader. you can't compute light in vertex shader, then pass
>> result of each light
>> in pixel shader, and apply shadow on each light result. if you have 40
>> lights in you scene.
>> you have to pass 40 vec3 from vertex shader to pixel shader ouch!!!
>> according to Real-Time Rendering 3ed,
>> Shader Model 4 have 16 interpolation registre between Vertex and
>> Geometry/Pixel Shader and
>> 32 between Geometry and Pixel Shader.
>>
>> J-S:
>> About deferred shading, this is my first reflex to not pay the Z complexity
>> of the scene.
>> But OpenGL allow only 8 texture target to render in, so 8*4=32 values.
>> We can use 3 for eye position, 3 for normal. This let's us with 26 value to
>> pass light direction/position.
>> That is largely under the need to handle more that 8 lights.
>> I read an article about Unreal Engine that push the 3 nearest lights in RTT,
>> and all others lights are combined in one, so only 4 light is pass to RTT,
>> then computed in deferred shader.
>> I have to dig this way ...
>> Still according to Real Time Rendering 3ed, if you don't write the
>> gl_FragDepth in your shader, recent hardware
>> discard automatically the pixel computation if pixel in frame buffer is
>> front of the incoming pixel.
>> You can use OSG_DEFAULT_BIN_SORT_MODE=SORT_FRONT_TO_BACK to help hardware to
>> do the job.
>>
>>
>> I am in negotiation with my client to put osgLighting and osgGLSL (the
>> shader generator) in OpenSource.
>> But this will not happen before summer I think. Many people to convince that
>> OpenSource is the good way for every body.
>>
>> HTH
>> David Callu
>> 2011/4/19 Jean-Sébastien Guay <[email protected]>
>>>
>>> Hi Chris,
>>>
>>> First of all, I have to commend you on all the work you've put into doing
>>> this. You obviously put a lot of thought and research into your problem, and
>>> explored multiple avenues before posting, which I have to admire!
>>>
>>> I've personally never needed more than the 8 light sources the fixed
>>> pipeline gave me, so I've always used the built-in gl_LightSource[i]
>>> structure and osg::LightSource+osg::Light to manage my lights. I have a
>>> mechanism in place that lets me reuse light IDs when lights get turned on or
>>> off (a light turned off frees its light ID, and a light turned on will take
>>> the first available light ID), and this uses IDs 0-7, which has been
>>> sufficient for me. Add to that the fact that OSG's built-in shadow
>>> techniques support casting shadows from only one light, and I've never
>>> really had a need (personally or from client requirements) to go further.
>>> But that's not to say it won't happen.
>>>
>>> What I'd say in response to your question is, I think you have a good idea
>>> of what is the best solution to your problem (solution 1), but it requires
>>> some small changes to OSG itself in order to be feasible. So what prevents
>>> you from proposing these changes? Robert hasn't been against making some
>>> methods virtual when needed in the past, and even deeper changes will be
>>> possible when they're justified.
>>>
>>> About the CullVisitor, I don't understand what you mean about not
>>> recognizing new classes. First of all, sure, you could add new classes to
>>> its interface, but even if not, you can always, in the
>>> accept(osg::LightSource&) method, check with a dynamic_cast if the
>>> lightSource is of your derived class:
>>>
>>> virtual void accept(osg::LightSource& ls)
>>> {
>>>  if (dynamic_cast<myOwnLightSource*>(&ls) != 0)
>>>  {
>>>    // My light source subclass.
>>>  }
>>>  else
>>>  {
>>>    // Plain old osg::LightSource
>>>  }
>>> }
>>>
>>> But whatever you decide, I think you shouldn't rule out changes to the
>>> core OSG. The fixed pipeline is out, and shaders are in, and if OSG could be
>>> made to support its own osg_LightSource[i] uniforms, with indices limited
>>> only by shader memory (while not ruling out the possibility that the first 8
>>> of those be mapped to the fixed pipeline light sources if the fixed pipeline
>>> is available) then that would be very nice indeed.
>>>
>>> I'll just add one last note, another way to deal with many light sources
>>> would be to do deferred shading, maybe you should look this up. It all
>>> depends on what you're doing, but deferred shading has the advantage that
>>> all complex lighting calculations (per pixel lighting, normal mapping, etc.)
>>> happen in screen space only once per visible pixel, instead of possibly
>>> happening many times per pixel and being overwritten (because of z order).
>>>
>>> Hope this helps, and I hope you'll be able to show us some really cool
>>> stuff in the near future,
>>>
>>> J-S
>>>
>>>
>>> On 18/04/2011 10:09 PM, SkullCheck wrote:
>>>>
>>>> Hi Gordon,
>>>>
>>>> I hope those puns were intended, in any case, they brightened my day ;)
>>>>
>>>> I did search the archives and found one reference to the osgmanylights
>>>> tutorial, but unfortunately it is no longer on the site that it was
>>>> linked to, does anyone have a copy of that tutorial lying around in
>>>> their archive? The old link was:
>>>> http://www.fx.clemson.edu/~acnatha/devnull/osg/osgmanylights.tar.gz
>>>>
>>>> I was however able to successfully implement pixel-based lighting in a
>>>> fragment shader with as many lights as desired (up to shader memory
>>>> limits of course). I basically just defined my own uniform array of
>>>> gl_LightSourceParameters in the shader program. The values of these
>>>> custom lights are controlled with uniforms which, when wrapped up in a
>>>> LightUniforms class provides an API identical to osg::Light. A
>>>> LightShader class, derived from osg::Shader, provides an interface for
>>>> setting the number of lights which basically just does a search and
>>>> replace of a special string (i.e. NUM_LIGHTS) in the shader source and
>>>> then forces a recompilation of the shader program. This all works
>>>> fine.
>>>>
>>>> The problem comes however in positioning the lights. If I understand
>>>> correctly, OSG uses a LightSource placed in the scenegraph to modify
>>>> the position of its associated Light according according to its parent
>>>> transformation(s). This gets done by the PositionalStateContainer
>>>> which gets added to the RenderStage during cull traversal in
>>>> CullVisitor::accept(LightSource) ->
>>>> RenderStage::addPositionedAttribute(). I was thinking about a couple
>>>> of solutions to this:
>>>>
>>>> 1. Derive my own classes from osg::Light and osg::LightSource. This is
>>>> problematic for a number of reasons:
>>>>
>>>> - CullVisitor, being a Visitor class, cannot be expanded (without
>>>> modifying its interface) to recognize new classes (one of the
>>>> tradeoffs for the Visitor pattern). So it will not recognize my
>>>> derived LightSource class, if I understand the Visitor pattern
>>>> correctly.
>>>>
>>>> - Deriving from osg::Light, which calls fixed function opengl lighting
>>>> calls, causes GLMode errors for light numbers>= GL_MAX_LIGHTS.
>>>>
>>>> 2. Do not derive my own classes osg::Light and osg::LightSource, but
>>>> instead make my LightSource-type class subclass from osg::Group
>>>> directly, override the traverse() method, extract the localtoWorld
>>>> transform from the visitor object and and based on that set the
>>>> position and spotdirection on the (non osg derived) Light. However,
>>>> this has some other side effects:
>>>>
>>>> - we have a shadow class, based on osg::ShadowTechnique, which relies
>>>> on the PositionalStateContainer mechanism described above to position
>>>> the shadow projectors to coincide with the osg::Light. Not using the
>>>> osg::Light will not trigger this mechanism.
>>>>
>>>> At the moment I'm leaning toward solution 2, but then that would force
>>>> me to adapt the shadowing class (which I inherited and it isn't
>>>> pretty). I would like to get solution 1 to work though, but I can't
>>>> figure out a way to use the osg::Light/LightSource interface and
>>>> prevent it from calling the opengl fixed function API. It would be
>>>> nice if all the osg::Light methods were virtual, then I could just
>>>> derive my LightUniforms based class from osg::Light.
>>>>
>>>> I did read in the OSG QSG, page 69:
>>>>
>>>> "OSG lets you use more light sources than the underlying OpenGL
>>>> implementation supports, but this is beyond the scope of this book."
>>>>
>>>> Is there another resource whose scope this isn't beyond? Does this
>>>> have to do with multiple RenderStages, which I suspect is in the
>>>> osgmanylights example?
>>>>
>>>> Thanks,
>>>> Chris
>>>>
>>>>
>>>>
>>>> On Tue, Nov 18, 2008 at 8:05 PM, Tomlinson, Gordon
>>>> <[email protected]>  wrote:
>>>>>
>>>>> Search the mailing list archive will find many illuminating answers to
>>>>> this
>>>>> type of question
>>>>>
>>>>> Opengl only supports 8 active light sources thus OSG supports one 8
>>>>> active
>>>>> light sources
>>>>>
>>>>> Also search the Opengl sites for more enlightenment
>>>>>
>>>>>
>>>>> Gordon
>>>>>
>>>>> __________________________________________________________
>>>>> Gordon Tomlinson
>>>>>
>>>>> Product Manager 3D
>>>>> Email  : gtomlinson @ overwatch.textron.com
>>>>> __________________________________________________________
>>>>> (C): (+1) 571-265-2612
>>>>> (W): (+1) 703-437-7651
>>>>>
>>>>> "Self defence is not a function of learning tricks
>>>>> but is a function of how quickly and intensely one
>>>>> can arouse one's instinct for survival"
>>>>> - Master Tambo Tetsura
>>>>>
>>>>>
>>>>>
>>>>> ________________________________
>>>>> From: [email protected]
>>>>> [mailto:[email protected]] On Behalf Of dasari
>>>>> pavan kumar
>>>>> Sent: Tuesday, November 18, 2008 12:50 PM
>>>>> To: [email protected]
>>>>> Subject: Re: [osg-users] Multiple lights in a scene
>>>>>
>>>>> Hi,
>>>>>       I am relatively new to using Lights in openscenegraph. I would
>>>>> like to
>>>>> have a single light replicated 100 times at different places (The
>>>>> situation
>>>>> is something like this. I need to light all the rooms in an apartment.
>>>>> however every light is of the same ambient and diffuse color). But the
>>>>> lights are not being rendered in the scene. Can anyone help me with this
>>>>> situation ?
>>>>>
>>>>> I have created a LightSource with certain light properties and attached
>>>>> it
>>>>> to a group.
>>>>>
>>>>> Now I created different MatrixTransforms and added this lightGroup to
>>>>> these
>>>>> MTs as child.
>>>>>
>>>>> However cant see the result. If this is not the way it is to be done,
>>>>> plzz
>>>>> help me out with the solution.
>>>>>
>>>>> thanx in advance,
>>>>> pavan
>>>>>
>>>>>
>>>>> --
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> 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
>>>>
>>>
>>>
>>> --
>>> ______________________________________________________
>>> Jean-Sebastien Guay    [email protected]
>>>                               http://www.cm-labs.com/
>>>                    http://whitestar02.dyndns-web.com/
>>> _______________________________________________
>>> 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

Reply via email to