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();
}
// **********************************************************************
// 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();}
// **********************************************************************
// 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);
}