Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При переносе команд глубины и тумана следует учитывать следующие моменты:
Вызов 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);
}