#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); if (!glRenderWindow->SetUseOffScreenBuffers(true)) { // Hardware off screen buffer failed to be created. // Turn debug mode on to write the errors on the output. glRenderWindow->DebugOn(); glRenderWindow->SetUseOffScreenBuffers(true); glRenderWindow->DebugOff(); std::cout << "Unable to create a hardware frame buffer, the graphic board " "or driver can be too old:\n" << glRenderWindow->ReportCapabilities() << std::endl; // The test cannot be done. Let's make it pass. return EXIT_SUCCESS; } renderWindow->Render(); // Create an (empty) image at the window size 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->SetUseOffScreenBuffers(false); // Now add the actor renderer->AddActor(actor); renderer->ResetCamera(); renderWindow->Render(); 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->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; }