mp3butcher wrote: > I haven't noticed the introduction of osgVolume::VolumeScene. > It's a great feature. > But At first glance, it seams to use an other mecanism than osg::view slave > camera in order to copy matmodelview and matproj to the RTT camera...seams > managed via uniforms in programs > > Further it seams to use a program (volume_color_depth.frag) in order to copy > back texture stored color/depth to the framebuffer. > > So it bring me to the question: What is the best?: > 1)use Render to Texture and copy back with a fragment program > 2)use Render to renderbuffer and glBlitFrameBuffer to copyback > > ( > To return to my code: > i've to set camrea graphic context (i'm dumb) > And i put the blit on the maincamera predraw > And i put the camera as nested_render (bad but work) > I will post a nicer/cleaner code tomorrow to have your opinion > ) > > robertosfield wrote: > > Hi Julien, > > I am away from my computer so can't look at you whole post. You description > > it sound rather like the osgVolume::MultiPassTechnique now part of The > > svn/trunk version of the Osg. > > Robert On 28 Nov 2014 19:50, "Julien Valentin" < ()> wrote: > > > Hi, > > > In the frame of mixed geometry/volume rendering, i would like to create > > > depthtexture for a subgraph..this texture is used to stop forward raycast > > > of the volume. > > > In order to do that i would like to: > > > 1)Render subgraph in a fbo with 3 attachements > > > -depth to renderbuffer > > > -depth to texture > > > -color to renderbuffer > > > 2)Copy back depth and color render buffers from the fbo to the frame > > > buffer (using glblitframebuffer) > > > > > > > > > Here my current code > > > > > > Code: > > > > > > class OSGMULTIGRID_EXPORT RenderDepth2Texture : public osg::Group{ > > > public: > > > virtual bool addChild(osg::Node*n); > > > RenderDepth2Texture(); > > > /** Copy constructor using CopyOp to manage deep vs > > > shallow copy.*/ > > > > > > > > > inline osg::Texture2D*getDepthTexture()const{ return > > > _depthtexture; } > > > inline osg::Uniform*getDepthResolutionUniform()const{ > > > return _rdx; } > > > void setRasterizationResolution(const osg::Vec2ui&); > > > const osg::Vec2ui & getRasterizationResolution()const { > > > return _resolution; } > > > > > > virtual void traverse(osg::NodeVisitor &nv); > > > osg::ref_ptr<osg::Texture2D> _depthtexture,_colortexture; > > > osg::Vec2ui _resolution; > > > osg::ref_ptr<osg::Camera> _camera; > > > osg::ref_ptr<osg::Uniform > _rdx; > > > }; > > > class PreDrawFBOCallback : public osg::Camera::DrawCallback > > > { > > > public: > > > PreDrawFBOCallback(osg::FrameBufferObject* fbo, > > > osg::FrameBufferObject* source_fbo, unsigned int width, unsigned int > > > height, osg::Texture2D *dt, osg::Texture2D *ct) : > > > _fbo(fbo), _source_fbo(source_fbo), _depthTexture(dt), > > > _colorTexture(ct), _width(width), _height(height) {} > > > > > > virtual void operator () (osg::RenderInfo& renderInfo) const > > > { > > > cerr << "PreDrawFBOCallback" << endl; > > > // switching only the frame buffer attachments is > > > actually faster than switching the framebuffer > > > #ifdef USE_PACKED_DEPTH_STENCIL > > > #ifdef USE_TEXTURE_RECTANGLE > > > > > > _fbo->setAttachment(osg::Camera::PACKED_DEPTH_STENCIL_BUFFER, > > > osg::FrameBufferAttachment((osg::TextureRectangle*)(_depthTexture.get()))); > > > #else > > > > > > _fbo->setAttachment(osg::Camera::PACKED_DEPTH_STENCIL_BUFFER, > > > osg::FrameBufferAttachment((osg::Texture2D*)(_depthTexture.get()))); > > > > > > _fbo->setAttachment(osg::Camera::PACKED_DEPTH_STENCIL_BUFFER, > > > osg::FrameBufferAttachment(new osg::RenderBuffer(_width, _height, > > > GL_DEPTH24_STENCIL8_EXT)));// A16))); > > > #endif > > > #else > > > #ifdef USE_TEXTURE_RECTANGLE > > > _fbo->setAttachment(osg::Camera::DEPTH_BUFFER, > > > osg::FrameBufferAttachment((osg::TextureRectangle*)(_depthTexture.get()))); > > > #else > > > _fbo->setAttachment(osg::Camera::DEPTH_BUFFER, > > > osg::FrameBufferAttachment(_depthTexture.get()));// > > > osg::FrameBufferAttachment(new osg::RenderBuffer(_width, _height, > > > GL_RGBA16))); > > > #endif > > > #endif > > > #ifdef USE_TEXTURE_RECTANGLE > > > _fbo->setAttachment(osg::Camera::COLOR_BUFFER0, > > > osg::FrameBufferAttachment((osg::TextureRectangle*)(_colorTexture.get()))); > > > #else > > > _fbo->setAttachment(osg::Camera::COLOR_BUFFER0, > > > osg::FrameBufferAttachment((_colorTexture.get())));// > > > osg::FrameBufferAttachment(new osg::RenderBuffer(_width, _height, > > > GL_DEPTH_COMPONENT16_ARB))); > > > > > > _fbo->setAttachment(osg::Camera::COLOR_BUFFER, > > > osg::FrameBufferAttachment(new osg::RenderBuffer(_width, _height, > > > GL_RGBA)));// A16))); > > > #endif > > > /* > > > // check if we need to do some depth buffer copying from > > > a source FBO into the current FBO > > > if (_source_fbo.get() != NULL) > > > { > > > osg::FBOExtensions* fbo_ext = > > > osg::FBOExtensions::instance(renderInfo.getContextID(), true); > > > bool fbo_supported = fbo_ext && fbo_ext->isSupported(); > > > if (fbo_supported && fbo_ext->glBlitFramebuffer) > > > { > > > // blit the depth buffer from the solid geometry fbo into > > > the current transparency fbo > > > (_fbo.get())->apply(*renderInfo.getState(), > > > osg::FrameBufferObject::DRAW_FRAMEBUFFER); > > > (_source_fbo.get())->apply(*renderInfo.getState(), > > > osg::FrameBufferObject::READ_FRAMEBUFFER); > > > > > > // glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); // > > > only needed to blit the color buffer > > > // glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); // > > > only needed to blit the color buffer > > > fbo_ext->glBlitFramebuffer( > > > 0, 0, static_cast<GLint>(_width), > > > static_cast<GLint>(_height), > > > 0, 0, static_cast<GLint>(_width), > > > static_cast<GLint>(_height), > > > #ifdef USE_PACKED_DEPTH_STENCIL > > > GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); > > > #else > > > GL_DEPTH_BUFFER_BIT, GL_NEAREST); > > > #endif > > > (_fbo.get())->apply(*renderInfo.getState(), > > > osg::FrameBufferObject::READ_FRAMEBUFFER); > > > (_fbo.get())->apply(*renderInfo.getState(), > > > osg::FrameBufferObject::DRAW_FRAMEBUFFER); > > > } > > > }*/ > > > // switch to this fbo, if it isn't already bound > > > (_fbo.get())->apply(*renderInfo.getState());// , > > > osg::FrameBufferObject::READ_FRAMEBUFFER); > > > //(_fbo.get())->apply(*renderInfo.getState(), > > > osg::FrameBufferObject::DRAW_FRAMEBUFFER); > > > } > > > protected: > > > osg::ref_ptr<osg::FrameBufferObject> _fbo; > > > osg::ref_ptr<osg::FrameBufferObject> _source_fbo; > > > osg::ref_ptr<osg::Texture2D> _depthTexture; > > > osg::ref_ptr<osg::Texture2D> _colorTexture; > > > unsigned int _width; > > > unsigned int _height; > > > }; > > > > > > > > > class PostDrawFBOCallback : public osg::Camera::DrawCallback > > > { > > > public: > > > PostDrawFBOCallback(osg::FrameBufferObject* fbo, > > > osg::FrameBufferObject* source_fbo, unsigned int width, unsigned int > > > height, osg::Texture *dt, osg::Texture *ct) : > > > _fbo(fbo), _width(width), _height(height) { > > > // in order to select FrameBuffer instead of FBO > > > _dummyfbo = new osg::FrameBufferObject(); > > > } > > > virtual void operator () (osg::RenderInfo& renderInfo) const > > > { > > > cerr << "PostDrawFBOCallback" << endl; > > > osg::FBOExtensions* fbo_ext = > > > osg::FBOExtensions::instance(renderInfo.getContextID(), false); > > > > > > > > > > > > (_fbo.get())->apply(*renderInfo.getState(), > > > osg::FrameBufferObject::READ_FRAMEBUFFER); > > > (_dummyfbo.get())->apply(*renderInfo.getState(), > > > osg::FrameBufferObject::DRAW_FRAMEBUFFER); > > > //same as glBind(GL_DRAW_FRAMEBUFFER,0); > > > > > > fbo_ext->glBlitFramebuffer( > > > 0, 0, static_cast<GLint>(_width), > > > static_cast<GLint>(_height), > > > 0, 0, static_cast<GLint>(_width), > > > static_cast<GLint>(_height), > > > GL_COLOR_BUFFER_BIT, GL_NEAREST); > > > > > > fbo_ext->glBlitFramebuffer( > > > 0, 0, static_cast<GLint>(_width), > > > static_cast<GLint>(_height), > > > 0, 0, static_cast<GLint>(_width), > > > static_cast<GLint>(_height), > > > #ifdef USE_PACKED_DEPTH_STENCIL > > > GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, > > > GL_NEAREST); > > > #else > > > GL_DEPTH_BUFFER_BIT, GL_NEAREST); > > > #endif > > > > > > ///restore fbo > > > (_dummyfbo.get())->apply(*renderInfo.getState(), > > > osg::FrameBufferObject::READ_FRAMEBUFFER); > > > > > > > > > } > > > protected: > > > bool _restore; > > > protected: > > > osg::ref_ptr<osg::FrameBufferObject> _fbo, _dummyfbo; > > > > > > unsigned int _width; > > > unsigned int _height; > > > }; > > > > > > RenderDepth2Texture::RenderDepth2Texture() :osg::Group() > > > { > > > > > > _camera = new osg::Camera(); > > > _camera->setClearColor(osg::Vec4(0, 1, 0, 1)); > > > _camera->setClearDepth(1); > > > > > > _camera->setAllowEventFocus(false); > > > > > > setCullingActive(false); > > > > > > > > > _rdx = new osg::Uniform(); > > > _rdx->setName("rviewport"); > > > _rdx->setType(osg::Uniform::FLOAT_VEC2); > > > > > > _resolution = osg::Vec2ui(0, 0); > > > _rdx->set(osg::Vec2f(1.0f / (float)_resolution.x(), 1.0f / > > > (float)_resolution.y())); > > > _colortexture = new osg::Texture2D(); > > > > > > _colortexture->setInternalFormat(GL_RGBA);// > > > GL_DEPTH_COMPONENT32_ARB perhaps ARB should be cool > > > _colortexture->setSourceFormat(GL_RGBA);//RGBA > > > _colortexture->setSourceType(GL_UNSIGNED_BYTE);//don give a shit > > > cause its not client data > > > > > > _colortexture->setDataVariance(osg::Texture2D::DYNAMIC); > > > _colortexture->setFilter(osg::Texture2D::MIN_FILTER, > > > osg::Texture2D::NEAREST); > > > _colortexture->setFilter(osg::Texture2D::MAG_FILTER, > > > osg::Texture2D::NEAREST); > > > > > > _depthtexture = new osg::Texture2D(); > > > > > > _depthtexture->setInternalFormat(GL_DEPTH_COMPONENT16_ARB);// > > > GL_DEPTH_COMPONENT32_ARB perhaps ARB should be cool > > > _depthtexture->setSourceFormat(GL_DEPTH_COMPONENT);//RGBA > > > _depthtexture->setSourceType(GL_UNSIGNED_BYTE);//don give a shit > > > cause its not client data > > > > > > _depthtexture->setDataVariance(osg::Texture2D::DYNAMIC); > > > _depthtexture->setFilter(osg::Texture2D::MIN_FILTER, > > > osg::Texture2D::NEAREST); > > > _depthtexture->setFilter(osg::Texture2D::MAG_FILTER, > > > osg::Texture2D::NEAREST); > > > #ifdef USE_PACKED_DEPTH_STENCIL > > > _depthtexture->setInternalFormat(GL_DEPTH24_STENCIL8_EXT); > > > _depthtexture->setSourceFormat(GL_DEPTH_STENCIL_EXT); > > > _depthtexture->setSourceType(GL_UNSIGNED_INT_24_8_EXT); > > > #else > > > _depthtexture->setInternalFormat(GL_DEPTH_COMPONENT); > > > #endif > > > > > > > > > > > > } > > > > > > > > > void RenderDepth2Texture::setRasterizationResolution(const osg::Vec2ui& > > > size) > > > { > > > _resolution = size; _rdx->set(osg::Vec2f(1.0f / > > > (float)_resolution.x(), 1.0f / (float)_resolution.y())); > > > _rdx->dirty(); > > > > > > _depthtexture->setTextureSize(_resolution.x(), _resolution.y()); > > > _colortexture->setTextureSize(_resolution.x(), _resolution.y()); > > > _colortexture->dirtyTextureObject(); > > > _depthtexture->dirtyTextureObject(); > > > > > > > > > } > > > bool RenderDepth2Texture::addChild(osg::Node*n){ > > > osg::Group::addChild(n);//dummy node for serialisaetion > > > return _camera->addChild(n);//real one > > > } > > > void RenderDepth2Texture::traverse(osg::NodeVisitor &nv) > > > { > > > // record the traversal mask on entry so we can reapply it later. > > > unsigned int traversalMask = nv.getTraversalMask(); > > > if (nv.getVisitorType() == osg::NodeVisitor::CULL_VISITOR) > > > { > > > osgUtil::CullVisitor* cv = > > > dynamic_cast<osgUtil::CullVisitor*>(&nv); > > > osg::Camera*cam = cv->getCurrentCamera(); > > > osg::Camera::Attachment attach = > > > cam->getBufferAttachmentMap()[osg::Camera::DEPTH_BUFFER]; > > > > > > unsigned int w, h; > > > w = cam->getViewport()->width(); > > > h = cam->getViewport()->height(); > > > > > > if (getRasterizationResolution() != osg::Vec2ui(w, h)){ > > > //no texture resoltuion changes fuck the stuff.. > > > _resolution > > > setRasterizationResolution > > > (osg::Vec2ui(w, h)); > > > //_camera = > > > (osg::Camera*)cam->clone(osg::CopyOp::DEEP_COPY_ALL); > > > osg::ref_ptr<osg::FrameBufferObject> fbo = new > > > osg::FrameBufferObject(); > > > _camera->setViewport(cam->getViewport()); > > > > > > _camera->setClearColor(osg::Vec4(0, 1, 0, 0)); > > > _camera->setClearDepth(1.0f); > > > #ifndef USE_PACKED_DEPTH_STENCIL > > > _camera->setClearMask(GL_DEPTH_BUFFER_BIT | > > > GL_COLOR_BUFFER_BIT); > > > #else > > > _camera->setClearMask(GL_DEPTH_BUFFER_BIT | > > > GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); > > > #endif > > > _camera->setPreDrawCallback(new > > > PreDrawFBOCallback(fbo, 0, w, h, _depthtexture, _colortexture)); > > > _camera->setFinalDrawCallback(new > > > PostDrawFBOCallback(fbo, 0, w, h, 0, 0)); > > > > > > > > > cam->getView()->addSlave(_camera, false); > > > /*for (int i = 0; i < getNumChildren(); i++) > > > _camera->addChild(getChild(i)); > > > */ > > > > > > _camera->dirtyBound(); > > > this->dirtyBound(); std::cerr << "ATTACHING DEPTH > > > TARGET TO CAMERA" << _camera->getNumChildren() << endl; > > > > > > } > > > > > > > > > > > > nv.apply(*_camera.get()); > > > > > > > > > > > > } > > > else nv.apply(*_camera.get()); > > > > > > } > > > > > > > > > > > > I took osgdepthpeeling as an example but i may missed something because > > > it s no working....I only getback the FBO clearColor to FrameBuffer as > > > if _camera haven't any children drawn ... > > > Note that I overload Group and delegate traversal to _camera...It's the > > > only way i found to retrieve the main view... > > > It's the first time I use a slave camera ...is there something i missed > > > All help is welcome > > > > > > Thank you! > > > > > > Cheers, > > > Julien [/code] > > > > > > ------------------ > > > Read this topic online here: > > > http://forum.openscenegraph.org/viewtopic.php?p=61914#61914 > > > (http://forum.openscenegraph.org/viewtopic.php?p=61914#61914) > > > > > > > > > > > > > > > > > > _______________________________________________ > > > osg-users mailing list > > > () > > > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > > (http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org) > > > > > > > > > ------------------ > > Post generated by Mail2Forum >
------------------ Read this topic online here: http://forum.openscenegraph.org/viewtopic.php?p=61917#61917 _______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org