Further FBO support work.

This commit is contained in:
Robert Osfield
2005-06-16 14:01:38 +00:00
parent 1641cd7b54
commit c5cad6982e
6 changed files with 86 additions and 272 deletions

View File

@@ -304,7 +304,7 @@ void FrameBufferObject::apply(State &state) const
if (_unsupported[contextID])
return;
FBOExtensions* ext = FBOExtensions::instance(contextID);
if (!ext->isSupported())
{

View File

@@ -1053,8 +1053,18 @@ void CullVisitor::apply(osg::CameraNode& camera)
{
// use render to texture stage.
// create the render to texture stage.
osg::ref_ptr<osgUtil::RenderToTextureStage> rtts = new osgUtil::RenderToTextureStage;
osg::ref_ptr<osgUtil::RenderToTextureStage> rtts = dynamic_cast<osgUtil::RenderToTextureStage*>(camera.getRenderingCache());
if (!rtts)
{
rtts = new osgUtil::RenderToTextureStage;
camera.setRenderingCache(rtts.get());
}
else
{
// reusing render to texture stage, so need to reset it to empty it from previous frames contents.
rtts->reset();
}
// set up lighting.
// currently ignore lights in the scene graph itself..
// will do later.
@@ -1064,8 +1074,10 @@ void CullVisitor::apply(osg::CameraNode& camera)
rtts->setClearColor(camera.getClearColor());
rtts->setClearMask(camera.getClearMask());
osg::Viewport* viewport = camera.getViewport()!=0 ? camera.getViewport() : previous_stage->getViewport();
// set up the viewport.
rtts->setViewport( camera.getViewport()!=0 ? camera.getViewport() : previous_stage->getViewport());
rtts->setViewport( viewport );
// set up to charge the same RenderStageLighting is the parent previous stage.
rtts->setRenderStageLighting(previous_stage->getRenderStageLighting());
@@ -1104,7 +1116,9 @@ void CullVisitor::apply(osg::CameraNode& camera)
default :
getCurrentRenderBin()->getStage()->addPostRenderStage(rtts.get());
break;
}
}
osg::Texture2D* tex = 0;
osg::CameraNode::BufferAttachmentMap& bufferAttachements = camera.getBufferAttachmentMap();
for(osg::CameraNode::BufferAttachmentMap::iterator itr = bufferAttachements.begin();
@@ -1114,11 +1128,31 @@ void CullVisitor::apply(osg::CameraNode& camera)
// if one exist attach texture to the RenderToTextureStage.
osg::Texture2D* texture2D = dynamic_cast<osg::Texture2D*>(itr->second._texture.get());
if (texture2D) rtts->setTexture(texture2D);
if (texture2D)
{
tex = texture2D;
rtts->setTexture(texture2D);
}
// if one exist attach image to the RenderToTextureStage.
if (itr->second._image.valid()) rtts->setImage(itr->second._image.get());
}
if (camera.getRenderTargetImplmentation()==osg::CameraNode::FRAME_BUFFER_OBJECT)
{
osg::ref_ptr<osg::FrameBufferObject> fbo = rtts->getFrameBufferObject();
if (!fbo)
{
fbo = new osg::FrameBufferObject;
rtts->setFrameBufferObject(fbo.get());
fbo->setAttachment(GL_COLOR_ATTACHMENT0_EXT, osg::FrameBufferAttachment(tex));
fbo->setAttachment(GL_DEPTH_ATTACHMENT_EXT, osg::FrameBufferAttachment(new osg::RenderBuffer(viewport->width(), viewport->height(), GL_DEPTH_COMPONENT24)));
}
}
}

View File

@@ -39,11 +39,18 @@ void RenderToTextureStage::draw(osg::State& state,RenderLeaf*& previous)
if (_stageDrawnThisFrame) return;
//cout << "begining RTTS draw "<<this<< " "<<_viewport->x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<<std::endl;
osg::FBOExtensions* fbo_ext = _fbo.valid() ? osg::FBOExtensions::instance(state.getContextID()) : 0;
if (fbo_ext)
{
_fbo->apply(state);
}
RenderStage::draw(state,previous);
// now copy the rendered image to attached texture.
if (_texture.valid())
if (_texture.valid() && !fbo_ext)
{
//cout << " reading "<<this<< " "<<_viewport->x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<<std::endl;
@@ -52,5 +59,10 @@ void RenderToTextureStage::draw(osg::State& state,RenderLeaf*& previous)
if (_image.valid())
_image->readPixels(_viewport->x(),_viewport->y(),_viewport->width(),_viewport->height(),_imageReadPixelFormat,_imageReadPixelDataType);
if (fbo_ext)
{
fbo_ext->glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
}