diff --git a/Rendering/OpenGL2/vtkSSAOPass.cxx b/Rendering/OpenGL2/vtkSSAOPass.cxx index 98995f6732ddb8f93f7d68e5a6e5814b6b4d274a..6a9b414d74be4c386af7eecd5aeed42809ef6696 100644 --- a/Rendering/OpenGL2/vtkSSAOPass.cxx +++ b/Rendering/OpenGL2/vtkSSAOPass.cxx @@ -256,13 +256,28 @@ void vtkSSAOPass::RenderDelegate(const vtkRenderState* s, int w, int h) this->FrameBufferObject->AddDepthAttachment(this->DepthTexture); this->FrameBufferObject->StartNonOrtho(w, h); + // Clear color and depth. + // This is only required for the vtkRenderer built-in UseSSAO feature + // where the DelegatePass does not use a vtkCameraPass for clearing. vtkOpenGLRenderer* glRen = vtkOpenGLRenderer::SafeDownCast(s->GetRenderer()); + if (glRen && glRen->GetUseSSAO() && glRen->GetErase()) + { + vtkOpenGLState* ostate = glRen->GetState(); + GLbitfield clear_mask = 0; + if (!glRen->Transparent()) + { + clear_mask |= GL_COLOR_BUFFER_BIT; + } - vtkOpenGLState* ostate = glRen->GetState(); - ostate->vtkglClear(GL_COLOR_BUFFER_BIT); - ostate->vtkglDepthMask(GL_TRUE); - ostate->vtkglClearDepth(1.0); - ostate->vtkglClear(GL_DEPTH_BUFFER_BIT); + if (!glRen->GetPreserveDepthBuffer()) + { + ostate->vtkglClearDepth(static_cast(1.0)); + clear_mask |= GL_DEPTH_BUFFER_BIT; + ostate->vtkglDepthMask(GL_TRUE); + } + + ostate->vtkglClear(clear_mask); + } this->DelegatePass->Render(s); this->NumberOfRenderedProps += this->DelegatePass->GetNumberOfRenderedProps();