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

4. Сводка результатов

OpenGL позволяет задавать свойства материала, который приписывается объектам сцены. Значения этих свойств используются в модели освещения при вычислении цвета пикселей изображения сцены. Основными свойствами материала являются компоненты диффузного, рассеянного и зеркального отражения. Эти свойства напоминают свойства источников света. Кроме того, у материала есть свойство "блеск" и может быть свойство "излучаемый свет", который влияет только на вид объекта и не играет роли нового источника света. В лекции приведена таблица со свойствами материала, которые соответствуют некоторым реальным материалам.

Значения цвета в OpenGL задаются четырьмя компонентами RGBA. Четвертая компонента A (альфа) используется в служебных целях для расчета цвета пикселей в режиме смешения цветов. В лекции описано, как применить режим смешения цветов для реализации одного из наиболее распространенных эффектов освещения – прозрачности.

Компьютерные изображения в некоторых случаях выглядят чересчур высококачественными и нереалистичными. Одно из простейших средств повышения реалистичности изображений – туман. OpenGL позволяет задать ряд свойств тумана, например, цвет и плотность. Когда туман включен, то по мере удаления от наблюдателя объекты постепенно расплываются и закрашиваются цветом тумана.

5. Упражнения Упражнение 1

На основе фрагмента программы 6.1 напишите программу, рисующую 12 сфер с различными свойствами материала. Сферы должны располагаться в три строки, которые отличаются рассеянной составляющей:

Cтрока 1 – рассеянная компонента отсутствует, т.е. равна {0.0, 0.0, 0.0, 0.0};

Cтрока 2 – серая рассеянная компонента, {0.7, 0.7, 0.7, 1.0};

Cтрока 3 – желтая рассеянная компонента, {0.8, 0.8, 0.2, 1.0}.

Свойства материала в разных столбцах задаются аналогично фрагменту 6.1:

Столбец 1 – синяя диффузная составляющая { 0.1, 0.5, 0.8, 1.0 }, зеркальная отсутствует, блеска нет;

Столбец 2– синяя диффузная, белая зеркальная { 1.0, 1.0, 1.0, 1.0 } и малый блеск 5.0;

Столбец 3 – синяя диффузная, белая зеркальная, большой блеск 100.0;

Столбец 4 – синяя диффузная, нет зеркальной, нет блеска, но есть зеленоватая излучаемая компонента {0.3, 0.2, 0.2, 0.0}.

Обратите внимание, как меняется вид сфер, например, светящиеся сферы выглядят довольно яркими и однородными (т.к. нет зеркальной составляющей).

Упражнение 2

Выполните программу 6.2 и затем добавьте в нее обработчики событий для изменения блеска и излучаемой компоненты.

Упражнение 3

На основе фрагмента программы 6.3 разработайте программу для рисования сферы внутри полупрозрачного цилиндра. Измените ее так, чтобы цилиндр и сфера рисовались внутри третьего объекта (например, полупрозрачной сферы).

Упражнение 4

Выполните программу 6.4. Выясните, как влияют на вид объектов режим автоматического вычисления нормалей и автоматической нормализации нормалей:

glEnable(GL_AUTO_NORMAL);

glEnable(GL_NORMALIZE);

Попробуйте назначить объектам несколько различных материалов, приведенных в табл. 6.2.

ЛЕКЦИЯ 7. Растровые объекты: изображения и текстуры

1. Вывод изображений в буфер OpenGL

Изображение – это двумерный массив, в котором хранятся значения цветов отдельных пикселов. Существует большое количество форматов изображений, отличающихся способом представления цветовых значений (например, формат RGB, RGBA, BGR, палитровый формат) и расположением пикселов внутри массива (например, изображение может храниться в массиве в направлении сверху-вниз или снизу вверх). На дисках изображения записываются в различных графических файловых форматах (BMP, PCX, GIF, JPEG и др.), которые в основном отличаются способами упаковки повторяющихся цветовых значений для сокращения размера файла.

В OpenGL есть функции для работы с изображениями, хранящимися в памяти в виде массива пикселей, но нет функций для чтения/записи графических файлов. Выполнять дисковые операции требуется с помощью других библиотек. В памяти OpenGL позволяет хранить изображения разными способами: значения цвета пикселей может храниться в виде RGB, BGR, RGBA и др. Рассмотрим один из наиболее часто используемых форматов – цвет пиксела хранится в формате RGB и занимает три байта (по байту на каждую из трех компонент). Строки хранятся в памяти последовательно, в порядке снизу-вверх. В библиотеке GLAUX есть функция для загрузки подобного изображения в память из BMP-файла:

AUX_RGBImageRec* auxDIBImageLoadA( const char* filename );

Эта функция возвращает указатель на структуру с динамически созданным изображением:

struct AUX_RGBImageRec {

  int sizeX, sizeY; // Ширина и высота изображения

  unsigned char* data; // Пикселы изображения

};

Для вывода изображения из памяти в буфер кадра в OpenGL предназначена функция glDrawPixels():

void glDrawPixels( int width, height, GLenum format,

GLenum type, const void* pixels );

Чтобы с помощью этой функции вывести изображение в буфер кадра, надо выполнить следующие действия:

  1. загрузить изображение из файла в память;

  2. указать способ хранения изображения в памяти и выравнивание;

  3. установить точку начала вывода изображения (координату его левого нижнего угла)

  4. вывести изображение в буфер.

Рассмотрим выполнение этих действий на примере изображения SUNFLOWR.BMP, сохраненного в формате RGB, 24 бита на пиксел. Сначала в программе надо объявить глобальную переменную:

AUX_RGBImageRec* pImage = NULL;

Затем в функции main() перед входом в главный цикл auxMainLoop( display ) надо внести строку:

pImage = auxDIBImageLoad( "sunflowr.bmp" );

После выхода из главного цикла, перед завершением программы, надо добавить удаление динамически созданного изображения:

delete pImage;

Для вывода этого изображения в буфер кадра в функцию display() надо внести следующие строки:

glRasterPos3d( -3, -2, 1 ); // Нижний левый угол изображения

glPixelZoom( 1, 1 ); // Коэффициенты масштабирования по

// ширине и высоте

glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); // Способ хранения

// изображения в памяти

glDrawPixels( pImage->sizeX, pImage->sizeY, // Ширина и высота в пикселах

GL_RGB, // Формат цвета пикселов

GL_UNSIGNED_BYTE, // Формат цветовых компонент

pImage->data ); // Данные изображения

При выводе в буфер изображения выводятся в масштабе, который задается функцией glPixelZoom(). Модельные преобразования на изображение не влияют, оно всегда выводится "параллельно плоскости экрана". Изображения удобно использовать в качестве статического фона. С помощью несложных преобразований можно сформировать изображение с прозрачными областями (см. упражнение 2).

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