Commit f48e3e5b authored by Aashish Chaudhary's avatar Aashish Chaudhary Committed by Kitware Robot

Merge topic 'volume_fix_gradient_opacity'

f2a95cf2 Fixed style issues
80e6e809 Updated test and baselines to avoid aliasing artifacts
c7cc87fc Fixed undefined variable
0917b2c3 Added missing baseline
73c5aa6d Fixed various issues with gradient opacity
147f22e2 Added test for independent two component gradient computation
5754a747 Fixed gradient computation and shading for multiple components
Acked-by: Kitware Robot's avatarKitware Robot <kwrobot@kitware.com>
Acked-by: Aashish Chaudhary's avatarAashish Chaudhary <aashish.chaudhary@kitware.com>
Merge-request: !1007
parents 959ed938 f2a95cf2
Pipeline #2516 running with stage
......@@ -63,6 +63,7 @@ set (VolumeOpenGL2CxxTests
TestGPURayCastRenderToTexture.cxx
TestGPURayCastThreeComponentsIndependent.cxx
TestGPURayCastTwoComponentsDependent.cxx
TestGPURayCastTwoComponentsGradient.cxx
TestGPURayCastTwoComponentsIndependent.cxx
TestGPURayCastVolumeLightKit.cxx
TestGPURayCastVolumePolyData.cxx
......
#include <vtkSmartPointer.h>
#include <vtkPlanes.h>
#include <vtkCamera.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
/*=========================================================================
Program: Visualization Toolkit
Module: TestGPURayCastTwoComponentsIndependent.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// Description
// This test creates a vtkImageData with two components.
// The data is volume rendered considering the two components as independent.
#include "vtkCamera.h"
#include "vtkColorTransferFunction.h"
#include "vtkGPUVolumeRayCastMapper.h"
#include "vtkImageData.h"
#include "vtkNew.h"
#include "vtkPiecewiseFunction.h"
#include "vtkRegressionTestImage.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkTesting.h"
#include "vtkTestUtilities.h"
#include "vtkVolume.h"
#include "vtkVolumeProperty.h"
#include "vtkUnsignedShortArray.h"
int TestGPURayCastTwoComponentsGradient(int argc, char *argv[])
{
cout << "CTEST_FULL_OUTPUT (Avoid ctest truncation of output)" << endl;
int dims[3] = { 35, 35, 35 };
// Create a vtkImageData with two components
vtkNew<vtkImageData> image;
image->SetDimensions(dims[0], dims[1], dims[2]);
image->AllocateScalars(VTK_DOUBLE, 2);
// Fill the first half rectangular parallelopiped along X with the
// first component values and the second half with second component values
double * ptr = static_cast<double *> (image->GetScalarPointer(0, 0, 0));
for (int z = 0; z < dims[2]; ++z)
{
for (int y = 0; y < dims[1]; ++y)
{
for (int x = 0; x < dims[0]; ++x)
{
if (x < dims[0] / 2)
{
*ptr++ = 0.0;
*ptr++ = 0.0;
}
else
{
*ptr++ = 1.0;
*ptr++ = 1.0;
}
}
}
}
vtkNew<vtkRenderWindow> renWin;
renWin->SetSize(301, 300); // Intentional NPOT size
renWin->SetMultiSamples(0);
vtkNew<vtkRenderer> ren;
renWin->AddRenderer(ren.GetPointer());
vtkNew<vtkRenderWindowInteractor> iren;
iren->SetRenderWindow(renWin.GetPointer());
renWin->Render();
// Volume render the dataset
vtkNew<vtkGPUVolumeRayCastMapper> mapper;
mapper->AutoAdjustSampleDistancesOff();
mapper->SetSampleDistance(0.9);
mapper->SetInputData(image.GetPointer());
// Color transfer function
vtkNew<vtkColorTransferFunction> ctf1;
ctf1->AddRGBPoint(0.0, 0.0, 0.0, 0.0);
ctf1->AddRGBPoint(1.0, 1.0, 0.0, 0.0);
vtkNew<vtkColorTransferFunction> ctf2;
ctf2->AddRGBPoint(0.0, 0.0, 0.0, 0.0);
ctf2->AddRGBPoint(1.0, 0.0, 0.0, 1.0);
// Opacity functions
vtkNew<vtkPiecewiseFunction> pf1;
pf1->AddPoint(0.0, 0.0);
pf1->AddPoint(1.0, 1.0);
vtkNew<vtkPiecewiseFunction> pf2;
pf2->AddPoint(0.0, 0.0);
pf2->AddPoint(1.0, 1.0);
// Gradient Opacity function
vtkNew<vtkPiecewiseFunction> pf3;
pf3->AddPoint(0.0, 0.0);
pf3->AddPoint(1.0, 1.0);
vtkNew<vtkPiecewiseFunction> pf4;
pf4->AddPoint(0.0, 0.0);
pf4->AddPoint(1.0, 1.0);
// Volume property with independent components ON
vtkNew<vtkVolumeProperty> property;
property->IndependentComponentsOn();
// Set color and opacity functions
property->SetColor(0, ctf1.GetPointer());
property->SetColor(1, ctf2.GetPointer());
property->SetScalarOpacity(0, pf1.GetPointer());
property->SetScalarOpacity(1, pf2.GetPointer());
property->SetGradientOpacity(0, pf3.GetPointer());
property->SetGradientOpacity(1, pf4.GetPointer());
vtkNew<vtkVolume> volume;
volume->SetMapper(mapper.GetPointer());
volume->SetProperty(property.GetPointer());
ren->AddVolume(volume.GetPointer());
ren->ResetCamera();
renWin->Render();
iren->Initialize();
int retVal = vtkRegressionTestImage( renWin.GetPointer() );
if( retVal == vtkRegressionTester::DO_INTERACTOR)
{
iren->Start();
}
return !retVal;
}
......@@ -112,6 +112,11 @@ public:
this->TextureSize[0] = this->TextureSize[1] = this->TextureSize[2] = -1;
this->WindowLowerLeft[0] = this->WindowLowerLeft[1] = 0;
this->WindowSize[0] = this->WindowSize[1] = 0;
this->ScalarsRange[0][0] = this->ScalarsRange[0][1] = 0.0;
this->ScalarsRange[1][0] = this->ScalarsRange[1][1] = 0.0;
this->ScalarsRange[2][0] = this->ScalarsRange[2][1] = 0.0;
this->ScalarsRange[3][0] = this->ScalarsRange[3][1] = 0.0;
this->CellScale[0] = this->CellScale[1] = this->CellScale[2] = 0.0;
this->NoiseTextureData = 0;
......@@ -128,7 +133,6 @@ public:
this->MaskTextures = new vtkMapMaskTextureId;
this->ScalarsRange.clear();
this->Scale.clear();
this->Bias.clear();
......@@ -181,7 +185,6 @@ public:
delete this->MaskTextures;
this->ScalarsRange.clear();
this->Scale.clear();
this->Bias.clear();
}
......@@ -201,6 +204,8 @@ public:
static void ToFloat(T (&in)[2], float (&out)[2]);
template<typename T>
static void ToFloat(T& in, float& out);
template<typename T>
static void ToFloat(T (&in)[4][2], float (&out)[4][2]);
void Initialize(vtkRenderer* ren, vtkVolume* vol,
int noOfComponents, int independentComponents);
......@@ -316,9 +321,8 @@ public:
int TextureSize[3];
int WindowLowerLeft[2];
int WindowSize[2];
int LastWindowSize[2];
std::vector< std::vector<double> > ScalarsRange;
double ScalarsRange[4][2];
double LoadedBounds[6];
int Extents[6];
double DatasetStepSize[3];
......@@ -432,6 +436,21 @@ void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::ToFloat(
out = static_cast<float>(in);
}
//----------------------------------------------------------------------------
template<typename T>
void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::ToFloat(
T (&in)[4][2], float (&out)[4][2])
{
out[0][0] = static_cast<float>(in[0][0]);
out[0][1] = static_cast<float>(in[0][1]);
out[1][0] = static_cast<float>(in[1][0]);
out[1][1] = static_cast<float>(in[1][1]);
out[2][0] = static_cast<float>(in[2][0]);
out[2][1] = static_cast<float>(in[2][1]);
out[3][0] = static_cast<float>(in[3][0]);
out[3][1] = static_cast<float>(in[3][1]);
}
//----------------------------------------------------------------------------
void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::Initialize(
vtkRenderer* vtkNotUsed(ren), vtkVolume* vol, int
......@@ -699,8 +718,8 @@ bool vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::LoadVolume(
for (int n = 0; n < noOfComponents; ++n)
{
double oglA = this->ScalarsRange[n][0]*oglScale + oglBias;
double oglB = this->ScalarsRange[n][1]*oglScale + oglBias;
double oglA = this->ScalarsRange[n][0] * oglScale + oglBias;
double oglB = this->ScalarsRange[n][1] * oglScale + oglBias;
scale[n] = 1.0/ (oglB - oglA);
bias[n] = 0.0 - oglA*scale[n];
}
......@@ -2252,8 +2271,9 @@ void vtkOpenGLGPUVolumeRayCastMapper::BuildShader(vtkRenderer* ren,
fragmentShader,
"//VTK::Base::Dec",
vtkvolume::BaseDeclarationFragment(ren, this, vol, this->Impl->NumberOfLights,
this->Impl->LightComplexity, noOfComponents,
independentComponents),
this->Impl->LightComplexity,
vol->GetProperty()->HasGradientOpacity(),
noOfComponents, independentComponents),
true);
fragmentShader = vtkvolume::replace(
......@@ -2390,7 +2410,6 @@ void vtkOpenGLGPUVolumeRayCastMapper::BuildShader(vtkRenderer* ren,
"//VTK::Cropping::Dec",
vtkvolume::CroppingDeclarationVertex(ren, this, vol),
true);
fragmentShader = vtkvolume::replace(
fragmentShader,
"//VTK::Cropping::Dec",
......@@ -2752,11 +2771,6 @@ void vtkOpenGLGPUVolumeRayCastMapper::GPURender(vtkRenderer* ren,
// Allocate important variables
this->Impl->Bias.resize(noOfComponents, 0.0);
this->Impl->ScalarsRange.resize(noOfComponents);
for (int n = 0; n < noOfComponents; ++n)
{
this->Impl->ScalarsRange[n].resize(2, 0.0);
}
// Set OpenGL states
vtkVolumeStateRAII glState;
......@@ -2970,13 +2984,10 @@ void vtkOpenGLGPUVolumeRayCastMapper::GPURender(vtkRenderer* ren,
this->Impl->ShaderProgram->SetUniformf("in_sampleDistance",
this->Impl->ActualSampleDistance);
double scalarRange[2];
for (int i = 0; i < 2; ++i)
{
scalarRange[i] = this->Impl->ScalarsRange[noOfComponents - 1][i];
}
vtkInternal::ToFloat(scalarRange, fvalue2);
this->Impl->ShaderProgram->SetUniform2fv("in_scalarsRange", 1, &fvalue2);
float scalarsRange[4][2];
vtkInternal::ToFloat(this->Impl->ScalarsRange, scalarsRange);
this->Impl->ShaderProgram->SetUniform2fv("in_scalarsRange", 4,
scalarsRange);
// Bind textures
this->Impl->VolumeTextureObject->Activate();
......
......@@ -106,12 +106,12 @@ public:
}
gradientOpacity->GetTable(0,
(this->LastRange[1] - this->LastRange[0]) * 0.25,
this->TextureWidth, this->Table);
(this->LastRange[1] - this->LastRange[0]) * 0.25,
this->TextureWidth, this->Table);
this->TextureObject->Create2DFromRaw(this->TextureWidth,1,1,
VTK_FLOAT,
this->Table);
this->TextureObject->Create2DFromRaw(this->TextureWidth, 1, 1,
VTK_FLOAT,
this->Table);
this->TextureObject->SetWrapS(vtkTextureObject::ClampToEdge);
this->TextureObject->SetMagnificationFilter(filterValue);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment