В прошлый раз мы научились делать реальные трёхмерные изображения. Но наше изображение получилось не совсем реалистичное. Тест глубины, который мы включали, проверял только отсечение поверхностей, но никак не влиял на перспективу. Что я имею ввиду? С удалённостью объекта изменяется теплота цвета, нет бликов от освещения и так далее. Об освещении мы поговорим позже, а сегодня мы поговорим о теплоте цвета.
Когда мы смотрим в даль, то удалённые объекты кажутся нам расплывчатыми. Этого эффекта можно добиться с помощью тумана. Что такое туман? Это, грубо говоря, густой воздух.
Рис 1. Туман
На этом я думаю закончить с теорией и приступить к практике. Посмотри на рисунок 1 и возьми исходники сегодняшней проги здесь. Как видишь, сегодняшняя прога не сильно отличается от предыдущей. Я просто добавил туман к программе используемой в прошлом номере. В моём примере используется туман красного цвета, поэтому по мере удаления цвет объекта становится всё более красным.
Давай посмотрим, как рисуется туман:
procedure TForm1.FormPaint(Sender: TObject);
var
ps:TPaintStruct;
fogColor : Array[0..3] of GLfloat;
begin
BeginPaint(Handle,ps);
glClearColor(1,0.5,0.5,1);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glRotated(45,1,0,0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_FOG);
glFogi(GL_FOG_MODE,GL_EXP2);// Выставляю режим тумана
fogColor[0]:=1;
fogColor[1]:=0;
fogColor[2]:=0;
glFogfv(GL_FOG_COLOR, @fogColor);//Выставляю цвет тумана
glFogi(GL_FOG_DENSITY,100);// Плотность
glFogi(GL_FOG_END,10);//дальняя точка тумана.
glColor3f (0.0, 1.0, 0.0);
glBegin(GL_QUAD_STRIP);
glVertex3f(1.25,1.25,1);
glVertex3f(1.25,-1.0,1);
glVertex3f(-1,1.25,0);
glVertex3f(-1,-1.0,0);
glEnd;
glColor3f (1.0, 1.0, 0.0);
glBegin(GL_QUAD_STRIP);
glVertex3f(1.0,1.0,0);
glVertex3f(1.0,-1.25,0);
glVertex3f(-1.25,1.0,1);
glVertex3f(-1.25,-1.25,1);
glEnd;
glFlush();
swapBuffers(dc);
EndPaint(Handle,ps);
Туман включается всё той же функцией glBegin с параметром GL_FOG . С помощью функции glFog устанавливаются параметры тумана. Эта функция может быть двух типов glFogi (в качестве второго параметра выступает целое число) и glFogf (второй параметр - это число с плавающей запятой). Есть ещё две разновидности - glFogfv, glFogiv, но все они выполняют одну и ту же роль, поэтому я рассмотрю только одну:
glFogf(
pname: GLenum;
param: GLfloat);
В качестве первого параметра могут выступать:
GL_FOG_MODE - устанавливает тип тумана. В этом случае второй параметр может содержать одно из следующих значений: GL_LINEAR, GL_EXP, или GL_EXP2
GL_FOG_DENSITY - устанавливает плотность (густоту) тумана. В этом случае, второй параметр - целое число, указывающее плотность тумана. По умолчанию это 1,0.
GL_FOG_START или GL_FOG_END - Начало и конец действия тумана. До начального значения тумана нет, а после конечного туман настолько плотный, что ничего не видно. Второй параметр - целое число устанавливающее соответствующее значение.
GL_FOG_INDEX - Индекс цвета тумана, только если вы используете палитру.
GL_FOG_COLOR - Цвет тумана. В качестве второго параметра выступает массив из четырёх чисел символизирующих значения красного, зелёного, голубого цвета и прозрачность.
Вот и всё. Внимательно взгляни на код примера и всё будет ясно. Ой. Я не отключил туман. После рисования не забывай отключать туман glDisable(GL_FOG) и тест глубины glDisable(GL_DEPTH_TEST). Всё это нужно делать после рисования. Сначала включил всё это, нарисовал и потом отключил.