[vtkusers] 3d texture map volume rendering

Todd Gable Todd_Gable at invision.iip.com
Tue Jun 28 14:09:28 EDT 2005


I saw that in the doc file after I sent it, sorry about my haste.

-----Original Message-----
From: Lisa Avila [mailto:lisa.avila at kitware.com]
Sent: Tuesday, June 28, 2005 11:05 AM
To: Todd Gable; SungeunKim; Lisa Avila
Cc: vtkusers at vtk.org
Subject: RE: [vtkusers] 3d texture map volume rendering



Hi Todd,

The IsRenderSupported method can ONLY be called AFTER a render has 
occurred, since we need a valid OpenGL context. Of course, this should not 
have caused a crash but rather just a bad result (indicating that the 
extensions are not supported). I'll look into it...

Lisa


At 12:59 PM 6/28/2005, Todd Gable wrote:
>I just tried the 3D mapper and found this line crashed my program:
>
>volumeMapper->IsRenderSupported(volumeProperty);
>
>I took it out and it ran fine.
>
>I found the 3D mapper runs really slow on my Quadro NVS 280. I know this 
>is a slow card, what could I expect from a newer 6800 or X800 class card? 
>Thanks.
>
>Todd
>
>-----Original Message-----
>From: SungeunKim [mailto:sungeun at ecn.purdue.edu]
>Sent: Monday, June 27, 2005 9:36 PM
>To: Lisa Avila
>Cc: vtkusers at vtk.org
>Subject: Re: [vtkusers] 3d texture map volume rendering
>
>
>Thank you, Lisa.
>BTW, can I get some example source code for vtkVolumeTextureMapper3D?
>
>Sungeun Kim.
>
>Lisa Avila wrote:
>
> >
> > Hi Sungeun,
> >
> > I'm out of suggestions except to run it in a debugger and see if it
> > picks up anything earlier than your crash that might give us a clue.
> >
> > Lisa
> >
> > At 05:30 PM 6/27/2005, SungeunKim wrote:
> >
> >> Hi Lisa,
> >>
> >> The returned class name is vtkOpenGLVolumeTextureMapper3D. The next
> >> command is
> >>
> >> textureMap3D->SetInput(v16->GetOutput());
> >>
> >> but at this point, the program crashes.
> >>
> >> Sungeun
> >>
> >> Lisa Avila wrote:
> >>
> >>> Hi Sungeun Kim,
> >>>
> >>> OK - your mapper is not null. Can you please check the value of
> >>> mapper->GetClassName() - it should be
> >>> vtkOpenGLVolumeTextureMapper3D. If it is vtkVolumeTextureMapper3D
> >>> then something went wrong in the volume rendering factor that
> >>> creates the correct subclass (this should not cause you to crash,
> >>> but it will not render an image)
> >>>
> >>> Lisa
> >>>
> >>>
> >>>
> >>> At 05:17 PM 6/27/2005, SungeunKim wrote:
> >>>
> >>>> Hi Lisa Avila,
> >>>>
> >>>> I am using OpenGL, not Mesa. And I tested whether
> >>>> vtkVolumeTextureMapper3D::New() returns NULL or not with this code:
> >>>>
> >>>> vtkVolumeTextureMapper3D *mapper = NULL;
> >>>> mapper = vtkVolumeTextureMapper3D::New();
> >>>>
> >>>> if(mapper == NULL)
> >>>> {
> >>>>    printf("Cannot create mapper\n");
> >>>> }
> >>>>
> >>>> And the pointer was not NULL.
> >>>> To make sure that I am using OpenGL, is there any ways to check
> >>>> whether I am using OpenGL, not Mesa?
> >>>>
> >>>> Sungeun Kim.
> >>>>
> >>>> Lisa Avila wrote:
> >>>>
> >>>>>
> >>>>> Hi Sungeun Kim,
> >>>>>
> >>>>> Are you using OpenGL? The 3D texture mapper is not supported for
> >>>>> Mesa (although you should just get back a vtkVolumeTextureMapper3D
> >>>>> when you do a New() - not null).
> >>>>>
> >>>>> So, if I understand correctly, you can create a simple Cxx program
> >>>>> with this:
> >>>>>
> >>>>> vtkVolumeTextureMapper3D *mapper = vtkVolumeTextureMapper3D::New();
> >>>>>
> >>>>> and at this point mapper would be null?
> >>>>>
> >>>>> Lisa
> >>>>>
> >>>>>
> >>>>> At 04:59 PM 6/27/2005, SungeunKim wrote:
> >>>>>
> >>>>>> Hi,
> >>>>>>
> >>>>>> I tested on NVidia GeForce FX 5900 Ultra 256MB and the error that
> >>>>>> I have is
> >>>>>>
> >>>>>> after create the mapper, no matter what member funcions of that
> >>>>>> mapper I call, my program is terminated with an error message,
> >>>>>> saying "a command at "0x--------------" is referencing
> >>>>>> "0x00000000" memory and memory cannot be read".
> >>>>>>
> >>>>>> What can it be the possible reason for this error?
> >>>>>>
> >>>>>> Sungeun Kim.
> >>>>>>
> >>>>>> Yogi Girdhar wrote:
> >>>>>>
> >>>>>>> What is the error?
> >>>>>>> What kind of graphics card do you have? As far as I know, this
> >>>>>>> mapper is
> >>>>>>> highly dependent on your graphics hardware. I know it works for
> >>>>>>> newer
> >>>>>>> NVIDIA cards, but I am not sure about others.
> >>>>>>>
> >>>>>>> -Yogi
> >>>>>>>
> >>>>>>>
> >>>>>>> Sun Geun Kim wrote:
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>> Hi,
> >>>>>>>>
> >>>>>>>> I am testing cvs-version VTK library on MS Windows platform(Win
> >>>>>>>> XP).There was no problem in compilation. However, when I test
> >>>>>>>> vtkVolumeTextureMap3D mapper with a simple volume
> >>>>>>>> (headsq/quater), it
> >>>>>>>> always gives me an error message. Does this mapper work
> >>>>>>>> correctly? I
> >>>>>>>> checked out the source code on June 20th. If it works right,
> >>>>>>>> can I get
> >>>>>>>> any example c-source code?
> >>>>>>>>
> >>>>>>>> For your refernce, I attach my file. If there is anybody who
> >>>>>>>> make that
> >>>>>>>> mapper work, please check my source code.
> >>>>>>>>
> >>>>>>>> Thank you in advance
> >>>>>>>>
> >>>>>>>> ===========================
> >>>>>>>> Sun Geun Kim
> >>>>>>>> Ph.D student
> >>>>>>>> School of Electrical and Computer Engineering
> >>>>>>>> Purdue University
> >>>>>>>>
> >>>>>>>> ---------------------------
> >>>>>>>> email: sungeun at ecn.purdue.edu
> >>>>>>>>
> >>>>>>>> 
> ------------------------------------------------------------------------
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> 
> /*=========================================================================
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> Program:   Visualization Toolkit
> >>>>>>>>
> >>>>>>>> Module:    $RCSfile: Medical3.cxx,v $
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> 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.
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> 
> =========================================================================*/
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> //
> >>>>>>>> // This example reads a volume dataset, extracts two
> >>>>>>>> isosurfaces that
> >>>>>>>>
> >>>>>>>> // represent the skin and bone, creates three orthogonal planes
> >>>>>>>> // (saggital, axial, coronal), and displays them.
> >>>>>>>>
> >>>>>>>> //
> >>>>>>>>
> >>>>>>>> #include "vtkRenderer.h"
> >>>>>>>>
> >>>>>>>> #include "vtkRenderWindow.h"
> >>>>>>>>
> >>>>>>>> #include "vtkRenderWindowInteractor.h"
> >>>>>>>>
> >>>>>>>> #include "vtkVolume16Reader.h"
> >>>>>>>>
> >>>>>>>> #include "vtkCamera.h"
> >>>>>>>>
> >>>>>>>> #include "vtkImageData.h"
> >>>>>>>>
> >>>>>>>> #include "vtkPiecewiseFunction.h"
> >>>>>>>>
> >>>>>>>> #include "vtkVolume.h"
> >>>>>>>>
> >>>>>>>> #include "vtkVolumeProperty.h"
> >>>>>>>>
> >>>>>>>> #include "vtkColorTransferFunction.h"
> >>>>>>>>
> >>>>>>>> #include "vtkVolumeRayCastCompositeFunction.h"
> >>>>>>>>
> >>>>>>>> #include "vtkVolumeRayCastIsosurfaceFunction.h"
> >>>>>>>>
> >>>>>>>> #include "vtkVolumeRayCastMIPFunction.h"
> >>>>>>>>
> >>>>>>>> #include "vtkVolumeRayCastMapper.h"
> >>>>>>>>
> >>>>>>>> #include "vtkVolumeTextureMapper2D.h"
> >>>>>>>>
> >>>>>>>> #include "vtkVolumeTextureMapper3D.h"
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> int main (int argc, char **argv)
> >>>>>>>>
> >>>>>>>> {
> >>>>>>>>
> >>>>>>>> if (argc < 2)
> >>>>>>>>
> >>>>>>>>   {
> >>>>>>>>
> >>>>>>>>     cout << "Usage: " << argv[0] << " DATADIR/headsq/quarter"
> >>>>>>>> << endl;
> >>>>>>>>
> >>>>>>>>   return 1;
> >>>>>>>>
> >>>>>>>>   }
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> // Create the renderer, the render window, and the interactor. The
> >>>>>>>>
> >>>>>>>> // renderer draws into the render window, the interactor enables
> >>>>>>>>
> >>>>>>>> // mouse- and keyboard-based interaction with the data within the
> >>>>>>>>
> >>>>>>>> // render window.
> >>>>>>>>
> >>>>>>>> //
> >>>>>>>>
> >>>>>>>> vtkRenderer *aRenderer = vtkRenderer::New();
> >>>>>>>>
> >>>>>>>> vtkRenderWindow *renWin = vtkRenderWindow::New();
> >>>>>>>>
> >>>>>>>>   renWin->AddRenderer(aRenderer);
> >>>>>>>>
> >>>>>>>> vtkRenderWindowInteractor *iren =
> >>>>>>>> vtkRenderWindowInteractor::New();
> >>>>>>>>
> >>>>>>>>   iren->SetRenderWindow(renWin);
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> // The following reader is used to read a series of 2D slices
> >>>>>>>> (images)
> >>>>>>>>
> >>>>>>>> // that compose the volume. The slice dimensions are set, and the
> >>>>>>>>
> >>>>>>>> // pixel spacing. The data Endianness must also be specified. The
> >>>>>>>>
> >>>>>>>> // reader usese the FilePrefix in combination with the slice
> >>>>>>>> number to
> >>>>>>>>
> >>>>>>>> // construct filenames using the format FilePrefix.%d. (In this
> >>>>>>>> case
> >>>>>>>>
> >>>>>>>> // the FilePrefix is the root name of the file: quarter.)
> >>>>>>>>
> >>>>>>>> vtkVolume16Reader *v16 = vtkVolume16Reader::New();
> >>>>>>>>
> >>>>>>>>   v16->SetDataDimensions(64,64);
> >>>>>>>>
> >>>>>>>>   v16->SetDataByteOrderToLittleEndian();
> >>>>>>>>
> >>>>>>>>   v16->SetFilePrefix (argv[1]);
> >>>>>>>>
> >>>>>>>>   v16->SetImageRange(1, 93);
> >>>>>>>>
> >>>>>>>>   v16->SetDataSpacing (3.2, 3.2, 1.5);
> >>>>>>>>
> >>>>>>>> /*
> >>>>>>>>
> >>>>>>>> vtkVolumeRayCastCompositeFunction *compositeFunction =
> >>>>>>>> vtkVolumeRayCastCompositeFunction::New();
> >>>>>>>>
> >>>>>>>> compositeFunction->SetCompositeMethodToInterpolateFirst();
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> vtkVolumeRayCastMIPFunction *MIPFunction =
> >>>>>>>> vtkVolumeRayCastMIPFunction::New();
> >>>>>>>>
> >>>>>>>> MIPFunction->SetMaximizeMethodToScalarValue();
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> vtkVolumeRayCastIsosurfaceFunction *isosurfaceFunction =
> >>>>>>>> vtkVolumeRayCastIsosurfaceFunction::New();
> >>>>>>>>
> >>>>>>>> isosurfaceFunction->SetIsoValue(80);
> >>>>>>>>
> >>>>>>>> */
> >>>>>>>>
> >>>>>>>> // Create a transfer function mapping scalar value to color
> >>>>>>>> (color)
> >>>>>>>>
> >>>>>>>> vtkColorTransferFunction *cTFun = vtkColorTransferFunction::New();
> >>>>>>>>
> >>>>>>>> cTFun->AddRGBPoint(  0.0, 0.0, 0.0, 0.0 );
> >>>>>>>>
> >>>>>>>> cTFun->AddRGBPoint(  500.0, 1.0, 0.49, 0.35 );
> >>>>>>>>
> >>>>>>>> cTFun->AddRGBPoint( 800.0, 0.81, 0.27, 0.1 );
> >>>>>>>>
> >>>>>>>> cTFun->AddRGBPoint( 1150.0, 0.92,0.9, 0.89 );
> >>>>>>>>
> >>>>>>>> cTFun->AddRGBPoint( 4095.0, 0.5, 0.5, 0.5 );
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> // Create a transfer function mapping magnitude of gradient to
> >>>>>>>> opacity
> >>>>>>>>
> >>>>>>>> vtkPiecewiseFunction *goTFun = vtkPiecewiseFunction::New();
> >>>>>>>>
> >>>>>>>> goTFun->AddPoint(   0, 0.0 );
> >>>>>>>>
> >>>>>>>> goTFun->AddPoint(  50, 0.0 );
> >>>>>>>>
> >>>>>>>> goTFun->AddPoint(  150, 1.0 );
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> vtkPiecewiseFunction *oTFun = vtkPiecewiseFunction::New();
> >>>>>>>>
> >>>>>>>> oTFun->AddPoint(20.0, 0.0);
> >>>>>>>>
> >>>>>>>> oTFun->AddSegment(20.0, 0.0, 500.0, 0.15);
> >>>>>>>>
> >>>>>>>> oTFun->AddSegment(500.0, 0.2, 1150.0, 0.35);
> >>>>>>>>
> >>>>>>>> oTFun->AddSegment(1150.0, 0.8, 3000.0, 0.45);
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();
> >>>>>>>>
> >>>>>>>>         volumeProperty->SetColor(cTFun);
> >>>>>>>>
> >>>>>>>>         volumeProperty->SetGradientOpacity(goTFun);
> >>>>>>>>
> >>>>>>>>         volumeProperty->SetScalarOpacity(oTFun);
> >>>>>>>>
> >>>>>>>>         volumeProperty->ShadeOn();
> >>>>>>>>
> >>>>>>>>         volumeProperty->SetInterpolationTypeToLinear();
> >>>>>>>>
> >>>>>>>> //      volumeProperty->SetAmbient(material->GetAmbient());
> >>>>>>>>
> >>>>>>>> //      volumeProperty->SetDiffuse(material->GetDiffuse());
> >>>>>>>>
> >>>>>>>> //      volumeProperty->SetSpecular(material->GetSpecular());
> >>>>>>>>
> >>>>>>>> //
> >>>>>>>> volumeProperty->SetSpecularPower(material->GetSpecularPower());
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>         vtkVolume *volume = vtkVolume::New();
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>         vtkVolumeTextureMapper3D *textureMap3D =
> >>>>>>>> vtkVolumeTextureMapper3D::New();
> >>>>>>>>
> >>>>>>>>         textureMap3D->IsRenderSupported(volumeProperty);
> >>>>>>>>
> >>>>>>>>         textureMap3D->SetInput(v16->GetOutput());
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>         volume->SetMapper(textureMap3D);
> >>>>>>>>
> >>>>>>>>         volume->SetProperty(volumeProperty);
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> // It is convenient to create an initial view of the data. The
> >>>>>>>>
> >>>>>>>> // FocalPoint and Position form a vector direction. Later on
> >>>>>>>>
> >>>>>>>> // (ResetCamera() method) this vector is used to position the
> >>>>>>>> camera
> >>>>>>>>
> >>>>>>>> // to look at the data in this direction.
> >>>>>>>>
> >>>>>>>> vtkCamera *aCamera = vtkCamera::New();
> >>>>>>>>
> >>>>>>>>   aCamera->SetViewUp (0, 0, -1);
> >>>>>>>>
> >>>>>>>>   aCamera->SetPosition (0, 1, 0);
> >>>>>>>>
> >>>>>>>>   aCamera->SetFocalPoint (0, 0, 0);
> >>>>>>>>
> >>>>>>>>   aCamera->ComputeViewPlaneNormal();
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> // Actors are added to the renderer.
> >>>>>>>>         aRenderer->AddVolume(volume);
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> // An initial camera view is created.  The Dolly() method moves
> >>>>>>>> // the camera towards the FocalPoint, thereby enlarging the image.
> >>>>>>>>
> >>>>>>>> aRenderer->SetActiveCamera(aCamera);
> >>>>>>>>
> >>>>>>>> aRenderer->Render();
> >>>>>>>>
> >>>>>>>> aRenderer->ResetCamera ();
> >>>>>>>>
> >>>>>>>> aCamera->Dolly(1.5);
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> // Set a background color for the renderer and set the size of the
> >>>>>>>>
> >>>>>>>> // render window (expressed in pixels).
> >>>>>>>>
> >>>>>>>> aRenderer->SetBackground(1,1,1);
> >>>>>>>>
> >>>>>>>> renWin->SetSize(640, 480);
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> // Note that when camera movement occurs (as it does in the
> >>>>>>>> Dolly()
> >>>>>>>>
> >>>>>>>> // method), the clipping planes often need adjusting. Clipping
> >>>>>>>> planes
> >>>>>>>>
> >>>>>>>> // consist of two planes: near and far along the view
> >>>>>>>> direction. The
> >>>>>>>> // near plane clips out objects in front of the plane; the far
> >>>>>>>> plane
> >>>>>>>>
> >>>>>>>> // clips out objects behind the plane. This way only what is drawn
> >>>>>>>>
> >>>>>>>> // between the planes is actually rendered.
> >>>>>>>>
> >>>>>>>> aRenderer->ResetCameraClippingRange ();
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> // interact with data
> >>>>>>>>
> >>>>>>>> iren->Initialize();
> >>>>>>>>
> >>>>>>>> iren->Start();
> >>>>>>>>
> >>>>>>>> // It is important to delete all objects created previously to
> >>>>>>>> prevent
> >>>>>>>>
> >>>>>>>> // memory leaks. In this case, since the program is on its way to
> >>>>>>>>
> >>>>>>>> // exiting, it is not so important. But in applications it is
> >>>>>>>>
> >>>>>>>> // essential.
> >>>>>>>>
> >>>>>>>> v16->Delete();
> >>>>>>>>
> >>>>>>>> aCamera->Delete();
> >>>>>>>>
> >>>>>>>> aRenderer->Delete();
> >>>>>>>>
> >>>>>>>> renWin->Delete();
> >>>>>>>>
> >>>>>>>> iren->Delete();
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> volume->Delete();
> >>>>>>>>
> >>>>>>>> volumeProperty->Delete();
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> oTFun->Delete();
> >>>>>>>>
> >>>>>>>> goTFun->Delete();
> >>>>>>>>
> >>>>>>>> cTFun->Delete();
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> textureMap3D->Delete();
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> return 0;
> >>>>>>>>
> >>>>>>>> }
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> 
> ------------------------------------------------------------------------
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> _______________________________________________
> >>>>>>>> This is the private VTK discussion list. Please keep messages
> >>>>>>>> on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> >>>>>>>> Follow this link to subscribe/unsubscribe:
> >>>>>>>> http://www.vtk.org/mailman/listinfo/vtkusers
> >>>>>>>
> >>>>>>>
> >>>>>>> _______________________________________________
> >>>>>>> This is the private VTK discussion list. Please keep messages
> >>>>>>> on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> >>>>>>> Follow this link to subscribe/unsubscribe:
> >>>>>>> http://www.vtk.org/mailman/listinfo/vtkusers
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> _______________________________________________
> >>>>>> This is the private VTK discussion list. Please keep messages
> >>>>>> on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> >>>>>> Follow this link to subscribe/unsubscribe:
> >>>>>> http://www.vtk.org/mailman/listinfo/vtkusers
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>> _______________________________________________
> >>>>> This is the private VTK discussion list. Please keep messages
> >>>>> on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> >>>>> Follow this link to subscribe/unsubscribe:
> >>>>> http://www.vtk.org/mailman/listinfo/vtkusers
> >>>>
> >>>>
> >>>>
> >>>
> >>>
> >>> _______________________________________________
> >>> This is the private VTK discussion list. Please keep messages
> >>> on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> >>> Follow this link to subscribe/unsubscribe:
> >>> http://www.vtk.org/mailman/listinfo/vtkusers
> >>
> >>
> >>
> >> _______________________________________________
> >> This is the private VTK discussion list. Please keep messages
> >> on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> >> Follow this link to subscribe/unsubscribe:
> >> http://www.vtk.org/mailman/listinfo/vtkusers
> >
> >
> >
>
>
>_______________________________________________
>This is the private VTK discussion list.
>Please keep messages on-topic. Check the FAQ at: 
>http://www.vtk.org/Wiki/VTK_FAQ
>Follow this link to subscribe/unsubscribe:
>http://www.vtk.org/mailman/listinfo/vtkusers





More information about the vtkusers mailing list