HI Mark, I've previous used the ability of resizing images and it did have it working. I did require a bug fix, but this was done a while back.
Which version of the OSG are you using? Robert. On Thu, Dec 11, 2008 at 10:48 PM, Mark Sciabica <[email protected]> wrote: > Hello Robert, > > I have found a bug when assigning a new image to an existing texture that > already has an OpenGL texture object allocated. The problem appears to be > that Texture2D::apply is passing the wrong dimensions in to > applyTexImage2D_subload. Since the dimensions of the image don't match the > dimensions of the existing OpenGL texture object, subloading shouldn't even > be used. I therefore get the following error printed out on the console: > > Warning: detected OpenGL error 'invalid value' after RenderBin::draw(,) > > The dimensions of the Texture::TextureObject should be validated against the > data being loaded before calling subload, probably in the Texture*::apply > methods. > > Mark > > #include <osg/Texture2D> > #include <osg/Geometry> > > #include <osgViewer/Viewer> > #include <osgGA/TrackballManipulator> > > int main() > { > osg::ref_ptr<osg::Texture2D> texture1 = new osg::Texture2D; > static unsigned char bytes[16] = { > 0xff, 0x00, 0x00, 0xff, > 0x00, 0xff, 0x00, 0xff, > 0x00, 0x00, 0xff, 0xff, > 0xff, 0x00, 0xff, 0xff, > }; > osg::ref_ptr<osg::Image> imageRGB = new osg::Image; > imageRGB->setImage(3, 1, 1, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, > &bytes[0], osg::Image::NO_DELETE, 1); > osg::ref_ptr<osg::Image> imageRed = new osg::Image; > imageRed->setImage(1, 1, 1, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, > &bytes[0], osg::Image::NO_DELETE, 1); > osg::ref_ptr<osg::Image> imageGreen = new osg::Image; > imageGreen->setImage(1, 1, 1, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, > &bytes[4], osg::Image::NO_DELETE, 1); > osg::ref_ptr<osg::Image> imageBlue = new osg::Image; > imageBlue->setImage(1, 1, 1, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, > &bytes[8], osg::Image::NO_DELETE, 1); > > > osg::ref_ptr<osg::Geode> geode = new osg::Geode(); > osg::ref_ptr<osg::Geometry> geom = new osg::Geometry(); > geode->addDrawable(geom.get()); > > osg::ref_ptr<osg::Vec3Array> pVertices = new osg::Vec3Array; > pVertices->push_back( osg::Vec3(0, 0, 0) ); > pVertices->push_back( osg::Vec3(0, 0, 1) ); > pVertices->push_back( osg::Vec3(1, 0, 1) ); > pVertices->push_back( osg::Vec3(1, 0, 0) ); > geom->setVertexArray(pVertices.get()); > > osg::ref_ptr<osg::Vec2Array> pTexCoords = new osg::Vec2Array; > pTexCoords->push_back( osg::Vec2(0, 0) ); > pTexCoords->push_back( osg::Vec2(0, 1) ); > pTexCoords->push_back( osg::Vec2(1, 1) ); > pTexCoords->push_back( osg::Vec2(1, 0) ); > geom->setTexCoordArray(0, pTexCoords.get()); > osg::ref_ptr<osg::DrawArrays> pDrawArrays = new osg::DrawArrays(GL_QUADS, > 0, 4); > geom->addPrimitiveSet(pDrawArrays.get()); > > osg::StateSet* stateset = new osg::StateSet(); > stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF); > stateset->setTextureAttributeAndModes(0, texture1.get(), > osg::StateAttribute::ON); > geode->setStateSet( stateset ); > texture1->setImage(imageGreen.get()); > texture1->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE); > texture1->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE); > texture1->setResizeNonPowerOfTwoHint(false); > texture1->setFilter( osg::Texture::MAG_FILTER, osg::Texture::NEAREST ); > texture1->setFilter( osg::Texture::MIN_FILTER, osg::Texture::NEAREST ); > > > osg::ref_ptr<osgViewer::Viewer> viewer1 = new osgViewer::Viewer; > osg::ref_ptr<osgViewer::Viewer> viewer2 = new osgViewer::Viewer; > viewer1->setUpViewInWindow(20, 50, 200, 200); > viewer2->setUpViewInWindow(240, 300, 200, 200); > viewer1->setThreadingModel(osgViewer::ViewerBase::SingleThreaded); > viewer2->setThreadingModel(osgViewer::ViewerBase::SingleThreaded); > > viewer1->setSceneData( geode.get() ); > viewer2->setSceneData( geode.get() ); > > viewer1->setCameraManipulator(new osgGA::TrackballManipulator()); > viewer2->setCameraManipulator(new osgGA::TrackballManipulator()); > > int nFrame = 0; > while( viewer1.get() || viewer2.get() ) > { > if( viewer1.get() ) > { > if( !viewer1->done() ) > viewer1->frame(); > else > viewer1 = 0; > } > > texture1->setImage(imageRGB.get()); > if( viewer2.get() ) > { > if( !viewer2->done() ) > viewer2->frame(); > else > viewer2 = 0; > } > > ++nFrame; > } > > return 0; > } > > > _______________________________________________ > 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

