Hi Bob,

Hi all, I’m trying to figure out the best method to pass per vertex “attributes” to shaders using osg and I can’t seem to find many examples of attribute use. My guess is there’s a reason for that and I should probably code up a uniform array of some kind instead.

There's no reason other than no example has been made yet.

Mike Weiblen's osgtoy-data repository has a compactdisc.osg file that shows that attributes work. It's a single .osg file that contains the model and the shaders to show a compact disc with the color diffraction effect (different colors visible depending on the viewing angle).

There's also a compactdisc-texcoord.osg file that does the same thing using one of the texcoord arrays. That's always an option, btw, you can just co-opt one of the unused arrays from the fixed pipeline (like texcoord for texture unit 1 if your model uses a single texture on unit 0).

Of course having a data file that has attributes won't show you how to use them in your program, and how to update them when you need to, but at least it proves that they're usable.

I need to pass “thickness” as an “attribute” and that varies with the geometry / osg::Geode.

Does it vary based on the geode, or on the geometry's vertices? The sentence above is very ambiguous. If you need just one value per geode, you can perfectly well use a single uniform. Attributes are for when things vary per vertex.

I’ve studied the osg::Drawable and its attribute types, and the osg::Program and its addBindAttribLocation, but I can’t find any examples of the callback or other mechanism to actually get the data set into the attributes from the scenegraph.

Well, that's because it's kind of up to you. Once you've set your attribute array in the geometry object, and called addBindAttribLocation to tell the program that a given attribute location potentially has data in it, you can fill in the data however you like. If your attributes don't change you can set them once at startup. If they vary per frame then you'll want to either put an update callback somewhere or break up your frame loop and then do your calculations there. (I personally prefer update callbacks, that way a given node can do all the work it has to do without needing to modify any other parts of the program, but that's just a preference)

Hope this helps,

J-S
--
______________________________________________________
Jean-Sebastien Guay    [email protected]
                               http://www.cm-labs.com/
                        http://whitestar02.webhop.org/
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to