[vtkusers] 3d texture map volume rendering

Todd Gable Todd_Gable at invision.iip.com
Tue Jun 28 13:55:54 EDT 2005


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






More information about the vtkusers mailing list