diff --git a/Rendering/Parallel/vtkClientServerSynchronizedRenderers.cxx b/Rendering/Parallel/vtkClientServerSynchronizedRenderers.cxx index cef07375346ded7525a84e904ad40cf981e4c91c..7f001058c42ab98c448025e6a0912faf10bc3d0b 100644 --- a/Rendering/Parallel/vtkClientServerSynchronizedRenderers.cxx +++ b/Rendering/Parallel/vtkClientServerSynchronizedRenderers.cxx @@ -36,8 +36,7 @@ void vtkClientServerSynchronizedRenderers::MasterEndRender() // receive image from slave. assert(this->ParallelController->IsA("vtkSocketController")); - vtkRawImage& rawImage = (this->ImageReductionFactor == 1)? - this->FullImage : this->ReducedImage; + vtkRawImage& rawImage = this->Image; int header[4]; this->ParallelController->Receive(header, 4, 1, 0x023430); diff --git a/Rendering/Parallel/vtkCompositedSynchronizedRenderers.cxx b/Rendering/Parallel/vtkCompositedSynchronizedRenderers.cxx index 497b43196011f4dcd915cca9dbfc1c849dfbda31..9cb60ebc8d360515a3ab825b723e58ba8e187a8a 100644 --- a/Rendering/Parallel/vtkCompositedSynchronizedRenderers.cxx +++ b/Rendering/Parallel/vtkCompositedSynchronizedRenderers.cxx @@ -40,9 +40,7 @@ vtkCompositedSynchronizedRenderers::~vtkCompositedSynchronizedRenderers() //---------------------------------------------------------------------------- void vtkCompositedSynchronizedRenderers::MasterEndRender() { - vtkRawImage& rawImage = (this->ImageReductionFactor == 1)? - this->FullImage : this->ReducedImage; - rawImage = this->CaptureRenderedImage(); + vtkRawImage& rawImage = this->CaptureRenderedImage(); vtkFloatArray* depth_buffer = vtkFloatArray::New(); this->CaptureRenderedDepthBuffer(depth_buffer); diff --git a/Rendering/Parallel/vtkSynchronizedRenderers.cxx b/Rendering/Parallel/vtkSynchronizedRenderers.cxx index f4a41c504f9dad74a99a9c6d07a3f0fb07536886..c880de13c5322bb4e42a8efcb4cfd3e69e0276c7 100644 --- a/Rendering/Parallel/vtkSynchronizedRenderers.cxx +++ b/Rendering/Parallel/vtkSynchronizedRenderers.cxx @@ -80,6 +80,11 @@ vtkCxxSetObjectMacro(vtkSynchronizedRenderers, CaptureDelegate, vtkSynchronizedRenderers); //---------------------------------------------------------------------------- vtkSynchronizedRenderers::vtkSynchronizedRenderers() + : LastBackground{ 0, 0, 0 } + , LastBackgroundAlpha(0) + , LastTexturedBackground(false) + , LastGradientBackground(false) + , FixBackground(false) { this->Observer = vtkSynchronizedRenderers::vtkObserver::New(); this->Observer->Target = this; @@ -162,14 +167,26 @@ void vtkSynchronizedRenderers::HandleStartRender() return; } - this->ReducedImage.MarkInValid(); - this->FullImage.MarkInValid(); + this->Image.MarkInValid(); // disable FXAA when parallel rendering. We'll do the FXAA pass after the // compositing stage. This avoid any seam artifacts from creeping in. this->UseFXAA = this->Renderer->GetUseFXAA(); this->Renderer->SetUseFXAA(false); + if (this->FixBackground) + { + this->Renderer->GetBackground(this->LastBackground); + this->LastBackgroundAlpha = this->Renderer->GetBackgroundAlpha(); + this->LastTexturedBackground = this->Renderer->GetTexturedBackground(); + this->LastGradientBackground = this->Renderer->GetGradientBackground(); + + this->Renderer->SetBackground(0, 0, 0); + this->Renderer->SetBackgroundAlpha(0); + this->Renderer->SetTexturedBackground(false); + this->Renderer->SetGradientBackground(false); + } + if (this->ParallelController->GetLocalProcessId() == this->RootProcessId) { this->MasterStartRender(); @@ -246,12 +263,21 @@ void vtkSynchronizedRenderers::HandleEndRender() if (this->WriteBackImages) { - if (this->ImageReductionFactor > 1 && this->ParallelRendering) + if (this->GetImageReductionFactor() > 1 || this->FixBackground) { this->CaptureRenderedImage(); } } + if (this->FixBackground) + { + // restore background values. + this->Renderer->SetBackground(this->LastBackground); + this->Renderer->SetBackgroundAlpha(this->LastBackgroundAlpha); + this->Renderer->SetTexturedBackground(this->LastTexturedBackground); + this->Renderer->SetGradientBackground(this->LastGradientBackground); + } + // restore viewport before `PushImageToScreen`, but after // `CaptureRenderedImage`. this->Renderer->SetViewport(this->LastViewport); @@ -280,10 +306,7 @@ void vtkSynchronizedRenderers::SlaveEndRender() vtkSynchronizedRenderers::vtkRawImage& vtkSynchronizedRenderers::CaptureRenderedImage() { - vtkRawImage& rawImage = - (this->ImageReductionFactor == 1)? - this->FullImage : this->ReducedImage; - + vtkRawImage& rawImage = this->Image; if (!rawImage.IsValid()) { if (this->CaptureDelegate) @@ -302,10 +325,7 @@ vtkSynchronizedRenderers::CaptureRenderedImage() //---------------------------------------------------------------------------- void vtkSynchronizedRenderers::PushImageToScreen() { - vtkRawImage& rawImage = - (this->ImageReductionFactor == 1)? - this->FullImage : this->ReducedImage; - + vtkRawImage& rawImage = this->Image; if (!rawImage.IsValid()) { return; @@ -408,6 +428,7 @@ void vtkSynchronizedRenderers::PrintSelf(ostream& os, vtkIndent indent) os << indent << "ImageReductionFactor: " << this->ImageReductionFactor << endl; os << indent << "WriteBackImages: " << this->WriteBackImages << endl; + os << indent << "FixBackground: " << this->FixBackground << endl; os << indent << "RootProcessId: " << this->RootProcessId << endl; os << indent << "ParallelRendering: " << this->ParallelRendering << endl; os << indent << "AutomaticEventHandling: " @@ -732,8 +753,9 @@ bool vtkSynchronizedRenderers::vtkRawImage::PushToFrameBuffer(vtkRenderer *ren) // framebuffers have their color premultiplied by alpha. vtkOpenGLState::ScopedglBlendFuncSeparate bfsaver(ostate); ostate->vtkglEnable(GL_BLEND); - ostate->vtkglBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, - GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + ostate->vtkglBlendFuncSeparate(GL_ONE,GL_ONE_MINUS_SRC_ALPHA, + GL_ONE,GL_ONE_MINUS_SRC_ALPHA); + int size[2], low_point[2]; ren->GetTiledSizeAndOrigin(&size[0], &size[1], &low_point[0], &low_point[1]); diff --git a/Rendering/Parallel/vtkSynchronizedRenderers.h b/Rendering/Parallel/vtkSynchronizedRenderers.h index 9b08964fe9ba1b05ec2560a874d74f0f167de2f7..1fb8476a44e0b1cb39b28f4d1d555f44bc211191 100644 --- a/Rendering/Parallel/vtkSynchronizedRenderers.h +++ b/Rendering/Parallel/vtkSynchronizedRenderers.h @@ -139,6 +139,23 @@ public: vtkBooleanMacro(AutomaticEventHandling, bool); //@} + //@{ + /** + * When doing rendering between multiple processes, it is often easier to have + * all ranks do the rendering on a black background. This helps avoid issues + * where the background gets over blended as the images are composted + * together. If set to true (default is false), before the rendering begins, + * vtkSynchronizedRenderers will change the renderer's background color and + * other flags to make it render on a black background and then restore then + * on end render. If WriteBackImages is true, then the background will indeed + * be restored before the write-back happens, thus ensuring the result + * displayed to the user is on correct background. + */ + vtkSetMacro(FixBackground, bool); + vtkGetMacro(FixBackground, bool); + vtkBooleanMacro(FixBackground, bool); + //@} + enum { SYNC_RENDERER_TAG = 15101, @@ -251,23 +268,19 @@ protected: /** * Can be used in HandleEndRender(), MasterEndRender() or SlaveEndRender() - * calls to capture the rendered image. If this->ImageReductionFactor, then - * the image will be capture in this->ReducedImage, otherwise it will be - * captured in this->FullImage (this->ReducedImage will be pointing to the - * same image). + * calls to capture the rendered image. The captured image is stored in + * `this->Image`. */ virtual vtkRawImage& CaptureRenderedImage(); /** * Can be used in HandleEndRender(), MasterEndRender() or SlaveEndRender() - * calls to paste back the image from either this->ReducedImage or - * this->FullImage info the viewport. + * calls to paste back the image from this->Image to the viewport. */ virtual void PushImageToScreen(); vtkSynchronizedRenderers* CaptureDelegate; - vtkRawImage ReducedImage; - vtkRawImage FullImage; + vtkRawImage Image; bool ParallelRendering; int ImageReductionFactor; @@ -287,6 +300,12 @@ private: vtkOpenGLFXAAFilter* FXAAFilter; double LastViewport[4]; + + double LastBackground[3]; + double LastBackgroundAlpha; + bool LastTexturedBackground; + bool LastGradientBackground; + bool FixBackground; }; #endif