Rendering offscreen causes the window to no longer render.
I'm currently using VTK 8.2 and rendering offscreen causes the window to no longer render. I was able to reproduce the problem with the Screenshot VTK sample. Running the sample code below throws multiple OpenGL errors and there's no background in the output image. When we go back to the rendering screen the screen goes blank. Also, the scene disappears when windowToImageFilter->Update() is called.
Here's the code:
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkSphereSource.h>
#include <vtkWindowToImageFilter.h>
#include <vtkPNGWriter.h>
#include <vtkProperty.h>
int main(int, char *[])
{
vtkSmartPointer<vtkSphereSource> sphereSource =
vtkSmartPointer<vtkSphereSource>::New();
sphereSource->SetCenter(0.0, 0.0, 0.0);
sphereSource->SetRadius(5.0);
sphereSource->Update();
// Visualize
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(sphereSource->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetOpacity(0.5); // <-- MAKE THE SPHERE TRANSLUCENT TO ENABLE USE OF THE ALPHA CHANNEL.
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetAlphaBitPlanes(1); //enable usage of alpha channel
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(actor);
renderer->SetBackground(1,1,1); // Background color white
renderWindow->Render();
// Screenshot
renderWindow->OffScreenRenderingOn(); // <-- TURN ON OFFSCREEN RENDERING.
vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter =
vtkSmartPointer<vtkWindowToImageFilter>::New();
windowToImageFilter->SetInput(renderWindow);
// COMMENT OUT SCALING/MAGNIFICATION BECAUSE THE RESULTS ARE WRONG. THIS IS BROKEN ALSO.
//#if VTK_MAJOR_VERSION > 8 || VTK_MAJOR_VERSION == 8 && VTK_MINOR_VERSION >= 1
// windowToImageFilter->SetScale(2); //image quality
//#else
// windowToImageFilter->SetMagnification(2); //image quality
//#endif
windowToImageFilter->SetInputBufferTypeToRGBA(); //also record the alpha (transparency) channel
windowToImageFilter->ReadFrontBufferOff(); // read from the back buffer
windowToImageFilter->Update();
vtkSmartPointer<vtkPNGWriter> writer =
vtkSmartPointer<vtkPNGWriter>::New();
writer->SetFileName("C:\\Users\\amamidi\\Documents\\Tests\\Screenshot-8.2\\screenshot-1.png"); // <-- POINT THIS SOMEWHERE AVAILABLE.
writer->SetInputConnection(windowToImageFilter->GetOutputPort());
writer->Write();
renderWindow->OffScreenRenderingOff(); // <-- TURN OFF OFFSCREEN RENDERING.
renderWindow->Render(); // <-- A SLEW OF OPENGL ERROR OCCUR AND OPENGL IS IN A BAD STATE AND RENDERS INCORRECTLY.
renderer->ResetCamera();
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
Sample output: