Compartilhar via


Indicação de profundidade de portabilidade e comandos de neblina

Ao portar comandos de sinalização de profundidade e neblina, lembre-se dos seguintes pontos:

  • A chamada GL do IRIS, fogvertex, define um modo e os parâmetros que afetam esse modo. No OpenGL, você chama glFog uma vez para definir o modo e, em seguida, novamente duas ou mais para definir vários parâmetros.

  • No OpenGL, a indicação de profundidade não é um recurso separado. Use neblina linear em vez de indicação de profundidade. (Esta seção fornece um exemplo de como fazer isso.) As seguintes funções IRIS GL não têm equivalente openGL direto:

    depthcue

    lRGBrange

    lshaderange

    getdcm

  • Para ajustar a qualidade da neblina, use glHint( GL_FOG_HINT ).

A tabela a seguir lista as funções IRIS GL para gerenciar a neblina e suas funções OpenGL equivalentes.

Função IRIS GL Função OpenGL Significado
fogvertex glFog Define vários parâmetros de neblina.
fogvertex( FG_ON ) glEnable ( GL_FOG ) Liga a neblina.
fogvertex( FG_OFF ) glDisable ( GL_FOG ) Desliga a neblina.
depthcue glFog ( GL_FOG_MOD, GL_LINEAR ) Usa neblina linear para indicação de profundidade.

A tabela a seguir lista os parâmetros que você pode passar para glFog.

Parâmetro de neblina Significado Padrão
GL_FOG_DENSITY Densidade de neblina. 1,0
GL_FOG_START Distância próxima para neblina linear. 0.0
GL_FOG_END Distância distante para neblina linear. 1,0
GL_FOG_INDEX Índice de cor de neblina. 0.0
GL_FOG_COLOR Cor RGBA de neblina. (0, 0, 0, 0)
GL_FOG_MODE Modo de neblina. Confira a tabela a seguir.

O parâmetro de densidade de neblina do OpenGL difere do do IRIS GL. Eles estão relacionados da seguinte maneira:

  • if fogMode = EXP2

    openGLfogDensity = (irisGLfogDensity ) ( sqrt ( log ( 1 / 255 ) ))

  • if fogMode = EXP

    openGLfogDensity = (irisGLfogDensity ) ( log ( 1 / 255 ) )

onde sqrt é a operação raiz quadrada, log é o logaritmo natural, irisGLfogDensity é a densidade de neblina IRIS GL e openGLfogDensity é a densidade de neblina OpenGL.

Para alternar entre o cálculo da neblina no modo por pixel e o modo por vértice, use glHint( GL_FOG_HINT, hintMode). Dois modos de dica estão disponíveis:

  • GL_NICEST cálculo de neblina por pixel
  • GL_FASTEST cálculo de neblina por vértice

A tabela a seguir lista os modos de neblina IRIS GL e seus equivalentes OpenGL.

Modo de neblina IRIS GL Modo de neblina OpenGL Modo de dica Significado
FG_VTX_EXP,FG_PIX_EXP
GL_EXP GL_FASTEST,GL_NICEST
Modo de neblina pesada (padrão).
FG_VTX_EXP2,FG_PIX_EXP2
GL_EXP2 GL_FASTEST,GL_NICEST
Modo de neblina.
FG_VTX_LIN,FG_PIX_LIN
GL_LINEAR GL_FASTEST,GL_NICEST
Modo de neblina linear. (Use para indicação de profundidade.)

O exemplo de código a seguir demonstra a indicação de profundidade no OpenGL:

/* 
 *  depthcue.c 
 *  This program draws a wire frame model, which uses 
 *  intensity (brightness) to give clues to distance 
 *  Fog is used to achieve this effect 
 */ 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include "aux.h" 
 
/*  Initialize linear fog for depth cueing 
 */ 
void myinit(void) 
{ 
    GLfloat fogColor[4] = {0.0, 0.0, 0.0, 1.0}; 
 
    glEnable(GL_FOG); 
    glFogi (GL_FOG_MODE, GL_LINEAR); 
    glHint (GL_FOG_HINT, GL_NICEST);  /*  per pixel  */ 
    glFogf (GL_FOG_START, 3.0); 
    glFogf (GL_FOG_END, 5.0); 
    glFogfv (GL_FOG_COLOR, fogColor); 
    glClearColor(0.0, 0.0, 0.0, 1.0); 
 
    glDepthFunc(GL_LEQUAL); 
    glEnable(GL_DEPTH_TEST); 
    glShadeModel(GL_FLAT); 
} 
 
/*  display() draws an icosahedron 
 */ 
void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glColor3f (1.0, 1.0, 1.0); 
    auxWireIcosahedron(1.0); 
    glFlush(); 
} 
 
void myReshape(GLsizei w, GLsizei h) 
{ 
    glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective (45.0, (GLfloat) w/(GLfloat) h, 3.0, 5.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity (); 
    glTranslatef (0.0, 0.0, -4.0); /*move object into view*/ 
} 
/*  Main Loop 
 */ 
int main(int argc, char** argv) 
{ 
    auxInitDisplayMode (AUX_SINGLE | AUX_RGBA | AUX_DEPTH); 
    auxInitPosition (0, 0, 400, 400); 
    auxInitWindow (argv[0]); 
    myinit(); 
    auxReshapeFunc (myReshape); 
    auxMainLoop(display); 
}