[vtkusers] 3d texture map volume rendering

SungeunKim sungeun at ecn.purdue.edu
Mon Jun 27 17:30:58 EDT 2005


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





More information about the vtkusers mailing list