Урок 16 по OpenGL. Эффект тумана на OpenGL

Этот урок представляет Крис Алиотта (Chris Aliotta)...

Итак, Вы хотите добавить туман в Вашу программу на OpenGL? Что ж, в этом уроке я покажу как сделать именно это. Я первый раз пишу урок, и относительно недавно познакомился с программированием на OpenGL/C++, так что пожалуйста, если вы найдете здесь какие-нибудь ошибки, то пожалуйста, сообщите мне и не накидывайтесь все сразу. Эта программа основана на примере седьмого урока.

 

Подготовка данных:

  Начнем с того, что подготовим все необходимые переменные, содержащие параметры затуманивания. Массив fogMode будет хранить три значения: GL_EXP, GL_EXP2 и GL_LINEAR, - это три типа тумана. Позже я объясню различия между ними. Объявим переменные в начале кода, после строки GLuint texture[3]. В переменной fogfilter будет храниться какой тип тумана мы будем использовать, fogColor будет содержать цвет, который мы хотим придать туману. Еще я добавил двоичную переменную gp в начало кода, чтобы можно было узнать нажата ли клавиша 'g' во время выполнения программы-примера.

 

bool   gp;                              // G Нажата? ( Новое )

GLuint filter;                          // Используемый фильтр для текстур

GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR }; // Хранит три типа тумана

GLuint fogfilter= 0;                    // Тип используемого тумана

GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f}; // Цвет тумана

 

Изменения в DrawGLScene

  Теперь, когда мы задали переменные, передвинемся вниз к функции InitGL. Строка glClearColor() изменена так, чтобы заполнить экран цветом тумана для достижения лучшего эффекта. Требуется не так уж много кода, чтобы задействовать туман. Вообщем, Вам все это покажется очень простым.

 

glClearColor(0.5f,0.5f,0.5f,1.0f);      // Будем очищать экран, заполняя его цветом тумана. ( Изменено )

 

glEnable(GL_FOG);                       // Включает туман (GL_FOG)

glFogi(GL_FOG_MODE, fogMode[fogfilter]);// Выбираем тип тумана

glFogfv(GL_FOG_COLOR, fogColor);        // Устанавливаем цвет тумана

glFogf(GL_FOG_DENSITY, 0.35f);          // Насколько густым будет туман

glHint(GL_FOG_HINT, GL_DONT_CARE);      // Вспомогательная установка тумана

glFogf(GL_FOG_START, 1.0f);             // Глубина, с которой начинается туман

glFogf(GL_FOG_END, 5.0f);               // Глубина, где туман заканчивается.

  Возьмем сначала первые три строчки этого кода. Первая строка glEnable(GL_FOG) во многом говорит сама за себя. Ее задача - инициализировать туман.

 

Вторая строка, glFogi(GL_FOG_MODE, fogMode[fogfilter]) устанавливает режим фильтрации тумана. Ранее мы объявили массив fogMode. Он содержал GL_EXP, GL_EXP2 и GL_LINEAR. Именно здесь эти переменные входят в игру. Вот что каждая из них значит:

 

·         GL_EXP - Обычный туман, заполняющий весь экран. Во многом он напоминает туман отдаленно, но легко справляется со своей работой даже на старых PC.

·         GL_EXP2 - Это следующий шаг после GL_EXP. Затуманит весь экран, за то придает больше глубины всей сцене.

·         GL_LINEAR - Это лучший режим прорисовки тумана. Объекты выходят из тумана и исчезают в нем гораздо лучше.

 

Третья, glFogfv(GL_FOG_COLOR, fogcolor) задает цвет тумана. Раньше мы задали его как (0.5f,0.5f,0.5f,1.0f) через переменную fogcolor - получился приятный серый цвет.

 

Дальше, посмотрим на четыре последних строки. Строка glFogf(GL_FOG_DENSITY, 0.35f) устанавливает, насколько густым будет туман. Увеличьте число, и туман станет более густым, уменьшите - менее густым.

 

Eric Desrosiers добавляет небольшое объяснение glHint(GL_FOG_HINT, hintval):

 

hintval может быть: GL_DONT_CARE, GL_NICEST или GL_FASTEST

·         GL_DONT_CARE - позволяет OpenGL выбрать формулу для расчета тумана (по вершинам или по пикселям).

·         GL_NICEST - Создает туман по пикселям (хорошо смотрится).

·         GL_FASTEST - Вычисляет туман по вершинам (быстрее, но не так красиво)) .

 

Следующая строка glFogf(GL_FOG_START, 1.0f) устанавливает насколько близко к экрану начинается затуманивание. Вы можете изменить это число на что угодно, в зависимости от того, где бы Вы хотели, чтобы начался туман. Следующая, похожая, строка glFogf(GL_FOG_END, 5.0f) сообщает программе OpenGL насколько глубоко в экран должен уходить туман.

 

События при нажатии клавиш

 

Сейчас, когда код прорисовки уже готов, мы добавим команды для клавиатуры, чтобы переключаться между разными способами затуманивания. Этот код идет в конце программы, вместе с обработкой нажатия клавиш.

 

if (keys['G'] && !gp)                   // Нажата ли клавиша "G"?

{

       gp=TRUE;                         // gp устанавливаем в TRUE

       fogfilter+=1;                    // Увеличиние fogfilter на 1

       if (fogfilter>2)                 // fogfilter больше 2 ... ?

       {

              fogfilter=0;              // Если так, установить fogfilter в ноль

       }

       glFogi (GL_FOG_MODE, fogMode[fogfilter]); // Режим тумана

}

if (!keys['G'])                         // Клавиша "G" отпущена?

{

       gp=FALSE;                        // Если да, gp установить в FALSE

}

 

Вот и все! Мы закончили. В Ваших программах с OpenGL есть туман. Я бы даже сказал, что это было достаточно безболезненно. Если есть какие вопросы или комментарии, легко можете со мной связаться: chris@incinerated.com. Так же заходите ко мне на сайт: http://www.incinerated.com/ и http://www.incinerated.com/precursor.

© Christopher Aliotta (chris@incinerated.com)

 28 января 2002 (c)  Макс Махоткин