From add6b3edee3924624d5f213ac318408db2072915 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 15 Mar 2018 16:49:58 +0000 Subject: [PATCH] Added --shader saderfilename command line option to enable one to manually specify which shaders to use for the uber program. --- examples/osgshadergen/osgshadergen.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/examples/osgshadergen/osgshadergen.cpp b/examples/osgshadergen/osgshadergen.cpp index f57eed04e..a482836f1 100644 --- a/examples/osgshadergen/osgshadergen.cpp +++ b/examples/osgshadergen/osgshadergen.cpp @@ -112,7 +112,13 @@ int main(int argc, char** argv) // add the screen capture handler viewer.addEventHandler(new osgViewer::ScreenCaptureHandler); - + osg::ref_ptr uberProgram = new osg::Program; + std::string shaderFilename; + while(arguments.read("--shader", shaderFilename)) + { + osg::ref_ptr shader = osgDB::readShaderFile(shaderFilename); + if (shader.valid()) uberProgram->addShader(shader.get()); + } std::string outputFilename; if (arguments.read("-o", outputFilename)) {} @@ -125,10 +131,23 @@ int main(int argc, char** argv) return 1; } + osg::ref_ptr rootStateSet = viewer.getCamera()->getStateSet(); + // run the shadergen on the loaded scene graph, and assign the uber shader osgUtil::ShaderGenVisitor shadergen; - shadergen.assignUberProgram(viewer.getCamera()->getStateSet()); - //shadergen.assignUberProgram(loadedModel->getOrCreateStateSet()); + + if (uberProgram->getNumShaders()>0) + { + rootStateSet->setAttribute(uberProgram.get()); + rootStateSet->addUniform(new osg::Uniform("diffuseMap", 0)); + + shadergen.remapStateSet(rootStateSet.get()); + } + else + { + shadergen.assignUberProgram(rootStateSet.get()); + } + loadedModel->accept(shadergen); if (!outputFilename.empty())