Поделиться через


Перенос команд управления глубиной и туманом

При переносе команд глубины и тумана следует учитывать следующие моменты:

  • Вызов IRIS GL, fogvertex, задает режим и параметры, влияющие на этот режим. В OpenGL вызовите glFog один раз, чтобы задать режим, а затем дважды или более, чтобы задать различные параметры.

  • В OpenGL подсказка глубины не является отдельной функцией. Используйте линейный туман вместо подсказки глубины. (В этом разделе приведен пример того, как это сделать.) Следующие функции IRIS GL не имеют прямого эквивалента OpenGL:

    указатель глубины

    lRGBrange

    lshaderange

    getdcm

  • Чтобы настроить качество тумана, используйте glHint(GL_FOG_HINT).

В следующей таблице перечислены функции IRIS GL для управления туманом и их эквивалентными функциями OpenGL.

Функция IRIS GL Функция OpenGL Значение
вершина тумана glFog Задает различные параметры тумана.
fogvertex( FG_ON ) glEnable ( GL_FOG ) Включает туман.
fogvertex( FG_OFF ) glDisable ( GL_FOG ) Выключает туман.
глубинное восприятие glFog ( GL_FOG_MOD, GL_LINEAR ) Использует линейную туману для подсказки глубины.

В следующей таблице перечислены параметры, которые можно передать в glFog.

Параметр "Туман" Значение По умолчанию
GL_FOG_DENSITY Плотность тумана. 1.0
GL_FOG_START Ближайшее расстояние для линейного тумана. 0.0
GL_FOG_END Далекое расстояние для линейного тумана. 1.0
GL_FOG_INDEX Индекс цвета тумана. 0.0
GL_FOG_COLOR Цвет RGBA тумана. (0, 0, 0, 0)
GL_FOG_MODE Режим тумана. См. следующую таблицу.

Параметр плотности тумана OpenGL отличается от параметра iRIS GL. Они связаны следующим образом:

  • если fogMode = EXP2

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

  • если fogMode = EXP

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

где sqrt является операцией извлечения квадратного корня, лог является натуральным логарифмом, irisGLfogDensity является плотностью тумана IRIS GL, а openGLfogDensity является плотностью тумана OpenGL.

Чтобы переключиться между вычислением тумана по пикселям и по вершинам, используйте glHint(GL_FOG_HINT, hintMode). Доступны два режима намека:

  • GL_NICEST вычисление тумана на пиксель
  • GL_FASTEST расчёт тумана на вершину

В следующей таблице перечислены режимы тумана IRIS GL и их эквиваленты OpenGL.

Режим тумана IRIS GL Режим тумана OpenGL Режим подсказки Значение
FG_VTX_EXP,FG_PIX_EXP
GL_EXP GL_FASTEST,GL_NICEST
Режим сильного тумана (по умолчанию).
FG_VTX_EXP2,FG_PIX_EXP2
GL_EXP2 GL_FASTEST,GL_NICEST
Режим тумана.
FG_VTX_LIN,FG_PIX_LIN
GL_LINEAR GL_FASTEST,GL_NICEST
Режим линейного тумана. (Используйте для подсказки глубины.)

В следующем примере кода демонстрируется глубинная индикация в 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); 
}