Geração de Imgens Estereoscópicas em OpenGL

A idéia básica de criação de imagens estereoscópicas em OpenGL é geração de imagem diferente para cada olho a partir da mudança da posição do observador.

No caso do uso de um Óculos do tipo I-Glasses, a separação entre a imagem do olho esquerdo e do olho direito é feita pelo hardware do óculos que põe no visor do olho direito as imagens das linhas pares da tela, e no visor do olho esquerdo a imagem das linhas ímpres.

Para fazer a separação das iamgens na tela, usa-se o stencil buffer, com o seguinte algoritmo:
 

// **********************************************************************
//
// **********************************************************************
void display( void )
{

 // Limpa a tela
 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 DefineLuz();

 PosicUser(ESQUERDO);  // posiciona o observador no olho esquerdo
  DesabilitaDesenhoNoStencil();
  DesenhaCena();

 PosicUser(DIREITO);   // posiciona o observador no olho direito
  HabilitaDesenhoNoStencil();
  DesenhaCena();

 glutSwapBuffers();

}

Posicionamento do Observador

 
// **********************************************************************
//  void PosicUser()
//  esta função define a posicã0 de cada um dos olhos do observador
//
// **********************************************************************
void PosicUser(int Olho)
{
 // Set the clipping volume
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(80,ratio,0.01,200);

 switch (Olho)
 {
 case ESQUERDO:
    gluLookAt(-DistOlhos/2, 0, 5, 0, 0, 0, 0.0f,1.0f,0.0f);
    break;
 case DIREITO:
    gluLookAt(DistOlhos/2, 0, 5, 0, 0, 0, 0.0f,1.0f,0.0f);
    break;
 }
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();

}
 
 

Marcação do Stencil

Para permitir o bloqueio e desbloqueio das imagens no stencil, deve-se desenhar linhas horizontais na linhas pares
 
 
// **********************************************************************
//  void DesenhaFundo()
//      Inicializa o stencil com 1 nas linhas pares
//
// **********************************************************************
void DesenhaFundo(int Largura, int Altura )
{

 glMatrixMode(GL_PROJECTION); //
 glLoadIdentity ();
 gluOrtho2D(0, Largura, 0, Altura);

 glMatrixMode(GL_MODELVIEW);

 glBegin(GL_LINES);
  // inicializa apenas as linhas pares no stencil
  for (int y= 0; y < Altura; y += 2)
  {
   DrawLine(0,y, Largura, y);
  }
 glEnd();
 // volta à matriz de objetos
 //glMatrixMode(GL_MODELVIEW);

}

// **********************************************************************
//  void DrawStencil()
//
//
// **********************************************************************
void DrawStencil(int Largura, int Altura )
{
    // Habilita o uso do Stencil
 glEnable(GL_STENCIL_TEST);

 // Define que "0" será usado para limpar o Stencil
 glClearStencil(0);
 // limpa o Stencil
 glClear(GL_STENCIL_BUFFER_BIT);

 glStencilFunc(GL_ALWAYS, 1, 1);
 glStencilOp(GL_REPLACE,GL_REPLACE,GL_REPLACE);

 DesenhaFundo(Largura,Altura);

}


Faça o download de um exemplo clicando aqui.