1 /*=========================================================================
2
3 Program: Visualization Toolkit
4
5 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
6 All rights reserved.
7 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
8
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the above copyright notice for more information.
12
13 =========================================================================*/
14 // This test is intended to benchmark render times for the vtkGPURayCastMapper
15
16 #include "vtkCamera.h"
17 #include "vtkColorTransferFunction.h"
18 #include "vtkGPUVolumeRayCastMapper.h"
19 #include "vtkImageData.h"
20 #include "vtkNew.h"
21 #include "vtkPiecewiseFunction.h"
22 #include "vtkRTAnalyticSource.h"
23 #include "vtkRenderWindow.h"
24 #include "vtkRenderWindowInteractor.h"
25 #include "vtkRenderer.h"
26 #include "vtkTimerLog.h"
27 #include "vtkVolume.h"
28 #include "vtkVolumeProperty.h"
29 #include "vtkXMLImageDataReader.h"
30
31 #include "vtkRegressionTestImage.h"
32 #include "vtkTestUtilities.h"
33
34 //----------------------------------------------------------------------------
TestGPURayCastMapperBenchmark(int argc,char * argv[])35 int TestGPURayCastMapperBenchmark(int argc, char* argv[])
36 {
37 cout << "CTEST_FULL_OUTPUT (Avoid ctest truncation of output)" << endl;
38
39 vtkNew<vtkRTAnalyticSource> wavelet;
40 wavelet->SetWholeExtent(-127, 128,
41 -127, 128,
42 -127, 128);
43 wavelet->SetCenter(0.0, 0.0, 0.0);
44
45 vtkNew<vtkGPUVolumeRayCastMapper> volumeMapper;
46 volumeMapper->SetInputConnection(wavelet->GetOutputPort());
47
48 vtkNew<vtkVolumeProperty> volumeProperty;
49 vtkNew<vtkColorTransferFunction> ctf;
50 ctf->AddRGBPoint(37.3531, 0.2, 0.29, 1);
51 ctf->AddRGBPoint(157.091, 0.87, 0.87, 0.87);
52 ctf->AddRGBPoint(276.829, 0.7, 0.015, 0.15);
53
54 vtkNew<vtkPiecewiseFunction> pwf;
55 pwf->AddPoint(37.3531, 0.0);
56 pwf->AddPoint(276.829, 1.0);
57
58 volumeProperty->SetColor(ctf.GetPointer());
59 volumeProperty->SetScalarOpacity(pwf.GetPointer());
60
61 vtkNew<vtkVolume> volume;
62 volume->SetMapper(volumeMapper.GetPointer());
63 volume->SetProperty(volumeProperty.GetPointer());
64
65 vtkNew<vtkRenderWindow> renderWindow;
66 renderWindow->SetSize(900, 900);
67 renderWindow->Render(); // make sure we have an OpenGL context.
68
69 vtkNew<vtkRenderer> renderer;
70 renderer->AddVolume(volume.GetPointer());
71 renderer->ResetCamera();
72 renderWindow->AddRenderer(renderer.GetPointer());
73
74 vtkNew<vtkRenderWindowInteractor> iren;
75 iren->SetRenderWindow(renderWindow.GetPointer());
76
77 int valid = volumeMapper->IsRenderSupported(renderWindow.GetPointer(),
78 volumeProperty.GetPointer());
79 int retVal;
80 if (valid)
81 {
82
83 vtkNew<vtkTimerLog> timer;
84 timer->StartTimer();
85 renderWindow->Render();
86 timer->StopTimer();
87 double firstRender = timer->GetElapsedTime();
88 cerr << "First Render Time: " << firstRender << endl;
89
90 int numRenders = 20;
91 for (int i = 0; i < numRenders; ++i)
92 {
93 renderer->GetActiveCamera()->Azimuth(1);
94 renderer->GetActiveCamera()->Elevation(1);
95 renderWindow->Render();
96 }
97
98 timer->StartTimer();
99 numRenders = 100;
100 for (int i = 0; i < numRenders; ++i)
101 {
102 renderer->GetActiveCamera()->Azimuth(1);
103 renderer->GetActiveCamera()->Elevation(1);
104 renderer->GetActiveCamera()->OrthogonalizeViewUp();
105 renderWindow->Render();
106 }
107 timer->StopTimer();
108 double elapsed = timer->GetElapsedTime();
109 cerr << "Interactive Render Time: " << elapsed / numRenders << endl;
110
111 renderer->GetActiveCamera()->SetPosition(0,0,1);
112 renderer->GetActiveCamera()->SetFocalPoint(0,0,0);
113 renderer->GetActiveCamera()->SetViewUp(0,1,0);
114 renderer->ResetCamera();
115
116 renderWindow->SetSize(300, 300);
117 renderWindow->Render();
118
119 iren->Initialize();
120
121 retVal = vtkRegressionTestImage( renderWindow.GetPointer() );
122 if( retVal == vtkRegressionTester::DO_INTERACTOR)
123 {
124 iren->Start();
125 }
126 }
127 else
128 {
129 retVal = vtkTesting::PASSED;
130 cout << "Required extensions not supported." << endl;
131 }
132
133 return !((retVal == vtkTesting::PASSED) ||
134 (retVal == vtkTesting::DO_INTERACTOR));
135 }
136