[vtkusers] 3d texture map volume rendering

Todd Gable Todd_Gable at invision.iip.com
Tue Jun 28 12:59:25 EDT 2005


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
>
>
>





More information about the vtkusers mailing list