OpenGL - Замъглявания

OpenGL предоставя наготово функцията glFog( ), с която можете да създадете съвсем реалистична мъгла във вашата триизмерна графика. Самата функция има четири разновидности, всяко от които си има определено предназначение :

void glFogf( GLenum pname, GLfloat param );
void glFogi( GLenum pname, GLint param );
void glFogfv( GLenum pname, const GLfloat *param );
void glFogiv( GLenum pname, const GLint *param );

Като за начало трябва да укажете, че искате да използвате замъгляване. Трябва да зададете на фунцкията glEnable( ) аргумента GL_FOG. След това е необходимо да укажете какъв тип мъгла желате да използвате. За да направите това е нужно да извикате една от първите два вида на функцията glFog*( ), като подадете за първи аргумент GL_FOG_MODE, а за втори един от тези :
GL_LINEAR - използва се за стандартни замъглявания ( най-качествен режим на замъгляване )
GL_EXP - също като GL_LINEAR, с известна разлика, която ще видите след малко
GL_EXP2 - използва се за силни замъглявания.

След това е нужно да определите цвета на мъглата, което най-добре може да извършите с функцията glFogfv( ), където за първи аргумент подадете GL_FOG_COLOR, а за втори - името на float масива в който сте съхранили RGBA цвета ( както при динамичната светлина ).

Акo използвате мъгла тип GL_LINEAR е нужно да определетите на колко единици от позицията на камерата да започва мъглата и след колко единици обектите да са напълно скрити в нея. Това става като подадете за първи аргумент на функцията glFogf( ) / glFogi( ) съответно аргументите GL_FOG_START или GL_FOG_END, a за втори аргумент на функцията определената от вас числова стойност.
Например : glFogi( GL_FOG_START, 10 ). Добре е мъглата да започва винаги на няколко единици пред камерата, защото така се постигат по-добри резултати както във визуално качество, така и в производителност от графичния ускорител.

Ако използвате GL_EXP или GL_EXP2 тип мъгла е нужно да определите плътност за мъглата. За да направите това е достатъчно да подадете GL_FOG_DENSITY като първи аргумент на функцията glFogf( ), a за втори аргумент - стойност в интервала 0.0 - 1.0 , като по-голямо число води до по-силно замъгляване. Ако не определите плътност на мъглата, OpenGL приема по подразбиране числото 1.0

Самото замъгляване се отразява само на цвета на обектите, затова е нужно в началото на вашата рендерираща функция след изчистването на буферите, да запълните цветовия буфер с цвета на мъглата или по-просто казано цвета на фона трябва да e еднакъв с цвета на мъглата. Както знаете вече, цветович буфер се запълва с функцията glClearColor( ).
Ето как бързо и лесно можете да реализирате един добър ефект. Tук можете да хвърлите едно око на кода използващ замъгляване.

Автор: Иван Георгиев Иванов