MedicalVisualization

Scene Graph Flattening

OpenGL Matrix Stack | | Scene Graph To OpenGL

As an alternative to using the matrix stack to compute the respective transformation matrices, we ca compute the MVP matrix directly from its components using a linear algebra library. Such a library is glslmath.

Supposed we have a view matrix V and a transformation matrix M for an object to be rendered. Supposed the object has also child geometry and we have the relative transformation matrices $M_i$ for each part as well. The we compute the respective matrices for the object and its parts as follows:

#include <glslmath.h>

void drawObject(mat4 M, mat4 V, mat4 P)
{
   // set projection matrix once
   lglProjection(P);

   // compute actual model-view matrix
   mat4 MV = V*M;

   // set actual model-view matrix
   lglModeView(MV);

   // render actual object
   lglBegin();
      ...
   lglEnd();

   // render transformed child geometry #1
   mat4 M1MV = MV * M1;
   lglModelView(M1MV);

   // render actual object
   lglBegin();
      ...
   lglEnd();

   // render transformed child geometry #2
   mat4 M2MV = MV * M2;
   lglModeView(M2MV);

   // render actual object
   lglBegin();
      ...
   lglEnd();

   and so on ...
}

In case the object geometry is encapsulated into a vertex buffer object (VBO):

lglVBO vbo, vbo1, vbo2; // assumed to contain geometry

void drawObject(mat4 M, mat4 V, mat4 P)
{
   lglProjection(P);

   mat4 MV = V*M;
   lglModeView(MV);
   lglRender(vbo);

   mat4 M1MV = MV*M1;
   lglModelView(M1MV);
   lglRender(vbo1);

   mat4 M2MV = MV*M2;
   lglModelView(M2MV);
   lglRender(vbo2);
}

That’s how rendering is done in the core profile. Basically, just VBOs and matrices are allowed, since matrix stack operations have been deprecated as legacy functions.

OpenGL Matrix Stack | | Scene Graph To OpenGL

Options: