diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dec179d479..4f5dfcebb4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -979,7 +979,8 @@ void Application::paintGL() { // Viewport is assigned to the size of the framebuffer QSize size = DependencyManager::get()->getFrameBufferSize(); glViewport(0, 0, size.width(), size.height()); - + renderArgs._viewport = glm::ivec4(0, 0, size.width(), size.height()); + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); @@ -3716,6 +3717,7 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi QSize size = DependencyManager::get()->getFrameBufferSize(); glViewport(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); glScissor(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); + renderArgs->_viewport = glm::ivec4(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); } else { // if not rendering the billboard, the region is in device independent coordinates; must convert to device QSize size = DependencyManager::get()->getFrameBufferSize(); @@ -3723,6 +3725,8 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi int x = region.x() * ratio, y = region.y() * ratio, width = region.width() * ratio, height = region.height() * ratio; glViewport(x, size.height() - y - height, width, height); glScissor(x, size.height() - y - height, width, height); + + renderArgs->_viewport = glm::ivec4(x, size.height() - y - height, width, height); } bool updateViewFrustum = false; updateProjectionMatrix(_mirrorCamera, updateViewFrustum); @@ -3735,6 +3739,7 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi glPopMatrix(); // reset Viewport and projection matrix + renderArgs->_viewport = glm::ivec4(viewport[0], viewport[1], viewport[2], viewport[3]); glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); glDisable(GL_SCISSOR_TEST); updateProjectionMatrix(_myCamera, updateViewFrustum); diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 7bab6f58b9..e3bf19de30 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -714,6 +714,7 @@ void OculusManager::display(QGLWidget * glCanvas, RenderArgs* renderArgs, const vp.Size.w = _recommendedTexSize.w * _offscreenRenderScale; glViewport(vp.Pos.x, vp.Pos.y, vp.Size.w, vp.Size.h); + renderArgs->_viewport = glm::ivec4(vp.Pos.x, vp.Pos.y, vp.Size.w, vp.Size.h); renderArgs->_renderSide = RenderArgs::MONO; qApp->displaySide(renderArgs, *_camera); qApp->getApplicationCompositor().displayOverlayTextureHmd(renderArgs, eye); diff --git a/interface/src/devices/TV3DManager.cpp b/interface/src/devices/TV3DManager.cpp index e945b5e79a..20ab39ebfc 100644 --- a/interface/src/devices/TV3DManager.cpp +++ b/interface/src/devices/TV3DManager.cpp @@ -107,6 +107,7 @@ void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { _activeEye = &eye; glViewport(portalX, portalY, portalW, portalH); glScissor(portalX, portalY, portalW, portalH); + renderArgs->_viewport = glm::ivec4(portalX, portalY, portalW, portalH); glm::mat4 projection = glm::frustum(eye.left, eye.right, eye.bottom, eye.top, nearZ, farZ); projection = glm::translate(projection, vec3(eye.modelTranslation, 0, 0)); @@ -118,6 +119,7 @@ void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); renderArgs->_renderSide = RenderArgs::MONO; + qApp->displaySide(renderArgs, eyeCamera, false); qApp->getApplicationCompositor().displayOverlayTexture(renderArgs); _activeEye = NULL; diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index 5af82eef99..8565371a9b 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -206,6 +206,7 @@ void ApplicationCompositor::displayOverlayTexture(RenderArgs* renderArgs) { auto geometryCache = DependencyManager::get(); geometryCache->useSimpleDrawPipeline(batch); + batch.setViewportTransform(glm::ivec4(0, 0, deviceSize.width(), deviceSize.height())); batch.setModelTransform(Transform()); batch.setViewTransform(Transform()); batch.setProjectionTransform(mat4()); diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index b2db089bbe..6fac490cab 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -240,6 +240,8 @@ void DeferredLightingEffect::render(RenderArgs* args) { // binding the first framebuffer auto freeFBO = DependencyManager::get()->getFreeFramebuffer(); batch.setFramebuffer(freeFBO); + + batch.setViewportTransform(args->_viewport); batch.clearColorFramebuffer(freeFBO->getBufferMask(), glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); @@ -251,18 +253,10 @@ void DeferredLightingEffect::render(RenderArgs* args) { batch.setResourceTexture(3, textureCache->getPrimaryDepthTexture()); - // get the viewport side (left, right, both) - int viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); - const int VIEWPORT_X_INDEX = 0; - const int VIEWPORT_Y_INDEX = 1; - const int VIEWPORT_WIDTH_INDEX = 2; - const int VIEWPORT_HEIGHT_INDEX = 3; - - float sMin = viewport[VIEWPORT_X_INDEX] / (float)framebufferSize.width(); - float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)framebufferSize.width(); - float tMin = viewport[VIEWPORT_Y_INDEX] / (float)framebufferSize.height(); - float tHeight = viewport[VIEWPORT_HEIGHT_INDEX] / (float)framebufferSize.height(); + float sMin = args->_viewport.x / (float)framebufferSize.width(); + float sWidth = args->_viewport.z / (float)framebufferSize.width(); + float tMin = args->_viewport.y / (float)framebufferSize.height(); + float tHeight = args->_viewport.w / (float)framebufferSize.height(); bool useSkyboxCubemap = (_skybox) && (_skybox->getCubemap()); @@ -556,27 +550,19 @@ void DeferredLightingEffect::copyBack(RenderArgs* args) { batch.setProjectionTransform(glm::mat4()); batch.setViewTransform(Transform()); + + float sMin = args->_viewport.x / (float)framebufferSize.width(); + float sWidth = args->_viewport.z / (float)framebufferSize.width(); + float tMin = args->_viewport.y / (float)framebufferSize.height(); + float tHeight = args->_viewport.w / (float)framebufferSize.height(); - int viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); - const int VIEWPORT_X_INDEX = 0; - const int VIEWPORT_Y_INDEX = 1; - const int VIEWPORT_WIDTH_INDEX = 2; - const int VIEWPORT_HEIGHT_INDEX = 3; - - float sMin = viewport[VIEWPORT_X_INDEX] / (float)framebufferSize.width(); - float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)framebufferSize.width(); - float tMin = viewport[VIEWPORT_Y_INDEX] / (float)framebufferSize.height(); - float tHeight = viewport[VIEWPORT_HEIGHT_INDEX] / (float)framebufferSize.height(); + batch.setViewportTransform(args->_viewport); Transform model; model.setTranslation(glm::vec3(sMin, tMin, 0.0)); model.setScale(glm::vec3(sWidth, tHeight, 1.0)); batch.setModelTransform(model); - - batch.setViewportTransform(glm::ivec4(viewport[0], viewport[1], viewport[2], viewport[3])); - batch.draw(gpu::TRIANGLE_STRIP, 4); diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index dc0de80e42..fab134913d 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -187,9 +187,6 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const args->_context->syncCache(); args->_context->render((*args->_batch)); args->_batch = nullptr; - - // reset blend function to standard... - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); } gpu::PipelinePointer DrawOverlay3D::_opaquePipeline; diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index 9673623b13..5507072b2c 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -104,6 +104,7 @@ public: gpu::Context* _context = nullptr; OctreeRenderer* _renderer = nullptr; ViewFrustum* _viewFrustum = nullptr; + glm::ivec4 _viewport{ 0, 0, 1, 1 }; float _sizeScale = 1.0f; int _boundaryLevelAdjust = 0; RenderMode _renderMode = DEFAULT_RENDER_MODE;