1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
#include <vtkActor.h>
#include <vtkImageActor.h>
#include <vtkImageData.h>
#include <vtkImageMapper3D.h>
#include <vtkNew.h>
#include <vtkOpenGLRenderWindow.h>
#include <vtkPointData.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRegressionTestImage.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSphereSource.h>
#include <vtkTestUtilities.h>
#include <vtkUnsignedCharArray.h>
int TestRenderToImage(int argc, char* argv[])
{
vtkNew<vtkSphereSource> sphereSource;
sphereSource->SetCenter(0.0, 0.0, 0.0);
sphereSource->SetRadius(5.0);
sphereSource->Update();
// Visualize
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputConnection(sphereSource->GetOutputPort());
vtkNew<vtkActor> actor;
actor->SetMapper(mapper.Get());
vtkNew<vtkRenderer> renderer;
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->AddRenderer(renderer.Get());
renderWindow->SetMultiSamples(0);
vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
renderWindowInteractor->SetRenderWindow(renderWindow.Get());
renderWindow->Render();
// Render to the image
vtkOpenGLRenderWindow* glRenderWindow =
vtkOpenGLRenderWindow::SafeDownCast(renderWindow.Get());
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;
return EXIT_FAILURE;
}
renderWindow->Render();
// Create an (empty) image at the window size
int *size = renderWindow->GetSize();
vtkNew<vtkImageData> 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<vtkUnsignedCharArray>(image->GetPointData()->GetScalars()));
glRenderWindow->SetUseOffScreenBuffers(false);
// Now add the actor
renderer->AddActor(actor.Get());
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<vtkUnsignedCharArray>(image->GetPointData()->GetScalars()));
glRenderWindow->SetUseOffScreenBuffers(false);
// Create a new image actor and remove the geometry one
vtkNew<vtkImageActor> imageActor;
imageActor->GetMapper()->SetInputData(image.Get());
renderer->RemoveActor(actor.Get());
renderer->AddActor(imageActor.Get());
// Background color white to distinguish image boundary
renderer->SetBackground(1, 1, 1);
renderWindow->Render();
renderer->ResetCamera();
renderWindow->Render();
int retVal = vtkRegressionTestImage(renderWindow.Get());
if (retVal == vtkRegressionTester::DO_INTERACTOR)
{
renderWindowInteractor->Start();
}
return !retVal;
}
|