|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Porting Depth Cueing and Fog Commands
When porting depth-cueing and fog code, keep the following points in mind:
· The IRIS GL call fogvertex sets a mode and parameters affecting that mode. In OpenGL, you call glFog once to set the mode, then again twice or more to set various parameters. · In OpenGL, depth cueing is not a separate feature. Use linear fog instead of depth cueing. (This section gives an example of how to do this.) The following IRIS GL functions have no direct OpenGL equivalent:
· depthcue · lRGBrange · lshaderange · getdcm
· To adjust fog quality, use glHint(GL_FOG_HINT).
The following table lists the IRIS GL functions for managing fog and their corresponding OpenGL calls.
IRIS GL Call OpenGL Call Meaning fogvertex glFog Set various fog parameters. fogvertex(FG_ON) glEnable(GL_FOG) Turn fog on. fogvertex(FG_OFF) glDisable(GL_FOG) Turn fog off. depthcue glFog(GL_FOG_MOD, GL_LINEAR) Use linear fog for depth cueing.
The following table lists the arguments you can pass to glFog.
Fog Parameter Meaning Default GL_FOG_DENSITY Fog density. 1.0 GL_FOG_START Near distance for linear fog. 0.0 GL_FOG_END Far distance for linear fog. 1.0 GL_FOG_INDEX Fog color index. 0.0 GL_FOG_COLOR Fog RGBA color. (0, 0, 0, 0) GL_FOG_MODE Fog mode. See the table below.
The fog-density parameter of OpenGL differs from the one in IRIS GL. They are related as follows:
· if fogMode = EXP2 openGLfogDensity = (irisGLfogDensity) (sqrt( - log( 1 / 255 ) )) · if fogMode = EXP openGLfogDensity = (irisGLfogDensity) (- log( 1 / 255 ) )
where sqrt is the square root operation, log is the natural logarithm, irisGLfogDensity is the IRIS GL fog density, and openGLfogDensity is the OpenGL fog density. To switch between calculating fog in per-pixel mode and per-vertex mode, use glHint(GL_FOG_HINT, hintMode). Two hint modes are available:
· GL_NICEST per-pixel fog calculation · GL_FASTEST per-vertex fog calculation
The following table lists the IRIS GL fog modes and their OpenGL equivalents.
IRIS GL Fog Mode OpenGL Fog Mode Hint Mode Meaning FG_VTX_EXP, FG_PIX_EXP GL_EXP GL_FASTEST,GL_NICEST Heavy fog mode (default). FG_VTX_EXP2, FG_PIX_EXP2 GL_EXP2 GL_FASTEST,GL_NICEST Haze mode. FG_VTX_LIN, FG_PIX_LIN GL_LINEAR GL_FASTEST,GL_NICEST Linear fog mode. (Use for depth cueing).
Here's an example that demonstrates depth cueing in 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 #include #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); }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Перенесение Depth Cueing и Команды Тумана
При перенесении глубинный-cueing и код тумана, держите следующее точек в уме:
Вызов ИРИСА GL fogvertex комплекты способ и параметры, влияющие на этот способ. В OpenGL, Вы называете glFog как только, чтобы устанавливать способ, затем снова дважды или более, чтобы устанавливать различные параметры. В OpenGL, глубинный cueing не является отдельной характеристикой. Используйте линейный туман вместо глубинного cueing. (Эта секция дает пример того как, чтобы делать это.) Следующее функций IRIS GL не имеет прямой эквивалент OpenGL:
depthcue lRGBrange lshaderange getdcm
, Чтобы регулировать качество тумана, использовать glHint(GL_FOG_HINT).
Следующий стол включает функции ИРИСА GL чтобы управлять туманом и их соответствующими вызовами OpenGL.
ВЫЗОВ ИРИСА GL Вызова OpenGL, означающий fogvertex glFog Установивший различные параметры тумана. fogvertex Включать(FG_ON) glEnable тумана(GL_FOG). fogvertex Поворот(FG_OFF) glDisable тумана(GL_FOG). depthcue glFog Использования(GL_FOG_MOD, GL_LINEAR) линейный туман для глубинного cueing.
Следующий стол включает аргументы, которые Вы можете пройти на glFog.
Параметр Тумана, означающий Встроенную плотность Тумана GL_FOG_DENSITY. 1.0 GL_FOG_START Около расстояния для линейного тумана. 0.0 Дальних расстояний GL_FOG_END для линейного тумана. 1.0 цветных индексов Тумана GL_FOG_INDEX. 0.0 цветов GL_FOG_COLOR Fog RGBA. (0, 0, 0, 0) способ Тумана GL_FOG_MODE. Смотри стол ниже.
Туман-плотность параметра OpenGL отличается от один в IRIS GL. Они обусловливаются следующим образом:
если fogMode = EXP2 openGLfogDensity = (irisGLfogDensity) (sqrt( - БРЕВНО( 1 / 255 ) )) если fogMode = EXP openGLfogDensity = (irisGLfogDensity) (- БРЕВНО( 1 / 255 ) )
где sqrt - действие квадратного корня, бревно является естественным логарифмом, irisGLfogDensity является плотностью тумана ИРИСА GL, и openGLfogDensity является плотностью тумана OpenGL. Для того, чтобы переключаться между вычислительным туманом в за-способ пикселя и за-способ вершины, используйте glHint(GL_FOG_HINT, hintMode). Два способа намека доступны:
GL_NICEST за-вычисление тумана пикселя GL_FASTEST за-вычисление тумана вершины
Следующий стол включает способы тумана ИРИСА GL и их эквивалентов OpenGL.
НАМЕК Способа Тумана Способа ИРИСА GL Fog Mode 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. (Использование для глубинного cueing).
Вот пример, который демонстрирует глубину cueing в OpenGL:
/* * depthcue.c * Эта программа делает проводной фреймовой моделью, которая используется * интенсивность (яркость) должна дать ключи на расстояние. * Туман использован, чтобы достигать этого эффекта. */ #include #include #include "aux.h"
/* Инициализируйте линейный туман для глубинного cueing. */ пустота myinit(пустота) { fogColor GLfloat[4] = {0.0, 0.0, 0.0, 1.0};
glEnable(GL_FOG); glFogi (GL_FOG_MODE, GL_LINEAR); glHint (GL_FOG_HINT, GL_NICEST); /* за пиксель */
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); }
/* показ(), делает icosahedron. */ недействительный показ(пустота) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); auxWireIcosahedron(1.0); glFlush(); }
пустота 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); /*объект перемещения в поле зрения*/ } /* Основной Цикл */ int основа(int argc, символ** argv) { auxInitDisplayMode (AUX_SINGLE | AUX_RGBA | AUX_DEPTH); auxInitPosition (0, 0, 400, 400); auxInitWindow (argv[0]); myinit(); auxReshapeFunc (myReshape);
auxMainLoop(ПОКАЗ); }
| |
|
|
| |