[vtkusers] Volume rendering problem
Elvis Stansvik
elvis.stansvik at orexplore.com
Thu Aug 11 05:24:33 EDT 2016
2016-08-11 11:18 GMT+02:00 Elvis Stansvik <elvis.stansvik at orexplore.com>:
> Hi all,
>
> I'm wrestling with a volume rendering problem.
>
> I've set up a very basic pipeline that just renders a volume.
>
> As source it uses a custom reader I wrote that loads a volume from a HDF5
> dataset (float).
>
> It seemed to be working fine with the volume I had been testing with (see
> attached works_fine.png), which was a 120x120x2000. In addition to the the
> rendering itself, the screenshot shows a histogram plot I was using for
> debugging, as well as some editor controls I use to modify the
> color/opacity transfer function.
>
> I then tested with another volume which is larger (300x300x5000), but
> apart from that has pretty much the same characteristic for its scalar
> values as the first one, and all of a sudden I don't see anything. See the
> attached not_working.png, which shows the setup using the problematic
> volume.
>
> As you can in the histogram, there's a lot of voxel values roughly around
> 1, much like in the first volume, so I would expect that with the same
> transfer functions (black color, and an opacity ramp from 0.0,0.0 up to
> 5.0,1.0), I should see _something_.
>
> I'm pretty sure I'm missing something basic here, but does anyone have an
> idea why I get the expected rendering with my smaller volume, but not with
> the bigger one?
>
> Thanks a lot for any advice!
>
I can give some snippets from my code which shows how I set up rendering
and how I show the histogram:
The pipeline is basically just:
auto volumeMapper =
vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();
volumeMapper->SetInputData(imageData);
auto volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
volumeProperty->SetInterpolationTypeToLinear();
volumeProperty->ShadeOff();
auto opacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
opacity->AddPoint(0.0, 0.0);
opacity->AddPoint(5.0, 1.0);
auto volume = vtkSmartPointer<vtkVolume>::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
renderer()->AddVolume(volume);
where imageData is the vtkImageData as loaded by my custom reader.
The camera is configured with:
auto camera = renderer()->GetActiveCamera();
camera->SetParallelProjection(true);
camera->SetPosition(3000.0, 0.0, 0.0);
camera->SetFocalPoint(0.0, 0.0, 0.0);
camera->SetViewUp(0, 0, 1);
And the histogram plot I use for debugging is set up with:
auto imageHistogramStatistics =
vtkSmartPointer<vtkImageHistogramStatistics>::New();
imageHistogramStatistics->SetInputData(imageData);
imageHistogramStatistics->Update();
qDebug() << "Image Histogram Statistics:";
qDebug() << " min:" << imageHistogramStatistics->GetMinimum();
qDebug() << " max:" << imageHistogramStatistics->GetMaximum();
qDebug() << " mean:" << imageHistogramStatistics->GetMean();
qDebug() << " dev:" <<
imageHistogramStatistics->GetStandardDeviation();
auto imageAccumulate = vtkSmartPointer<vtkImageAccumulate>::New();
imageAccumulate->SetComponentSpacing(0.01, 0, 0);
imageAccumulate->SetComponentExtent(0, 499, 0, 0, 0, 0);
imageAccumulate->SetInputData(imageData);
imageAccumulate->Update();
auto plot = vtkSmartPointer<vtkXYPlotActor>::New();
plot->ExchangeAxesOff();
plot->SetXTitle("");
plot->SetYTitle("");
plot->SetLabelFormat("%g");
plot->SetXValuesToValue();
plot->AddDataSetInputConnection(imageAccumulate->GetOutputPort());
renderer()->AddActor(plot);
Where imageData is the rendered vtkImageData.
Elvis
> Elvis
>
> PS. If you're confused by the range of the vtkAxisActor that you see in
> the screenshots, when comparing to the the volume sizes I stated above,
> it's because my custom render currently hardcodes the spacing to 0.2. DS.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160811/60928090/attachment-0001.html>
More information about the vtkusers
mailing list