From Wojciech Lewandowski, support for FBO's without colour or depth attachments.
Note from Robert Osfield, I've temporarily re-enabled the old focing of of color and depth attachment to avoid regressions on some OpenGL driver. We'll revist this once we have a mechanism for controlling this override at runtime. #define FORCE_COLOR_ATTACHMENT 1 #define FORCE_DEPTH_ATTACHMENT 1
This commit is contained in:
@@ -386,11 +386,18 @@ void Camera::inheritCullSettings(const CullSettings& settings, unsigned int inhe
|
||||
{
|
||||
CullSettings::inheritCullSettings(settings, inheritanceMask);
|
||||
|
||||
if (inheritanceMask & CLEAR_COLOR)
|
||||
const Camera* camera = dynamic_cast<const Camera*>(&settings);
|
||||
if (camera)
|
||||
{
|
||||
//osg::notify(osg::NOTICE)<<"Inheriting slave Camera"<<std::endl;
|
||||
const Camera* camera = dynamic_cast<const Camera*>(&settings);
|
||||
_clearColor = camera->_clearColor;
|
||||
if (inheritanceMask & CLEAR_COLOR)
|
||||
_clearColor = camera->_clearColor;
|
||||
|
||||
if (inheritanceMask & DRAW_BUFFER)
|
||||
_drawBuffer = camera->_drawBuffer;
|
||||
|
||||
if (inheritanceMask & READ_BUFFER)
|
||||
_drawBuffer = camera->_readBuffer;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1262,26 +1262,25 @@ void CullVisitor::apply(osg::Camera& camera)
|
||||
|
||||
rtts->setCamera(&camera);
|
||||
|
||||
if (camera.getDrawBuffer() != GL_NONE)
|
||||
if ( camera.getInheritanceMask() & DRAW_BUFFER )
|
||||
{
|
||||
// inherit draw buffer from above.
|
||||
rtts->setDrawBuffer(previous_stage->getDrawBuffer(),previous_stage->getDrawBufferApplyMask());
|
||||
}
|
||||
else
|
||||
{
|
||||
rtts->setDrawBuffer(camera.getDrawBuffer());
|
||||
}
|
||||
else
|
||||
|
||||
if ( camera.getInheritanceMask() & READ_BUFFER )
|
||||
{
|
||||
// inherit draw buffer from above.
|
||||
rtts->setDrawBuffer(previous_stage->getDrawBuffer());
|
||||
// inherit read buffer from above.
|
||||
rtts->setReadBuffer(previous_stage->getReadBuffer(), previous_stage->getReadBufferApplyMask());
|
||||
}
|
||||
|
||||
if (camera.getReadBuffer() != GL_NONE)
|
||||
else
|
||||
{
|
||||
rtts->setReadBuffer(camera.getReadBuffer());
|
||||
}
|
||||
else
|
||||
{
|
||||
// inherit read buffer from above.
|
||||
rtts->setReadBuffer(previous_stage->getReadBuffer());
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1305,6 +1304,7 @@ void CullVisitor::apply(osg::Camera& camera)
|
||||
{
|
||||
rtts->setClearColor(camera.getClearColor());
|
||||
}
|
||||
|
||||
|
||||
// set the color mask.
|
||||
osg::ColorMask* colorMask = camera.getColorMask()!=0 ? camera.getColorMask() : previous_stage->getColorMask();
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
|
||||
#include <osgUtil/RenderStage>
|
||||
|
||||
#define FORCE_COLOR_ATTACHMENT 1
|
||||
#define FORCE_DEPTH_ATTACHMENT 1
|
||||
|
||||
using namespace osg;
|
||||
using namespace osgUtil;
|
||||
@@ -42,7 +44,10 @@ RenderStage::RenderStage():
|
||||
_stageDrawnThisFrame = false;
|
||||
|
||||
_drawBuffer = GL_NONE;
|
||||
_drawBufferApplyMask = false;
|
||||
_readBuffer = GL_NONE;
|
||||
_readBufferApplyMask = false;
|
||||
|
||||
_clearMask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
|
||||
_clearColor.set(0.0f,0.0f,0.0f,0.0f);
|
||||
_clearAccum.set(0.0f,0.0f,0.0f,0.0f);
|
||||
@@ -69,7 +74,10 @@ RenderStage::RenderStage(SortMode mode):
|
||||
_stageDrawnThisFrame = false;
|
||||
|
||||
_drawBuffer = GL_NONE;
|
||||
_drawBufferApplyMask = false;
|
||||
_readBuffer = GL_NONE;
|
||||
_readBufferApplyMask = false;
|
||||
|
||||
_clearMask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
|
||||
_clearColor.set(0.0f,0.0f,0.0f,0.0f);
|
||||
_clearAccum.set(0.0f,0.0f,0.0f,0.0f);
|
||||
@@ -93,7 +101,9 @@ RenderStage::RenderStage(const RenderStage& rhs,const osg::CopyOp& copyop):
|
||||
_postRenderList(rhs._postRenderList),
|
||||
_viewport(rhs._viewport),
|
||||
_drawBuffer(rhs._drawBuffer),
|
||||
_drawBufferApplyMask(rhs._drawBufferApplyMask),
|
||||
_readBuffer(rhs._readBuffer),
|
||||
_readBufferApplyMask(rhs._readBufferApplyMask),
|
||||
_clearMask(rhs._clearMask),
|
||||
_colorMask(rhs._colorMask),
|
||||
_clearColor(rhs._clearColor),
|
||||
@@ -226,6 +236,7 @@ void RenderStage::runCameraSetUp(osg::RenderInfo& renderInfo)
|
||||
|
||||
osg::Camera::BufferAttachmentMap& bufferAttachments = _camera->getBufferAttachmentMap();
|
||||
|
||||
|
||||
// compute the required dimensions
|
||||
int width = static_cast<int>(_viewport->x() + _viewport->width());
|
||||
int height = static_cast<int>(_viewport->y() + _viewport->height());
|
||||
@@ -419,6 +430,7 @@ void RenderStage::runCameraSetUp(osg::RenderInfo& renderInfo)
|
||||
|
||||
}
|
||||
|
||||
#if FORCE_DEPTH_ATTACHMENT
|
||||
if (!depthAttached)
|
||||
{
|
||||
fbo->setAttachment(osg::Camera::DEPTH_BUFFER, osg::FrameBufferAttachment(new osg::RenderBuffer(width, height, GL_DEPTH_COMPONENT24)));
|
||||
@@ -428,10 +440,13 @@ void RenderStage::runCameraSetUp(osg::RenderInfo& renderInfo)
|
||||
osg::FrameBufferAttachment(new osg::RenderBuffer(width,
|
||||
height, GL_DEPTH_COMPONENT24, samples, colorSamples)));
|
||||
}
|
||||
depthAttached = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if FORCE_COLOR_ATTACHMENT
|
||||
if (!colorAttached)
|
||||
{
|
||||
{
|
||||
fbo->setAttachment(osg::Camera::COLOR_BUFFER, osg::FrameBufferAttachment(new osg::RenderBuffer(width, height, GL_RGB)));
|
||||
if (fbo_multisample.valid())
|
||||
{
|
||||
@@ -439,12 +454,26 @@ void RenderStage::runCameraSetUp(osg::RenderInfo& renderInfo)
|
||||
osg::FrameBufferAttachment(new osg::RenderBuffer(width,
|
||||
height, GL_RGB, samples, colorSamples)));
|
||||
}
|
||||
colorAttached = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
fbo->apply(state);
|
||||
|
||||
|
||||
// If no color attachment make sure to set glDrawBuffer/glReadBuffer to none
|
||||
// otherwise glCheckFramebufferStatusEXT will fail
|
||||
// It has to be done after call to glBindFramebuffer (fbo->apply)
|
||||
// and before call to glCheckFramebufferStatus
|
||||
if ( !colorAttached )
|
||||
{
|
||||
setDrawBuffer( GL_NONE, true );
|
||||
glDrawBuffer( GL_NONE );
|
||||
setReadBuffer( GL_NONE, true );
|
||||
glReadBuffer( GL_NONE );
|
||||
}
|
||||
|
||||
GLenum status = fbo_ext->glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
|
||||
|
||||
|
||||
if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<"RenderStage::runCameraSetUp(), FBO setup failed, FBO status= 0x"<<std::hex<<status<<std::dec<<std::endl;
|
||||
@@ -463,8 +492,8 @@ void RenderStage::runCameraSetUp(osg::RenderInfo& renderInfo)
|
||||
}
|
||||
else
|
||||
{
|
||||
setDrawBuffer(GL_NONE);
|
||||
setReadBuffer(GL_NONE);
|
||||
setDrawBuffer(GL_NONE, false );
|
||||
setReadBuffer(GL_NONE, false );
|
||||
|
||||
_fbo = fbo;
|
||||
|
||||
@@ -730,7 +759,7 @@ void RenderStage::copyTexture(osg::RenderInfo& renderInfo)
|
||||
{
|
||||
osg::State& state = *renderInfo.getState();
|
||||
|
||||
if (_readBuffer != GL_NONE)
|
||||
if ( _readBufferApplyMask )
|
||||
{
|
||||
glReadBuffer(_readBuffer);
|
||||
}
|
||||
@@ -831,15 +860,11 @@ void RenderStage::drawInner(osg::RenderInfo& renderInfo,RenderLeaf*& previous, b
|
||||
|
||||
if (!using_multiple_render_targets)
|
||||
{
|
||||
if (_drawBuffer != GL_NONE)
|
||||
{
|
||||
if( getDrawBufferApplyMask() )
|
||||
glDrawBuffer(_drawBuffer);
|
||||
}
|
||||
|
||||
if (_readBuffer != GL_NONE)
|
||||
{
|
||||
if( getReadBufferApplyMask() )
|
||||
glReadBuffer(_readBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
if (fbo_supported)
|
||||
|
||||
@@ -138,8 +138,7 @@ SceneView::SceneView(DisplaySettings* ds)
|
||||
|
||||
_initCalled = false;
|
||||
|
||||
|
||||
setDrawBufferValue(GL_BACK);
|
||||
_camera->setDrawBuffer(GL_BACK);
|
||||
|
||||
_requiresFlush = true;
|
||||
|
||||
@@ -1082,13 +1081,13 @@ void SceneView::draw()
|
||||
break;
|
||||
case(osg::DisplaySettings::ANAGLYPHIC):
|
||||
{
|
||||
if( getDrawBufferValue() != GL_NONE)
|
||||
if( 0 == ( _camera->getInheritanceMask() & DRAW_BUFFER ) )
|
||||
{
|
||||
_renderStageLeft->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStageLeft->setReadBuffer(getDrawBufferValue());
|
||||
_renderStageLeft->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStageLeft->setReadBuffer(_camera->getDrawBuffer());
|
||||
|
||||
_renderStageRight->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStageRight->setReadBuffer(getDrawBufferValue());
|
||||
_renderStageRight->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStageRight->setReadBuffer(_camera->getDrawBuffer());
|
||||
}
|
||||
|
||||
_localStateSet->setAttribute(getViewport());
|
||||
@@ -1142,13 +1141,13 @@ void SceneView::draw()
|
||||
break;
|
||||
case(osg::DisplaySettings::HORIZONTAL_SPLIT):
|
||||
{
|
||||
if( getDrawBufferValue() != GL_NONE)
|
||||
if( 0 == ( _camera->getInheritanceMask() & DRAW_BUFFER) )
|
||||
{
|
||||
_renderStageLeft->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStageLeft->setReadBuffer(getDrawBufferValue());
|
||||
_renderStageLeft->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStageLeft->setReadBuffer(_camera->getDrawBuffer());
|
||||
|
||||
_renderStageRight->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStageRight->setReadBuffer(getDrawBufferValue());
|
||||
_renderStageRight->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStageRight->setReadBuffer(_camera->getDrawBuffer());
|
||||
}
|
||||
|
||||
// ensure that all color planes are active.
|
||||
@@ -1191,13 +1190,13 @@ void SceneView::draw()
|
||||
break;
|
||||
case(osg::DisplaySettings::VERTICAL_SPLIT):
|
||||
{
|
||||
if( getDrawBufferValue() != GL_NONE)
|
||||
if( 0 == ( _camera->getInheritanceMask() & DRAW_BUFFER) )
|
||||
{
|
||||
_renderStageLeft->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStageLeft->setReadBuffer(getDrawBufferValue());
|
||||
_renderStageLeft->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStageLeft->setReadBuffer(_camera->getDrawBuffer());
|
||||
|
||||
_renderStageRight->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStageRight->setReadBuffer(getDrawBufferValue());
|
||||
_renderStageRight->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStageRight->setReadBuffer(_camera->getDrawBuffer());
|
||||
}
|
||||
|
||||
// ensure that all color planes are active.
|
||||
@@ -1241,10 +1240,10 @@ void SceneView::draw()
|
||||
case(osg::DisplaySettings::RIGHT_EYE):
|
||||
case(osg::DisplaySettings::LEFT_EYE):
|
||||
{
|
||||
if( getDrawBufferValue() != GL_NONE)
|
||||
if( 0 == ( _camera->getInheritanceMask() & DRAW_BUFFER) )
|
||||
{
|
||||
_renderStage->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStage->setReadBuffer(getDrawBufferValue());
|
||||
_renderStage->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStage->setReadBuffer(_camera->getDrawBuffer());
|
||||
}
|
||||
|
||||
// ensure that all color planes are active.
|
||||
@@ -1268,12 +1267,12 @@ void SceneView::draw()
|
||||
break;
|
||||
case(osg::DisplaySettings::VERTICAL_INTERLACE):
|
||||
{
|
||||
if( getDrawBufferValue() != GL_NONE)
|
||||
if( 0 == ( _camera->getInheritanceMask() & DRAW_BUFFER) )
|
||||
{
|
||||
_renderStageLeft->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStageLeft->setReadBuffer(getDrawBufferValue());
|
||||
_renderStageRight->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStageRight->setReadBuffer(getDrawBufferValue());
|
||||
_renderStageLeft->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStageLeft->setReadBuffer(_camera->getDrawBuffer());
|
||||
_renderStageRight->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStageRight->setReadBuffer(_camera->getDrawBuffer());
|
||||
}
|
||||
_localStateSet->setAttribute(getViewport());
|
||||
|
||||
@@ -1345,13 +1344,13 @@ void SceneView::draw()
|
||||
break;
|
||||
case(osg::DisplaySettings::HORIZONTAL_INTERLACE):
|
||||
{
|
||||
if( getDrawBufferValue() != GL_NONE)
|
||||
{
|
||||
_renderStageLeft->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStageLeft->setReadBuffer(getDrawBufferValue());
|
||||
_renderStageRight->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStageRight->setReadBuffer(getDrawBufferValue());
|
||||
}
|
||||
if( 0 == ( _camera->getInheritanceMask() & DRAW_BUFFER) )
|
||||
{
|
||||
_renderStageLeft->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStageLeft->setReadBuffer(_camera->getDrawBuffer());
|
||||
_renderStageRight->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStageRight->setReadBuffer(_camera->getDrawBuffer());
|
||||
}
|
||||
_localStateSet->setAttribute(getViewport());
|
||||
|
||||
// ensure that all color planes are active.
|
||||
@@ -1422,13 +1421,13 @@ void SceneView::draw()
|
||||
break;
|
||||
case(osg::DisplaySettings::CHECKERBOARD):
|
||||
{
|
||||
if( getDrawBufferValue() != GL_NONE)
|
||||
{
|
||||
_renderStageLeft->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStageLeft->setReadBuffer(getDrawBufferValue());
|
||||
_renderStageRight->setDrawBuffer(getDrawBufferValue());
|
||||
_renderStageRight->setReadBuffer(getDrawBufferValue());
|
||||
}
|
||||
if( 0 == ( _camera->getInheritanceMask() & DRAW_BUFFER) )
|
||||
{
|
||||
_renderStageLeft->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStageLeft->setReadBuffer(_camera->getDrawBuffer());
|
||||
_renderStageRight->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStageRight->setReadBuffer(_camera->getDrawBuffer());
|
||||
}
|
||||
_localStateSet->setAttribute(getViewport());
|
||||
|
||||
// ensure that all color planes are active.
|
||||
@@ -1508,13 +1507,13 @@ void SceneView::draw()
|
||||
{
|
||||
|
||||
// Need to restore draw buffer when toggling Stereo off.
|
||||
if( _camera->getDrawBuffer() != GL_NONE)
|
||||
if( 0 == ( _camera->getInheritanceMask() & DRAW_BUFFER ) )
|
||||
{
|
||||
_renderStage->setDrawBuffer(_camera->getDrawBuffer());
|
||||
_renderStage->setReadBuffer(_camera->getDrawBuffer());
|
||||
}
|
||||
|
||||
if( _camera->getReadBuffer() != GL_NONE)
|
||||
if( 0 == ( _camera->getInheritanceMask() & READ_BUFFER ) )
|
||||
{
|
||||
_renderStage->setReadBuffer(_camera->getReadBuffer());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user