}
Туман
OpenGL поддерживает наложение равномерно распределенного в пространстве тумана. Это можно использовать также для иллюзии задымления или мутности, если камера находится в жидкой среде. Все свойства тумана управляются лишь одной функцией: gIFog. По умолчанию обработка тумана отключена.
Для создания более сложных моделей тумана можно воспользоваться функцией gIFogCoord, добавленной в последней версии OpenGL, или расширением EXT_fog_coord. После выбора свойства тумана GL_FOG_COORDINATE OpenGL будет использовать текущую координату тумана для каждой вершины, а не ее расстояние до наблюдателя.
/*
Демонстрация тумана.
Для активации управления камерой нажмите ESC.
*/
GLobj cam; // камера // цвет тумана
float fogcolor[4]={0.5,0.5,0.5,0};
int fogtype=GL_LINEAR; // тип тумана
float fogend=200; // дальняя дистанция тумана
void example_init()
{
gl.set (5);
cam.position(0,0,-4 0); glEnable(GL_DEPTH_TEST);
// разрешаем туман glEnable(GL FOG);
// устанавливаем ближнюю дистанцию тумана glFogf(GL_FOG_START, 0) ;
// компилируем тестовую сцену Models m; m.scene1(1);
}
// обработка ввода void input()
{
cam.input(&in); switch(in.vkey)
{
// изменение цвета тумана case ’Y': fogcolor[0]+=0.1; break; case 'H': fogcolor[0]-=0.1; break; case 'U': fogcolor[1]+=0.1; break; case * J': fogcolor[1]-=0.1; break; case 'I': fogcolor[2]+=0.1; break; case 'K': fogcolor[2]-=0.1; break; case 'O': fogcolor[3]+=0.1; break; case 'L': fogcolor[3]-=0.1; break;
// выбор типа тумана case VK_F1: fogtype=GL_LINEAR; break; case VK_F2: fogtype=GL_EXP; break; case VK_F3: fogtype=GL_EXP2; break; case VK_ADD: fogend+=l; break; case VK_SUBTRACT: fogend-=l; break; default:;
}
// корректируем значения переменных minmax(fogend,1,300); minmax(fogcolor[0],0,1); minmax(fogcolor[1],0,1);
minmax(fogcolor[2] , 0, 1) ; minmax(fogcolor[3] , 0, 1) ; in.vkey=0;
}
void example_deinit()
{
glDeleteLists (1, 1) ; gl.deinit ();
}
void draw() // вывод сцены {
glLoadldentity() ;
// используем цвет тумана как цвет // очищения буфера цвета glClearColor(fogcolor[0] , fogcolor[1] , fogcolor[2],fogcolor[3]);
// очищение буфера кадра
glClear(GL_COLOR_BOFFER_BIT|GL_DEPTH_BOFFER_BIT); input();
cam.trans form() ;
// устанавливаем цвет тумана glFogfv(GL_FOG_COLOR, fogcolor) ;
// выбираем тип тумана glFogi(GL_FOG_MODE,fogtype) ;
// устанавливаем дальнюю дистанцию тумана glFogf(GL_FOG_END,fogend) ; glCallList(1) ;
}
Вывод текста
Редкая программа обходится без вывода текстовой информации. Хотя ОрепС! не имеет специальных функций для этого, имеющихся средств вполне достаточно. Одним из способов отображения текста является представление символов в виде растровых изображений. Особенно для этого удобны битовые изображения, так как после вызова функции дШтар текущая растровая позиция автоматически сдвигается на указанную ширину. В некоторых случаях можно воспользоваться текстурами, содержащими нужный текст.
Другой подход - это создание моделей для каждого символа. В этом случае к тексту можно применить всю мощь OpenGL, такую как наложение текстур, освещение и координатные преобразования. Таким образом, трехмерный текст имеет больше шансов впечатлить пользователя.