Курсовая работа: Построение реалистичных трехмерных изображений в стандарте OpenGL

Уэтойкомандыаргументfaceможетприниматьтежезначения, чтоивкомандеglMaterial*,ааргументmode –толькозначения GL_AMBIENT_AND_DIFFUSE, GL_AMBIENT, GL_EMISSION, GL_DIFFUSE и GL_SPECULAR. По умолчанию используется GL_AMBIENT_AND_ DIFFUSE. Если разрешен режим GL_COLOR_MATERIAL (вызовом команды glEnableс соответствующим аргументом), то параметры поверхностей материала, заданные аргументами modeи face, принимают значения текущего цвета. В этом случае можно изменять параметры материала для каждой вершины, используя только команду glColor*, без дополнительного вызова glMaterial*,что в некоторых случаях является более удобным.

Грани

Граньюназывается сторона многоугольника. Причем в качестве многоугольника могут выступать как простейший треугольник, так и сложный многоугольник. Единственным условием для них является то, что многоугольник любой степени сложности должен лежать в одной плоскости. Отсюда очевидно, что трехмерные объекты состоят из нескольких плоских многоугольников. И для того, чтобы изобразить «гладкий» конус потребуется достаточно большое число плоских многоугольников. Каждый многоугольник имеет две стороны, т.е. две грани, – лицевую и обратную. И на обеих можно «рисовать». Причем, если мы «рисуем» на лицевой грани, а она в данный момент не видна, то мы только тратим время. Очевидно, что только одна грань может быть видима в окне в текущий момент времени. Для того чтобы не тратить время на воспроизведение невидимых граней, во всех графических системах реализованы механизмы, позволяющие различать лицевые и обратные грани. Естественно, что такой механизм есть и в OpenGL. Причем, в отличие от многих других систем, – очень гибкий. При рассмотрении многоугольных примитивов уже говорилось о важности порядка обхода вершин. И связано это именно с гранями – лицевой и обратной. На рис. 8, на котором представлены два возможных способа обходя вершин.

Рис. 8.Обход вершин по часовой стрелке и против

После того как многоугольник спроецирован в окно, библиотека OpenGL«смотрит», в какой последовательности обходятся вершины многоугольника: если они обходятся по часовой стрелке, то видимой является одна из граней; если против часовой стрелки, то другая. Библиотека OpenGL, в отличие от многих других графических библиотек, позволяет программисту самому определять, какую грань считать лицевой, а какую обратной. Осуществляется это при помощи команды

voidglFrontFace (Glenummode)

которая позволяет определить, какая грань берется в качестве лицевой, в зависимости от направления обхода многоугольника – по часовой стрелке или против. Направление обхода задается параметром mode, который может принимать значения GL_CW– по часовой стрелке и GL_CCW– против часовой стрелки (установлено по умолчанию).

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

voidglCullFace (GLenummode)

эта команда позволяет указать грань – лицевую или обратную. В качестве граней могут использоваться треугольники, квадраты, многоугольники или прямоугольники. Являются они лицевыми или обратными, задается командой glFrontFace. Какие грани будут отображаться, задается параметром mode, который может принимать одно из двух значений: GL_FRONT– для лицевых и GL_BACK– для обратных граней (последнее используется по умолчанию).

Для того чтобы разрешить OpenGL отбирать изображаемые грани, необходимо выполнить команду glEnable с аргументом GL_CULL_FACE. Блокировка этого режима как обычно осуществляется командой glDisableс тем же аргументом.

На рис. 9 представлено окно приложения Faces, для случая, когда направления обхода вершин и режима выбора граней используются значения по умолчанию. Режим отбора граней – заблокирован.

Рис. 9. Объект, у которого видны и лицевая и обратная грани.

Источник света

Рассмотрим, как и какие параметры источника света можно устанавливать. Начнем с команды glLight*, значения аргументов которой зависят от того, работаем мы с ее скалярной или векторной версией.

void glLight[if] (GLenum light, GLenum pname, GLfloat param)

Аргумент lightопределяет номер источника света, общее число которых зависит от реализации. В качестве значения этого параметра следует использовать символическое имя GL_LIGHTi, где i лежит в диапазоне от 0 до GL_MAX_LIGHTS, которое не может быть больше восьми. Аргумент pnameявляется символической константой, определяющей устанавливаемый параметр:


GL_SPOT_EXPONENT

Параметр paramсодержит единственное целое или вещественное значение, которое задает распределение интенсивности света. Доступны значения из диапазона [0, 128]. Эффективность интенсивности света ослабевает пропорционально косинусу угла между направлением от источника и нормалью в вершине (рис. 3). Чем больше это значение, тем более сфокусирован источник света. По умолчанию установлено значение 0, что соответствует рассеянному свету

GL_SPOT_CUTOFF

Параметр paramявляется целым или вещественным значением, которое определяет максимальный угол разброса источника света. Доступны значения из диапазона [0, 90] и 180. По умолчанию используется значение 180, что соответствует рассеянному свету

Аргумент paramопределяет значение, которое устанавливается для параметра pnameисточника light.

После того как установлены параметры источников света, эти источники можно включать и выключать в любое время. Источник света i включается или выключается командами glEnableили glDisable с аргументом GLLIGHTi, который определяется как GL_LIGHTi = GL_LIGHT0 + i.

Определение параметров источников света во многом подобно установке свойств материала. Каждый параметр задается отдельно, а если какой-либо не определен явным образом, то он все равно участвует в процессе освещения со значением, установленным по умолчанию. Отличающиеся параметры интуитивно понятны, и на первом этапе работы с источниками света некоторые трудности может вызвать только тот, который определяет максимальный угол разброса, – GL_SPOT_CUTOFF. Но и он становится совершенно понятным, если посмотреть на рис. 10: чем больше это значение, тем более «рассеянным» становится свет от источника.


Рис. 10. Углы разброса источника света

Рис. 11. Три видимых источника света и один невидимый – фоновый

Возможности OpenGL по поддержке режима освещения не ограничиваются заданием параметров материала и источников света. Имеется возможность определить модель освещения.

К-во Просмотров: 158
Бесплатно скачать Курсовая работа: Построение реалистичных трехмерных изображений в стандарте OpenGL