Hi, Guillaume. there are two ways possible: 1 - write shader. 2 - two pass render, first pass with disabled lighting, second with depth func = EQUAL, with multiplicative blend (blend func (DST_COLOR, ZERO) or (ZERO, SRC_COLOR) ) and disabled texturing. This way may not work well with transparent geometry.
Cheers, Sergey. 08.09.2011, 11:21, "Guillaume Stuber" <[email protected]>: > Hi everyone, > > I am currently trying to set two textures on a geometry. To mix both textures > I use a texEnvCombine with INTERPOLATE. That is how I did that: > > Code: > > //Initialize and Set the first texture. > osg::Texture2D* tex = new osg::Texture2D(osgDB::readImageFile("im1.jpg")); > tex->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR_MIPMAP_LINEAR); > tex->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR); > tex->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT); > tex->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT); > geode->getOrCreateStateSet()->setTextureAttributeAndModes(0, tex, > osg::StateAttribute::ON); > > //I use a texmat to repeat the texture ten times. > osg::TexMat* texmat = new osg::TexMat(osg::Matrix::scale(10,10,1.0)); > geode->getOrCreateStateSet()->setTextureAttributeAndModes(0, texmat); > > //I configure my texEnvCombine. > osg::TexEnvCombine* texEnv = new osg::TexEnvCombine(); > texEnv->setCombine_RGB(osg::TexEnvCombine::INTERPOLATE); > texEnv->setSource0_RGB(osg::TexEnvCombine::PREVIOUS); > texEnv->setOperand0_RGB(osg::TexEnvCombine::SRC_COLOR); > texEnv->setSource1_RGB(osg::TexEnvCombine::TEXTURE); > texEnv->setOperand1_RGB(osg::TexEnvCombine::SRC_COLOR); > texEnv->setSource2_RGB(osg::TexEnvCombine::PRIMARY_COLOR); > texEnv->setOperand2_RGB(osg::TexEnvCombine::SRC_COLOR); > geode->getOrCreateStateSet()->setTextureAttribute(1, texEnv); > > // And I set my second texture. > osg::Texture2D* tex2 = new osg::Texture2D(osgDB::readImageFile("im2.jpg")); > tex2->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR_MIPMAP_LINEAR); > tex2->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR); > tex2->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT); > tex2->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT); > geode->getOrCreateStateSet()->setTextureAttributeAndModes(1, tex2, > osg::StateAttribute::ON); > geode->getOrCreateStateSet()->setTextureAttributeAndModes(1, texmat); > > With that code it works perfectly when I set GL_LIGHTING to OFF on the geode. > But when I put the lights on, it has issues. In fact it is logical issues: > - My combine is set to INTERPOLATION, that's why the mixing will follow the > function: Arg0*Arg2 + Arg1*(1 - Arg2) > - Here Arg0 is my first texture (PREVIOUS), Arg1 is my second one (TEXTURE) > and the weight Arg2 is the PRIMARY_COLOR which is different at each place of > my geometry. > - That's why it will return bad results when I have lights: the PRIMARY_COLOR > will change with them (example: according to the function, all shadowed area > will automatically set more of the second texture and vice versa.) > > Which brings me to my question: > Is there a way to disable the light just for this combination ? > > Thank you. > > Guillaume[/code] > > ------------------ > Read this topic online here: > http://forum.openscenegraph.org/viewtopic.php?p=42518#42518 > > _______________________________________________ > 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

