[vtkusers] 3d texture map volume rendering

Lisa Avila lisa.avila at kitware.com
Tue Jun 28 14:02:39 EDT 2005


Hi Todd,

Thanks for finding that - I thought that had been fixed a while ago (an 
accidental check in obviously!) I'll fix it in CVS.

Lisa

At 01:55 PM 6/28/2005, Todd Gable wrote:
>I found this in the CVS that I got last night in 
>vtkOpenGLVolumeTextureMapper3D.cxx,
>
>   if ( supports_GL_EXT_texture3D          && 0 &&
>        supports_GL_ARB_multitexture       &&
>        supports_GL_ARB_fragment_program   &&
>        this->glTexImage3DEXT              &&
>        this->glActiveTextureARB           &&
>        this->glMultiTexCoord3fvARB        &&
>        this->glGenProgramsARB             &&
>        this->glDeleteProgramsARB          &&
>        this->glBindProgramARB             &&
>        this->glProgramStringARB           &&
>        this->glProgramLocalParameter4fARB )
>     {
>
>I tried my program on a different machine with a 9800 Pro and got the 
>"Required extension not supported" message, you can see why. No ATI 
>hardware was going to run. I fixed it and rebuilt. It runs great now. To 
>answer my last question, it is far faster on a newer card, even though the 
>computer is a third as fast, the 9800 pro made the rendering 5X faster 
>compared to my low end Quadro.
>
>Todd
>
>
>-----Original Message-----
>From: Lisa Avila [mailto:lisa.avila at kitware.com]
>Sent: Monday, June 27, 2005 8:18 PM
>To: SungeunKim; Lisa Avila
>Cc: vtkusers at vtk.org
>Subject: Re: [vtkusers] 3d texture map volume rendering
>
>
>
>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