#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int TestRenderToImage(int argc, char* argv[]) { vtkNew sphereSource; sphereSource->SetCenter(0.0, 0.0, 0.0); sphereSource->SetRadius(5.0); sphereSource->Update(); // Visualize vtkNew mapper; mapper->SetInputConnection(sphereSource->GetOutputPort()); vtkNew actor; actor->SetMapper(mapper); vtkNew renderer; vtkNew renderWindow; renderWindow->AddRenderer(renderer); renderWindow->SetMultiSamples(0); vtkNew renderWindowInteractor; renderWindowInteractor->SetRenderWindow(renderWindow); renderWindow->Render(); // Render to the image vtkOpenGLRenderWindow* glRenderWindow = vtkOpenGLRenderWindow::SafeDownCast(renderWindow); glRenderWindow->SetShowWindow(false); glRenderWindow->SetUseOffScreenBuffers(true); renderWindow->Render(); // Create an (empty) image at the window size const int* size = renderWindow->GetSize(); vtkNew image; image->SetDimensions(size[0], size[1], 1); image->AllocateScalars(VTK_UNSIGNED_CHAR, 3); renderWindow->GetPixelData(0, 0, size[0] - 1, size[1] - 1, 0, vtkArrayDownCast(image->GetPointData()->GetScalars())); glRenderWindow->SetShowWindow(true); glRenderWindow->SetUseOffScreenBuffers(false); // Now add the actor renderer->AddActor(actor); renderer->ResetCamera(); renderWindow->Render(); glRenderWindow->SetShowWindow(false); glRenderWindow->SetUseOffScreenBuffers(true); renderWindow->Render(); // Capture the framebuffer to the image, again renderWindow->GetPixelData(0, 0, size[0] - 1, size[1] - 1, 0, vtkArrayDownCast(image->GetPointData()->GetScalars())); glRenderWindow->SetShowWindow(true); glRenderWindow->SetUseOffScreenBuffers(false); // Create a new image actor and remove the geometry one vtkNew imageActor; imageActor->GetMapper()->SetInputData(image); renderer->RemoveActor(actor); renderer->AddActor(imageActor); // Background color white to distinguish image boundary renderer->SetBackground(1, 1, 1); renderWindow->Render(); renderer->ResetCamera(); renderWindow->Render(); int retVal = vtkRegressionTestImage(renderWindow); if (retVal == vtkRegressionTester::DO_INTERACTOR) { renderWindowInteractor->Start(); } return !retVal; }