Further FBO support work.
This commit is contained in:
@@ -304,7 +304,7 @@ void FrameBufferObject::apply(State &state) const
|
||||
|
||||
if (_unsupported[contextID])
|
||||
return;
|
||||
|
||||
|
||||
FBOExtensions* ext = FBOExtensions::instance(contextID);
|
||||
if (!ext->isSupported())
|
||||
{
|
||||
|
||||
@@ -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)));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user