Am 29.08.2014 um 11:28 schrieb Fabrizio Bazzurri <[email protected]>:

> Hi,
> 
> I'm having a problem in my custom shader while updating my texture2D using 
> image->dirty() function. Following there is the relevant code snippet. 
> 
> 
> Code:
> 
> osg::StateSet* stateset = geom1->getOrCreateStateSet();
> 
> osg::ref_ptr<osg::Program> program = new osg::Program;
> osg::ref_ptr<osg::Shader> vertexSource = new osg::Shader(osg::Shader::VERTEX);
> osg::ref_ptr<osg::Shader> fragmentSource = new 
> osg::Shader(osg::Shader::FRAGMENT);
> 
> vertexSource->setShaderSource(vert);
> fragmentSource->setShaderSource(frag);
> 
> program->addShader(vertexSource);
> program->addShader(fragmentSource);
> 
> stateset->setAttributeAndModes(program.get());
> stateset->setDataVariance(osg::Object::DYNAMIC);
> 
> ////
> osg::ref_ptr<osg::Image> diffuseImage = osgDB::readImageFile(".\\img0.png");
> std::cout << " File " << diffuseImage->getFileName() << " " << std::endl; // 
> it prints img0
> 
> osg::ref_ptr<osg::Texture2D> diffuseTex = new osg::Texture2D;
> diffuseTex->setDataVariance(osg::Object::DYNAMIC);
> diffuseTex->setImage(diffuseImage.get());
> 
> stateset->setTextureAttributeAndModes(0, diffuseTex.get(), 
> osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
> 
> osg::ref_ptr<osg::Uniform> cDiffTex = new 
> osg::Uniform(osg::Uniform::SAMPLER_2D, "cDiffTex");
> cDiffTex->set(0);
> stateset->addUniform(cDiffTex.get());
> 

Here you create a new image, your texture refers still to the old one. Load the 
file into a second image and copy the data into your diffuseImage. Compare the 
pointer of texture->getImage and diffuseImage, they point to different objects. 

> diffuseImage = osgDB::readImageFile(".\\img1.jpg");
> diffuseImage->dirty();
> std::cout << " File " << diffuseImage->getFileName() << " " << std::endl; // 
> it prints img1->GOOD the diffuseImage is updated
> std::cout << " Tex " << diffuseTex->getImage()->getFileName() << " " << 
> std::endl; // it prints img0->BAD the image object of texture is not updated
> // NEED TO TELL TEXTURE TO SET THE IMAGE TO HAVE IT UPDATED
> //diffuseTex->setImage(diffuseImage);
> //std::cout << " Tex " << diffuseTex->getImage()->getFileName() << " " << 
> std::endl;
> 

Ressource-wise it’s better to have one texture holding one image as using 
multiple textures using one image.

cheers,

Stephan

_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to