From af5685bf2850c267ab72ab1b8cf3826895f6e194 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 8 Aug 2014 16:34:12 +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/trunk@14405 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); } }