Hi Sebastian, Thank you for sorting it out for me. Now the shader shows the texture, but only for texture-unit 0, so I only get specular texture as your code show.
I do also wondering how I proceed with Image Based Lighting. Do I assign the material above other materials in the scene to "illuminate" them or any other approach? Kind regards Patrik On Tue, May 13, 2014 at 12:16 PM, Sebastian Messerschmidt < [email protected]> wrote: > Hi Partrik, > > It was the setup of the textures and samplers: > Try > > ss->setTextureAttributeAndModes(0, tex, osg::StateAttribute::ON ); //bind > the texture to texture unit 0 > ss->setTextureAttributeAndModes(1, tex, osg::StateAttribute::ON ); > //you propably want to add a different texture for specular for texture > unit 1 > > > ss->setAttributeAndModes( program, osg::StateAttribute::ON ); > osg::Uniform* baseColor = new osg::Uniform( "BaseColor", > osg::Vec3(1.0, 0.4, 0.6) ); > osg::Uniform* specular = new osg::Uniform( "SpecularPercent", > 1.0f); > osg::Uniform* diffuse = new osg::Uniform( "DiffusePercent", 0.5f); > //osg::Uniform* specEnvMap = new > osg::Uniform(osg::Uniform::SAMPLER_CUBE,"SpecularEnvMap"); > osg::Uniform* specEnvMap = new osg::Uniform("SpecularEnvMap", 0); > //sampler for unit 0 > //specEnvMap->set(tex); > //osg::Uniform* diffEnvMap = new > osg::Uniform(osg::Uniform::SAMPLER_CUBE, "DiffuseEnvMap"); //The uniform is > smart enough to create a correct sampler object using the texture type > osg::Uniform* diffEnvMap = new osg::Uniform("DiffuseEnvMap", > 1);//sampler for unit 1 > //diffEnvMap->set(tex); > > > > ss->addUniform( baseColor ); > ss->addUniform( specular ); > ss->addUniform( diffuse ); > ss->addUniform( specEnvMap ); > ss->addUniform( diffEnvMap ); > > > Thank you Sebastian! > > > On Tue, May 13, 2014 at 11:18 AM, Sebastian Messerschmidt < > [email protected]> wrote: > >> Hi Patrik, >> >> Simply attach the code (probably compress it with zip) so others might >> check on this too. >> >> Hi Sebastian, >> >> I have dig down and find the resolution of the OpenGL error, I passed >> an int or double instead of a float into the shader. There is something >> strange with how I assign the texture, I rewrote it as >> >> [code] >> osg::Uniform* specEnvMap = new >> osg::Uniform(osg::Uniform::SAMPLER_CUBE,"SpecularEnvMap"); >> specEnvMap->set(tex); >> osg::Uniform* diffEnvMap = new osg::Uniform(osg::Uniform::SAMPLER_CUBE, >> "DiffuseEnvMap"); >> diffEnvMap->set(tex); >> [/code] >> >> To make sure that it is of type sampleCube. >> >> I could upload all code, since I'm trying to write a minimal program >> which demonstrates Image Based Lighting. It is two files, one header and >> one cpp, in total 170 lines. Would that be of any help? >> >> kind regards >> Patrik >> >> >> On Tue, May 13, 2014 at 11:04 AM, Sebastian Messerschmidt < >> [email protected]> wrote: >> >>> Hi Patrik, >>> >>> >>> Okay, I've digged a bit deeper into your code. Somehow your code to add >>> the textures seems awkward. You are assigning the cubemap to the first >>> texture unit and create 3 uniforms to texture unit 0. >>> It is hard to tell what is going wrong on your side, given that small >>> piece of code, but since you get an OpenGL error you should chase it down. >>> It might be related to binding the texture to multiple sampler objects on >>> the same texture unit. Try to step back and bind the cubemap to a simple >>> program with exactly one cubemap sampler and do some debugging with a >>> simple cubemapping shader. >>> There is a osgcubemap example which you could extend to use shaders >>> (beware that TexGen will not work with shaders, so you will have to write >>> your own in the vertex shader, which is not complicated though) >>> >>> I don't know the specific example you are referring to, so I cannot >>> really give your more pointers unless you prepare a small compiling >>> example. >>> >>> Hi Sebastian, >>> >>> Yes, that works as well, the sphere is red. >>> >>> cheers >>> Patrik >>> >>> >>> On Tue, May 13, 2014 at 10:32 AM, Sebastian Messerschmidt < >>> [email protected]> wrote: >>> >>>> Hi Patrik, >>>> >>>> Hi Sebastian, >>>> >>>> The baseColor is applied to the sphere, so I can see my shader is in >>>> use. No differences when using osgShadow or not. >>>> >>>> Yes because it is the first texture unit. Fixed function pipeline and >>>> osgShadow will handle it. Please follwo my advice and change the output of >>>> the fragment shader to >>>> gl_FragColor = vec4(1,0,0,1) or gl_FragData[0] = vec4(1,0,0,1) >>>> to see if it is _really_ your shader. >>>> >>>> cheers >>>> Sebastian >>>> >>>> >>>> Cheers >>>> Patrik >>>> >>>> >>>> On Tue, May 13, 2014 at 10:03 AM, Sebastian Messerschmidt < >>>> [email protected]> wrote: >>>> >>>>> Hi Patrick, >>>>> >>>>> from a glimpse it seems you are setting up the shader to the geode >>>>> while using osgShadow, which will override your shaders. >>>>> I guess you need to set the shaders at the shadowTechnique. Could you >>>>> try it without osgShadow or simply do some shader debugging by setting the >>>>> gl_FragColor to some debug value to see if your shader is used at all? >>>>> >>>>> cheers >>>>> Sebastian >>>>> >>>>> HI, >>>>> >>>>> I'm trying to implement Image Based Lighting in a scene. but I think >>>>> I miss something essential. >>>>> I have copied the fragment shader and vertex shader from the orange >>>>> book, ch 12/Image Based Lighting. Created a sphere which shall be the >>>>> emissive surface. >>>>> >>>>> When I run I receive following warning/error msg: >>>>> Warning: detected OpenGL error 'invalid operation' at After >>>>> Renderer::compile. >>>>> >>>>> The sphere is colored by the base-color, but it is not emissive. >>>>> What kind of attributes do I need to set to get it work, or should I make >>>>> things in a different order? See code below. >>>>> >>>>> Kind regards >>>>> Patrik >>>>> >>>>> This is the main code: >>>>> [code] >>>>> osgShadow::ShadowedScene* scene(new osgShadow::ShadowedScene()); >>>>> osgShadow::ShadowMap* sm(new osgShadow::ShadowMap()); >>>>> sm->setTextureSize(osg::Vec2s(512,512)); >>>>> scene->setShadowTechnique(sm); >>>>> osg::Group* root = new osg::Group; >>>>> osg::Geode* em = new osg::Geode(); >>>>> em->addDrawable(new osg::ShapeDrawable(new >>>>> osg::Sphere(osg::Vec3(0,0,0), 10.0) ) ); >>>>> osg::Geode* geode = new osg::Geode(); >>>>> geode->addDrawable(new osg::ShapeDrawable( new >>>>> osg::Cylinder(osg::Vec3(0,0,-3.0),10,0.2 >>>>> ) )) ; >>>>> geode->setCullingActive(true); >>>>> root->addChild(em); >>>>> root->addChild(geode); >>>>> scene->addChild(root); >>>>> osg::TextureCubeMap* tex = readCubeMap(); >>>>> >>>>> { >>>>> osg::StateSet* ss = em->getOrCreateStateSet(); >>>>> osg::Program* program = new osg::Program; >>>>> program->setName( "IBL" ); >>>>> program->addShader( new osg::Shader( osg::Shader::VERTEX, >>>>> IBLVertSource ) ); >>>>> program->addShader( new osg::Shader( osg::Shader::FRAGMENT, >>>>> IBLFragSource ) ); >>>>> >>>>> ss->setAttributeAndModes( program, osg::StateAttribute::ON ); >>>>> osg::Uniform* baseColor = new osg::Uniform( "BaseColor", >>>>> osg::Vec3(0.2, 0.4, 0.6) ); >>>>> osg::Uniform* specular = new osg::Uniform( "SpecularPercent", 0); >>>>> osg::Uniform* diffuse = new osg::Uniform( "DiffusePercent", 1.0); >>>>> osg::Uniform* specEnvMap = new osg::Uniform("SpecularEnvMap", 0); >>>>> osg::Uniform* diffEnvMap = new osg::Uniform( "DiffuseEnvMap", 0); >>>>> ss->setTextureAttributeAndModes(0, tex, osg::StateAttribute::ON ); >>>>> ss->addUniform( baseColor ); >>>>> ss->addUniform( specular ); >>>>> ss->addUniform( diffuse ); >>>>> ss->addUniform( specEnvMap ); >>>>> ss->addUniform( diffEnvMap ); >>>>> } >>>>> >>>>> viewer.setSceneData(scene); >>>>> viewer.run(); >>>>> [/code] >>>>> >>>>> >>>>> _______________________________________________ >>>>> osg-users mailing >>>>> [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 >>>> [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 >>> [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 >> [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 > [email protected]http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > > > > _______________________________________________ > osg-users mailing > [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

