Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Chast_II_Osn_progr_trekhmernoy_grafiki.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

3. Туман

Компьютерные изображения иногда выглядят нереально резкими и качественными. Резкость краев объектов уменьшается с помощью сглаживания. Еще одно средство для создания реалистичных изображений – добавление "тумана", который делает объекты менее четкими по мере увеличения расстояния от наблюдателя. Термином "туман" (fog) в OpenGL обозначается целая группа атмосферных эффектов, таких, как дымка, пасмурность, копоть и т.п. Например, туман часто используется в авиационных симуляторах.

При включенном тумане цвет более далеких объектов постепенно переходит в цвет тумана. OpenGL позволяет задать цвет и плотность тумана (она определяет скорость, с которой образы объектов расплываются с расстоянием). Расчет тумана уменьшает скорость работы программы.

3.1 Использование тумана

Для использования тумана сначала надо включить его, а затем настроить свойства. Включение выполняется вызовом glEnable(GL_FOG), а определение свойств –вызовами функции glFog*():

void glFog{if}{v}(GLenum pname, TYPE param);

Она позволяет выбрать цвет, плотность (density) и уравнение для расчета множителя тумана f, на который будет умножается цвет в цветовом буфере. Есть три возможных уравнения:

GL_EXP:

GL_EXP2:

GL_LINEAR:

У функции glFog*() параметр pname выбирает изменяемое свойство – GL_FOG_MODE (уравнение для расчета множителя), GL_FOG_COLOR (цвет), GL_FOG_DENSITY (плотность), GL_FOG_START (дальность начала тумана) или GL_FOG_END (дальность завершения тумана). Для свойства GL_FOG_MODE допустимы перечисленные выше значения GL_EXP (по умолчанию), GL_EXP2 или GL_LINEAR. Значения по умолчанию других параметров: density=1, start=0, end=1.

Применение тумана показано в программе 6.4. Она рисует пять желтых чайников (из полированного золота), расположенных на разном расстоянии от наблюдателя. По нажатию левой кнопки мыши программа меняет уравнение для расчета множителя тумана.

#include <iostream.h>

#include <windows.h>

#include <math.h>

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>

GLint fogMode;

void CALLBACK cycle_fog( AUX_EVENTREC* )

{

if ( fogMode == GL_EXP ) {

fogMode = GL_EXP2;

cout << "Fog mode is GL_EXP2\n";

}

else if ( fogMode == GL_EXP2 ) {

fogMode = GL_LINEAR;

cout << "Fog mode is GL_LINEAR\n";

glFogf( GL_FOG_START, 1.0 );

glFogf( GL_FOG_END, 5.0 );

}

else if ( fogMode == GL_LINEAR )

{

fogMode = GL_EXP;

cout << "Fog mode is GL_EXP\n";

}

cout.flush();

glFogi( GL_FOG_MODE, fogMode );

}

void light_init()

{

float pos[] = { 0.0, 0.0, 1.0, 0.0 };

glEnable( GL_DEPTH_TEST );

glDepthFunc( GL_LEQUAL );

glLightfv( GL_LIGHT0, GL_POSITION, pos );

glEnable( GL_LIGHTING );

glEnable( GL_LIGHT0 );

glEnable(GL_AUTO_NORMAL);

glEnable(GL_NORMALIZE);

glEnable( GL_FOG );

float fogColor[4] = { 0.5, 0.5, 0.5, 1.0 };

fogMode = GL_EXP;

glFogi( GL_FOG_MODE, fogMode );

glFogfv( GL_FOG_COLOR, fogColor );

glFogf( GL_FOG_DENSITY, 0.35f );

glClearColor( 0.5, 0.5, 0.5, 1.0 );

}

void draw_red_teapot( float x, float y, float z )

{

float gold_amb[4] = { 0.25f, 0.22f, 0.06f, 1.00 };

float gold_diff[4] = { 0.35f, 0.31f, 0.09f, 1.00 };

float gold_spec[4] = { 0.80f, 0.72f, 0.21f, 1.00 };

float gold_shin = 83.2f;

glMaterialfv( GL_FRONT, GL_AMBIENT, gold_amb );

glMaterialfv( GL_FRONT, GL_DIFFUSE, gold_diff );

glMaterialfv( GL_FRONT, GL_SPECULAR, gold_spec );

glMaterialf( GL_FRONT, GL_SHININESS, gold_shin );

glPushMatrix();

glTranslatef( x, y, z );

auxSolidTeapot( 1.0 );

glPopMatrix();

}

void CALLBACK display()

{

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

draw_red_teapot( -4.0, -0.5, -1.0 );

draw_red_teapot( -2.0, -0.5, -2.0 );

draw_red_teapot( 0.0, -0.5, -3.0 );

draw_red_teapot( 2.0, -0.5, -4.0 );

draw_red_teapot( 4.0, -0.5, -5.0 );

glFlush();

}

void CALLBACK resize( int w, int h )

{

glViewport(0, 0, w, h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

if ( w <= (h*3) )

glOrtho( -6.0, 6.0, -2.0*((float)h*3)/(float)w,

2.0*((float)h*3)/(float)w, 0.0, 10.0 );

else

glOrtho( -6.0*(float)w/((float)h*3),

6.0*(float)w/((float)h*3), -2.0, 2.0, 0.0, 10.0 );

gluLookAt( 0,0,3, 0,0,0, 0,1,0 );

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

void main()

{

auxInitDisplayMode( AUX_SINGLE | AUX_RGBA | AUX_DEPTH );

auxInitPosition( 0, 0, 450, 150 );

auxInitWindow( "Лекция 6. Программа 6.4" );

light_init();

auxMouseFunc( AUX_LEFTBUTTON, AUX_MOUSEDOWN, cycle_fog );

auxReshapeFunc( resize );

auxMainLoop( display );

}

Программа 6.4. Пять чайников в тумане.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]