[vtkusers] Improving rendering speed

Ajit Rajwadé ajit_v_r at hotmail.com
Wed Jun 18 12:40:38 EDT 2003


>From: "Charl P. Botha" <c.p.botha at ewi.tudelft.nl>
>On Wed, 2003-06-18 at 17:20, Ajit Rajwadé wrote:
> > From: "Charl P. Botha" <c.p.botha at its.tudelft.nl>
> > >Ajit Rajwadé wrote:
> > >>I need some tips for improving rendering speed. I am rendering a 3D
> > >>surface (from 8000 points) and it takes 15 seconds for the Render 
>routine.
> > >>Is this merely a hardware problem?
> > >
> > >No, this is merely a user problem. :)
> > >>   // Create isosurface
> > >>vtkContourFilter *cf = vtkContourFilter::New();
> > >>  cf->SetInput(surf->GetOutput());
> > >>  cf->SetValue(0,0.0);
> > >>  cout << "Isosurface construction done..." << endl;
> > >
> > >Don't you find it strange that when you run your program, this line 
>prints
> > >out very soon after you start the program?  How do you think VTK knows 
>to
> > >execute your surface reconstruction and contouring right here?
> > >
> >
> > Thanks, yes I should have noticed that in the beginning itself.
> >
> > However, I am still facing the same trouble. It just takes too long to
> > render. 15 seconds for 8000 vertices is still bearble.  But I have 
>models
> > consisting of 76000 vertices and they take 3 minutes or more to render.
>
>Please keep this on the mailing list.  How are you measuring the time it
>takes to render your frame?  Your code below is STILL performing the
>calculation during your render!  In my applications, I routinely display
>triangle models of a few hundred thousand vertices (derived from medical
>data) and this remains more or less interactive, even on my old GeForce2
>GTS.
>

I actually tried doing the stripper update before the call to render as you 
had suggested but it made no difference to the performance at all.

I need to run the code I have given below iteratively. Each time, the vertex 
set is changing and therefore all the calculations will have to be re-done 
each time.

> >
> > Is there anything you could suggest me? I am sorry to disturb you, but I 
>am
> > really stuck with this problem.
> >
> > Here is my code again.
> >
> > 		// Create the VTK renderer and renderer window
> > 	    	vtkRenderer *ren = vtkRenderer::New();
> > 		vtkRenderWindow *renWin = vtkRenderWindow::New();
> > 		renWin->AddRenderer(ren);
> > 		renWin->SetSize (300,300);
> >
> > 		// Create the render window interactor
> > 	    	vtkRenderWindowInteractor *iren = 
>vtkRenderWindowInteractor::New();
> > 		iren->SetRenderWindow(renWin);
> >
> > 	    	// Create points
> >     		vtkPoints *meanPoints = vtkPoints::New();
> >
> > 		// Copy Mean into New
> > 		for (i=0;i<SIZE;i++)
> > 			for (j=0;j<3;j++)
> > 				New[i][j] = Mean [i][j];
> >
> > 		// New += alpha * sigma * S - compute the points
> > 		for (i=0;i<SIZE;i++)
> > 		{
> > 			for (j=1;j<=49;j++)
> > 			{
> > 				New[i][0] += storedPoints[j][i][0]*Alpha[j]*Sigma[j];
> > 				New[i][1] += storedPoints[j][i][1]*Alpha[j]*Sigma[j];
> > 				New[i][2] += storedPoints[j][i][2]*Alpha[j]*Sigma[j];
> > 			}
> > 		}
> >
> > 		// Inserting the points one by one
> > 		for (i=0;i<SIZE;i++)
> > 		{
> > 			point[0] = New[i][0];
> > 			point[1] = New[i][1];
> > 			point[2] = New[i][2];
> >
> > 			meanPoints->InsertNextPoint(point);
> > 		}
> >     		printf("\nCalculation of points done...");
> >
> >     		// Create a data set. Load the starting points
> > 	    	vtkPolyData *inputDataSet = vtkPolyData::New();
> > 	    	inputDataSet->SetPoints(meanPoints);
> >
> > 		vtkTriangleFilter *vtf = vtkTriangleFilter::New ();
> > 		vtf->SetInput (inputDataSet);
> >
> > 	    	// Construct the surface
> >     		vtkSurfaceReconstructionFilter *surf =
> > vtkSurfaceReconstructionFilter::New();
> > 	    	surf->SetInput(inputDataSet);
> >     		printf ("\nSurface construction done...");
> >
> >     		// Create isosurface (contour value of 0)
> > 	    	vtkContourFilter *cf = vtkContourFilter::New();
> > 	    	cf->SetInput(surf->GetOutput());
> > 	    	cf->SetValue(0,0.0);
> > 		cf->UseScalarTreeOn ();
> >     		printf("\nIsosurface construction done...");
> >
> > 		// PolyNormals Filter to obtain normals for "Smooth Shading"
> > 		vtkPolyDataNormals *bNormals = vtkPolyDataNormals::New();
> >     		bNormals->SetInput(cf ->GetOutput());
> >     		bNormals->SetFeatureAngle(60.0);
> >
> > 		// Creates Triangle strips from the Iso-surface
> >   		vtkStripper *bStripper = vtkStripper::New();
> >     		bStripper->SetInput(bNormals->GetOutput());
> >
> > 		// Create the mapper and actor and finish up the visualization 
>pipeline
> >     		vtkPolyDataMapper *map = vtkPolyDataMapper::New();
> > 		map->SetInput(bStripper->GetOutput());
> >     		map->ScalarVisibilityOff();
> > 		//map->ImmediateModeRenderingOn ();
> >
> > 	    	cout << "Mapper construction done..." << endl;
> >
> > 	    	vtkActor *surfaceActor = vtkActor::New();
> >     		surfaceActor->SetMapper( map );
> > 	    	surfaceActor->GetProperty()->SetDiffuseColor( 1.0000, 0.3882, 
>0.2784
> > );
> >     		surfaceActor->GetProperty()->SetSpecularColor( 1, 1, 1 );
> > 	    	surfaceActor->GetProperty()->SetSpecular(0.4);
> >     		surfaceActor->GetProperty()->SetSpecularPower(50);
> >
> > 	    	ren->AddActor(surfaceActor);
> >     		ren->SetBackground(1,1,1);
> > 		cout << "Surface actor construction done..." << endl;
> >
> > 		printf ("\nBefore the Rendering");
> > 	   	renWin->Render();
> >     		printf ("\nRendering done...");
> > 		iren->Initialize ();
> > 	    	iren->Start();
> >
> > 
>===================================================================================
> >
> > >Your complete VTK pipeline only starts to execute when you call the
> > >renWin->Render().  The 15 seconds that you're worrying about consists 
>of
> > >the actual surface reconstruction AND rendering.  Try doing a
> > >bStripper->Update() BEFORE you begin to render.
> > >
> > >You don't have to use the Update(), it's only to illustrate my point. 
>After
> > >your first long Render(), all subsequent Renders() should be much 
>faster.
> > >
>
>--
>charl p. botha http://cpbotha.net/ http://visualisation.tudelft.nl/
>_______________________________________________
>This is the private VTK discussion list.
>Please keep messages on-topic. Check the FAQ at: 
><http://public.kitware.com/cgi-bin/vtkfaq>
>Follow this link to subscribe/unsubscribe:
>http://www.vtk.org/mailman/listinfo/vtkusers

_________________________________________________________________
MSN Search, le moteur de recherche qui pense comme vous ! 
http://search.msn.fr/worldwide.asp




More information about the vtkusers mailing list