[vtkusers] 3d texture map volume rendering

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


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





More information about the vtkusers mailing list