[vtkusers] 3d texture map volume rendering

SungeunKim sungeun at ecn.purdue.edu
Tue Jun 28 13:50:49 EDT 2005


Thank you for your help. Now, mine is working.

Sungeun

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