[vtkusers] Request to VTK Multi-Pass Rendering
Rocco Gasteiger
post at rocco-gasteiger.de
Mon Nov 23 04:50:44 EST 2009
Dear VTK users,
I want to use the new mulit-pass framework in VTK implemented by François
Bertel. At first, many thanks François for implementing this framework! I
need some multipass rendering for my research project and I think you have
provided a very good base for start-up with this.
For a better understanding how it works, I tried to adopt a native
multi-pass OpenGL example in VTK, with help of the given framework. In doing
so I oriented me at the given examples on the according VTK Wiki sites.
Unfortunately, I did not get the same result in VTK like in OpenGL. I think
I miss some important facts of understanding the VTK rendering pipeline. So
I hope somebody (maybe François directly) can help me to have a better
understanding of how the framework works. Here comes what I really do:
In OpenGL I implemented an algorithm for hidden line removing (It is based
on the paper of Jarek R. Rossignac and Maarten van Emerik: Hidden contours
on a frame-buffer (1992) ). Here is a snippet of my OpenGL code, where I
have to render my geometry two times (2-passes).
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glColor3f(0,0,0);
// Settings for first pass
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE,GL_FALSE);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
drawMyGeometryWithSolidFaces();
// Settings for second pass
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE,GL_TRUE);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glEnable(GL_POLYGON_OFFSET_LINE);
glPolygonOffset(-1.0,1.0);
drawMyGeometryWithSolidFaces();
// Reset polygon offsest
glDisable(GL_POLYGON_OFFSET_FILL);
In VTK I derived a class vtkHiddenLineDesignerPass from vtkRenderPass
and tried to implement the same OpenGL steps. The result is, that still all
lines are rendered, also the hidden lines. I use the following lines of code
snippets in the Render(const vtkRenderState *s)-function to adopt the
OpenGL-code with VTK datastructures and calls:
//** Getting necessary VTK-objects to turn on/off some OpenGL-states.**/
vtkOpenGLRenderer *r=static_cast<vtkOpenGLRenderer *>(s->GetRenderer());
vtkActor *actor = r->GetActors()->GetLastActor();
vtkPolyDataMapper *actorMapper =
static_cast<vtkPolyDataMapper*>(actor->GetMapper());
vtkProperty *actorProp = actor->GetProperty();
// Settings for the first pass //
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE,GL_FALSE);
actorProp->SetRepresentationToSurface(); //** For
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);**//
this->DelegatePass->Render(s);
this->NumberOfRenderedProps +=
this->DelegatePass->GetNumberOfRenderedProps();
// Settings for the second pass //
actorProp->SetDiffuseColor(0,0,0); //** For glColor3f(0,0,0); **//
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE,GL_TRUE);
actorProp->SetRepresentationToWireframe(); //** For
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); **//
actorMapper->SetResolveCoincidentTopology(1);
actorMapper->SetResolveCoincidentTopologyToPolygonOffset();
actorMapper->SetResolveCoincidentTopologyPolygonOffsetFaces(0); //** For
glEnable(GL_POLYGON_OFFSET_LINE);**//
actorMapper->SetResolveCoincidentTopologyPolygonOffsetParameters(-1.0,1);
//** For glPolygonOffset(-1.0,1.0);**//
this->DelegatePass->Render(s);
this->NumberOfRenderedProps +=
this->DelegatePass->GetNumberOfRenderedProps();
actorMapper->SetResolveCoincidentTopology(0); //** For
glDisable(GL_POLYGON_OFFSET_FILL);**//
In my VTK-class, where I use this rendering pass, I process following
rendering pipeline:
// The elementary passes.
vtkLightsPass *lights=vtkLightsPass::New();
vtkDefaultPass *defaultPass=vtkDefaultPass::New();
// Put them in a sequence.
vtkRenderPassCollection *passes=vtkRenderPassCollection::New();
passes->AddItem(lights);
passes->AddItem(defaultPass);
vtkSequencePass *seq=vtkSequencePass::New();
seq->SetPasses(passes);
// Make the sequence the delegate of a camera pass.
vtkCameraPass *cameraP=vtkCameraPass::New();
cameraP->SetDelegatePass(seq);
// Create the hidden line removing pass and attach the camera pass as its
delegate
vtkHiddenLineDesignerPass *myPass=vtkHiddenLineDesignerPass::New();
myPass ->SetDelegatePass(cameraP);
vtkRenderer* renderer01= vtkRenderer::New();
renderer01->SetPass(myPass);
Especially, my misunderstanding relies on when to use native OpenGL-code and
when using VTK-calls. I tried some variations of the code, presented above
but without success. It would be very helpful if someone can give me some
hints.
Many thanks in advance,
Rocco Gasteiger
--------------------------------------------------
Dipl.-Ing. Rocco Gasteiger
Otto-von-Guericke University
Faculty of Computer Science
Department of Simulation and Graphics
Universitätsplatz 2, 39106 Magdeburg, Germany
Office: G29-223
Phone: +49 391 67 127 59
Fax: +49 391 67 111 64
Website: http://wwwisg.cs.uni-magdeburg.de/cvcms/
--------------------------------------------------
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20091123/6523474e/attachment.htm>
More information about the vtkusers
mailing list