Hi Julien, The osg-sumbissions list is for code submissions not general support. You question is very much general support.
The dirty() *is* required as the image could be attached to any Texture in the scene graph, not the texture that that you have read from. Your hacks for changing the current binding are bit perverse. If you have a 1D texture then you can only read 1D data from it. The osg::Image looks correct to me. Robert. On 12 November 2014 16:02, Julien Valentin <[email protected]> wrote: > Hi, > I just implement a kind of dirty texture read back node and ran into > several problems: > As you can notice in the attached code, I had a problem with > Image::readImageFromCurrentTexture. > I have would like to read back a 2D texture but as a 1D texture is binded > too it the 1D->2d->3d->cubemap priority scheme in osg::Image > ( GLenum textureMode = binding1D ? GL_TEXTURE_1D : binding2D ? > GL_TEXTURE_2D : binding3D ? GL_TEXTURE_3D : binding2DArray ? > GL_TEXTURE_2D_ARRAY_EXT : 0; > ) > force me to disable the 1D binding. > My proposal would be to make textureMode a parameter of > readImageFromCurrentTexture. > Further I suggest to remove Image::dirty() at the end of > readImageFromCurrentTexture (as image is read from the actual texture i > don't think it usefull to make it dirty, but i may miss a usecase) > > > Code: > > class ImageReadBackNode:public osg::Group{ > > void ImageReadBackNode::setTexture(osg::Texture*tex){ > //assert(tex->getImage()); > class ImageReadBackNodeCallback : public osg::Camera::DrawCallback > { > osg::Texture *_texture; osg::Node *_n; > public: > ImageReadBackNodeCallback(osg::Texture3D *texture, > osg::Node*toremove) :_texture(texture), _n(toremove){ }; > > virtual void operator () (osg::RenderInfo& renderInfo) > const > { > // get OpenGL driver to create texture from image. > _texture->apply(*renderInfo.getState()); > /// > glBindTexture(GL_TEXTURE_1D, 0); > // restore the original setting > glDisable(GL_TEXTURE_1D); > > _texture->getImage()->readImageFromCurrentTexture(renderInfo.getContextID(),true,GL_FLOAT); > > glEnable(GL_TEXTURE_1D); > > > ///Node self removal in drawthread (dirty but seams to works:/ ..) > std::list<osg::Group*> gr; > for (int i = 0; i < _n->getNumParents(); > i++)gr.push_back((_n->getParent(i))); > for (std::list<osg::Group*>::iterator it = > gr.begin(); it != gr.end(); it++) > (*it)->removeChild(_n); > > } > }; > osg::ref_ptr<osg::Camera > cam = new osg::Camera(); > cam->setFinalDrawCallback(new ImageReadBackNodeCallback(tex,this)); > this->addChild(cam); > > } > }; > > > > Thank you! > Any advice would be welcome > Cheers, > Julien > Code: > > > [/code] > > ------------------ > Read this topic online here: > http://forum.openscenegraph.org/viewtopic.php?p=61592#61592 > > > > > > _______________________________________________ > osg-submissions mailing list > [email protected] > > http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org >
_______________________________________________ osg-submissions mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
