I am trying to render a volume, read from an NRRD file. This is using VTK 8.2. The file is about 700MB, and simply loading it and displaying it in Python seems to happen quite quickly, with the first frame rendering under a second. However, when I run (what I believe to be) the equivalent C++ code, the time to render that first frame sits closer to 20 seconds.
My guess is that the C++ is doing some conversions or casts that the Python is not, but I’m not sure where, or how I could suppress that. Does anyone have any ideas?
The fast Python:
#!/usr/bin/env python
import vtk
reader = vtk.vtkNrrdReader()
reader.SetFileName("C:/mydata.nrrd")
reader.Update()
data_alpha_range = [0.0, 28.0]
data_colour_range = [-25.0, 40.0]
opacity_transfer_function = vtk.vtkPiecewiseFunction()
opacity_transfer_function.AddPoint(data_alpha_range[0], 1.0)
opacity_transfer_function.AddPoint(data_alpha_range[1], 1.0)
colour_transfer_function = vtk.vtkColorTransferFunction()
colour_transfer_function.AddRGBPoint(data_colour_range[0], 0.0, 0.0, 0.0)
colour_transfer_function.AddRGBPoint(data_colour_range[1], 1.0, 1.0, 1.0)
volume_property = vtk.vtkVolumeProperty()
volume_property.SetColor(colour_transfer_function)
volume_property.SetScalarOpacity(opacity_transfer_function)
volume_property.SetInterpolationTypeToLinear()
volume_mapper = vtk.vtkGPUVolumeRayCastMapper()
volume_mapper.SetInputConnection(reader.GetOutputPort())
volume_mapper.SetBlendModeToMaximumIntensity()
volume = vtk.vtkVolume()
volume.SetMapper(volume_mapper)
volume.SetProperty(volume_property)
ren1 = vtk.vtkRenderer()
ren1.SetBackground(0.0, 0.0, 0.0)
ren1.AddActor(volume)
ren1.ResetCamera()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren1)
renWin.SetSize(800, 800)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
iren.Initialize()
iren.Start()
The slow C++:
#include <vtkSmartPointer.h>
#include <vtkNrrdReader.h>
#include <vtkPiecewiseFunction.h>
#include <vtkColorTransferFunction.h>
#include <vtkVolumeProperty.h>
#include <vtkGPUVolumeRayCastMapper.h>
#include <vtkVolume.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
int main(int, char *[])
{
auto reader = vtkSmartPointer<vtkNrrdReader>::New();
reader->SetFileName("C:/mydata.nrrd");
reader->Update();
double data_alpha_range[2] = { 0.0, 28.0 };
double data_colour_range[2] = { -25.0, 40.0 };
auto opacity_transfer_function = vtkSmartPointer<vtkPiecewiseFunction>::New();
opacity_transfer_function->AddPoint(data_alpha_range[0], 1.0);
opacity_transfer_function->AddPoint(data_alpha_range[1], 1.0);
auto colour_transfer_function = vtkSmartPointer<vtkColorTransferFunction>::New();
colour_transfer_function->AddRGBPoint(data_colour_range[0], 0.0, 0.0, 0.0);
colour_transfer_function->AddRGBPoint(data_colour_range[1], 1.0, 1.0, 1.0);
auto volume_property = vtkSmartPointer<vtkVolumeProperty>::New();
volume_property->SetColor(colour_transfer_function);
volume_property->SetScalarOpacity(opacity_transfer_function);
volume_property->SetInterpolationTypeToLinear();
auto volume_mapper = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();
volume_mapper->SetInputConnection(reader->GetOutputPort());
volume_mapper->SetBlendModeToMaximumIntensity();
auto volume = vtkSmartPointer<vtkVolume>::New();
volume->SetMapper(volume_mapper);
volume->SetProperty(volume_property);
auto ren1 = vtkSmartPointer<vtkRenderer>::New();
ren1->SetBackground(0.0, 0.0, 0.0);
ren1->AddActor(volume);
ren1->ResetCamera();
auto renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(ren1);
renWin->SetSize(800, 800);
auto iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
iren->Initialize();
iren->Start();
return EXIT_SUCCESS;
}
Any help would be appreciated.