From 9221cab9c5cb4b7d9100fb79e8fd711dead3a25a Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 8 Aug 2014 16:34:09 +0000 Subject: [PATCH] From Tim George, "Currently there is a problem with using a camera with a viewport with a non 0 offset and also using an FBO. The problem is that only area made up of the viewports width and height is drawn based on an offset of 0,0 instead of using the viewports offset. It is caused by line 991 in RenderStage.cpp: Code: fbo_ext->glBlitFramebuffer( 0, 0, static_cast(_viewport->width()), static_cast(_viewport->height()), 0, 0, static_cast(_viewport->width()), static_cast(_viewport->height()), blitMask, GL_NEAREST); which is not taking into account the viewport x and y when performing the blit. It probably should be: Code: fbo_ext->glBlitFramebuffer( static_cast(_viewport->x()), static_cast(_viewport->y()), static_cast(_viewport->width()) + static_cast(_viewport->x()), static_cast(_viewport->height()) + static_cast(_viewport->y()), static_cast(_viewport->x()), static_cast(_viewport->y()), static_cast(_viewport->width()) + static_cast(_viewport->x()), static_cast(_viewport->height()) + static_cast(_viewport->y()), blitMask, GL_NEAREST); " Note from Robert Osfield, made small tweak to above on merge, changing the width+x to x+width to make it read more naturally. git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/branches/OpenSceneGraph-3.2@14404 16af8721-9629-0410-8352-f15c8da7e697 --- src/osgUtil/RenderStage.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/osgUtil/RenderStage.cpp b/src/osgUtil/RenderStage.cpp index da456235e..53314ff9d 100644 --- a/src/osgUtil/RenderStage.cpp +++ b/src/osgUtil/RenderStage.cpp @@ -989,8 +989,10 @@ void RenderStage::drawInner(osg::RenderInfo& renderInfo,RenderLeaf*& previous, b // framebuffer is multisampled then the dimension arguments are ignored // and the whole framebuffer is always copied. fbo_ext->glBlitFramebuffer( - 0, 0, static_cast(_viewport->width()), static_cast(_viewport->height()), - 0, 0, static_cast(_viewport->width()), static_cast(_viewport->height()), + static_cast(_viewport->x()), static_cast(_viewport->y()), + static_cast(_viewport->x() + _viewport->width()), static_cast(_viewport->y() + _viewport->height()), + static_cast(_viewport->x()), static_cast(_viewport->y()), + static_cast(_viewport->x() + _viewport->width()), static_cast(_viewport->y() + _viewport->height()), blitMask, GL_NEAREST); } @@ -1008,8 +1010,10 @@ void RenderStage::drawInner(osg::RenderInfo& renderInfo,RenderLeaf*& previous, b glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT + (attachment - osg::Camera::COLOR_BUFFER0)); fbo_ext->glBlitFramebuffer( - 0, 0, static_cast(_viewport->width()), static_cast(_viewport->height()), - 0, 0, static_cast(_viewport->width()), static_cast(_viewport->height()), + static_cast(_viewport->x()), static_cast(_viewport->y()), + static_cast(_viewport->x() + _viewport->width()), static_cast(_viewport->y() + _viewport->height()), + static_cast(_viewport->x()), static_cast(_viewport->y()), + static_cast(_viewport->x() + _viewport->width()), static_cast(_viewport->y() + _viewport->height()), GL_COLOR_BUFFER_BIT, GL_NEAREST); } }