Популярные услуги

КМ-6. Динамические массивы. Семинар - выполню любой вариант!
КМ-2. Разработка простейших консольных программ с использованием ООП + КМ-4. Более сложные элементы ООП - под ключ!
Оба семинара по программированию под ключ! КМ-2. Разработка циклических алгоритмов + КМ-3. Функции и многофайловые программы в Си
Любая задача на C/C++
Одно любое задание в mYsql
Сделаю ваше задание: Лабораторная работа на Pascal / Lazarus
Любой тест по базам данных максимально быстро на хорошую оценку - или верну деньги!
Любой реферат по объектно-ориентированному программированию (ООП)
Повышение уникальности твоей работе
Все письменные КМ под ключ за 3 суток! (КМ-6 + КМ-7 + КМ-8 + КМ-9 + КМ-10)

Освещение и свет

2021-03-09СтудИзба

· Лекция 7. Освещение и свет.

· 1 Простая модель освещения

Световая энергия, падающая на поверхность, может быть поглощена, отражена или пропущена. Объект можно увидеть, только если он отражает или пропускает свет; если же объект поглощает весь падающий свет, то он невидим и называется абсолютно черным телом. Если объект отражает весь падающий свет, то он называется идеальной отражающей поверхностью (зеркалом). Количество поглощенной, отраженной или пропущенной энергии зависит от длины волны света. При освещении белым светом, если поглощается почти весь свет, то объект кажется черным, а если только небольшая его часть — белым. Если поглощаются лишь определенные длины волн, то у света, исходящего от объекта, изменяется распределение энергии и объект выглядит цветным. Цвет объекта определяется поглощаемыми длинами волн.

Свойства отраженного света зависят от строения, направления и формы источника света, от ориентации и свойств освещаемой поверхности. Отраженный от объекта свет может быть диффузным или зеркальным.

1.1 Диффузное отражение

Диффузное отражение света происходит, когда свет как бы проникает под поверхность объекта, поглощается, а затем вновь испускается. При этом положение наблюдателя не имеет значения, так как диффузно отраженный свет рассеивается равномерно по всем направлениям.

Свет точечного источника отражается от идеального рассеивателя по закону косинусов Ламберта: интенсивность отраженного света пропорциональна косинусу угла между направлением света и нормалью к поверхности, т. е.

Id = Il Kd cos q    0 ³ q £ p/2

где Id — интенсивность диффузно отраженного света, Il — интенсивность точечного источника, Kd — коэффициент диффузного отражения (0 ³ Kd £ 1), q  — угол между направлением света и нормалью к поверхности (рис. 1).

Рекомендуемые материалы

Рис. 1 Схема диффузного отражения.

Если q > p/2, то источник света расположен за объектом. Коэффициент диффузного отражения Kd зависит от материала и длины волны света, но в простых моделях освещения обычно считается постоянным.

Поверхность предметов, изображенных при помощи модели освещения с ламбертовым диффузным отражением, выглядит блеклой и матовой. Предполагается, что источник точечный, поэтому объекты, на которые не падает прямой свет, кажутся черными. Однако на объекты реальных сцен падает еще и рассеянный свет, отраженный от окружающей обстановки, например от стен комнаты. Рассеянному свету соответствует распределенный источник. Поскольку для расчета таких источников требуются большие вычислительные затраты, в машинной графике они заменяются на коэффициент рассеяния — константу, которая входит в формулу в линейной комбинации с членом Ламберта:

Id = Ia Ka + Il Kd cos q    0 ³ q £ p/2 ,

где Ia — интенсивность рассеянного света, Ka — коэффициент диффузного отражения рассеянного света (0 ³ Ka £ 1).

Пусть даны два объекта, одинаково ориентированные относительно источника, но расположенные на разном расстоянии от него. Если найти их интенсивность по данной формуле, то она окажется одинаковой. Это приводит к тому, что, в случае перекрытия предметов, их невозможно различить.

Интенсивность света обратно пропорциональна квадрату расстояния от источника, следовательно, объект, лежащий дальше от него, должен быть темнее. В случае перспективного преобразования сцены в качестве коэффициента пропорциональности можно взять расстояние d от центра проекции до объекта. Но если центр проекции лежит близко к объекту, то 1/d2 изменяется очень быстро, т. е. у объектов, лежащих примерно на одинаковом расстоянии от источника, разница интенсивностей чрезмерно велика. Как показывает опыт, большей реалистичности можно добиться при линейном затухании. В этом случае модель освещения выглядит так:

Id = Ia Ka + Il Kd cos q/(d+K),

где К произвольная постоянная, а d - расстояние от центра проекции до объекта.

Если предполагается, что точка наблюдения находится в беско­нечности, то d  определяется положением объекта, ближайшего к точке наблюдения. Это означает, что ближайший объект освещает­ся с полной интенсивностью источника, а более далекие — с умень­шенной. Для цветных поверхностей модель освещения применяется к каждому из трех основных цветов.

1.2 Зеркальное отражение

Интенсивность зеркально отраженного света зависит от угла падения, длины волны падающего света и свойств вещества отражающей поверхности. Зеркальное отражение света является направленным. Угол отражения от идеальной отражающей поверхности (зеркала) равен углу падения, в любом другом положении наблюдатель не видит зеркально отраженный свет (рис. 2). Это означает, что вектор наблюдения S совпадает с вектором отражения R, и угол a равен нулю. Если поверхность не идеальна, то количество света, достигающее наблюдателя, зависит от пространственного распределения зеркального отраженного света. У гладких поверхностей распределение узкое или сфокусированное, а у шероховатых более широкое.

Рис. 2. Схема зеркального отражения

Благодаря зеркальному отражению на блестящих предметах появляются световые блики. Из-за того, что зеркально отраженный свет сфокусирован вдоль вектора отражения, блики при движении наблюдателя тоже перемещаются. Более того, так как свет отражается от внешней поверхности (за исключением металлов и некоторых твердых красителей), то отраженный луч сохраняет свойства падающего. Например, при освещении блестящей синей поверхности белым светом, возникают белые, а не синие блики.

Так как физические свойства зеркального отражения очень сложны, в простых моделях освещения обычно пользуются эмпирической моделью Буи-Туонга Фонга:

Is = Il w(q,l)cosn a ,

где w(q,l) — кривая отражения, представляющая отношение зеркально отраженного света к падающему как функцию угла падения q и длины волны l  (рис. 3), а cosn a функция, аппроксимирующая пространственное распределение зеркально отраженного света (рис. 4.). Большие значения n дают сфокусированные пространственные распределения характеристик металлов и других блестящих поверхностей, а малые — более широкие распределения для неметаллических поверхностей, например бумаги.

Рис. 3. Кривые отражения

Рис. 4. Приближенные функции пространственного распределения для зеркального отражения.

Коэффициент зеркального отражения зависит от угла падения, однако даже при перпендикулярном падении зеркально отражается только часть света, а остальное либо поглощается, либо отражается диффузно. Эти соотношения определяются свойствами вещества и длиной волны. Коэффициент отражения для некоторых неметаллов может быть всего 4%, в то время как для металлических материалов — более 80%.

1.3 Общая модель

Объединяя формулы диффузного отражения и зеркального отражения, получим модель освещения:

I = Ia Ka + Il(Kd cos q + w(i,l)cosn a )/(d+K).

Поскольку функция w(i,l) довольно сложна, ее обычно заменяют константой Ks, выбираемой экспериментально из эстетических соображений:

I = Ia Ka + Il(Kd cos q + Ks cosn a )/(d+K).

В машинной графике эта модель часто называется функцией закраски и применяется для расчета интенсивности или тона точек объекта или пикселов изображения. Чтобы получить цветное изображение, нужно найти функции закраски для каждого из трех основных цветов.

Если имеется несколько источников света, то их эффекты суммируются. В этом случае модель освещения определяется как

,

где m – количество источников.

Косинусы углов, входящие в формулу, можно представить как произведения двух векторов

cos q = n*L / |n||L| = n*L ,

где n и L – соответсвенно, единичные векторы нормали к поверхности и направления на источник. Аналогично

cos a = R*S / |R||S| = R*S ,

где R и S – соответсвенно, единичные векторы, определяющие направление отраженного луча и наблюдения. Общее уравнение модели освещения определится следующим образом:

I = Ia Ka + Il(Kd (n*L) + Ks (R*S)n)/(d+K).

· 2 Источники света в OpenGL

В OpenGL используется два типа источников света - направленные и позиционные.

Под направленным понимается источник, удаленный от освещаемой сцены на бесконечное расстояние. Следовательно, все лучи, падающие на сцену, параллельны, затухание отсутствует. Примером такого источника в реальном мире может служить солнце. Для данного типа источников необходимо определить только направление лучей и характеристики светового потока. Расчет освещения в этом случае относительно прост, так как угол падения света одинаков для всех точек одной плоскости.

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

Для изучения свойств позиционных источников света используем метафору фонаря (рис. __), достаточно хорошо соответствующую реальным свойствам источника света OpenGL.

Рис. __. Модель источника освещения

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

Теперь рассмотрим, как эти и другие параметры источника света устанавливаются в OpenGL.

Источник света с номером i, включается или выключается командами glEnable или gIDisable с аргументом GL_LIGHTi, который определяется как GL_LIGHTi = GL_LIGHT0 + i, , где i лежит в диапазоне от 0 до GL_MAX_LIGHTS -  которое не может быть больше восьми. Общее число источников зависит от реализации. Источники можно включать или выключать в любое время, но лучше перед включением установить их параметры.

Установка параметров источников света производится командой gILight, значения аргументов которой зависят от того, работаем с ее скалярной или векторной версией:

gILight[i f]v(light GLenum, pname GLenum, param GLfloat)

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

Скалярной версией команды можно установить следующие значения pname:

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

GL_SPOT_CUTOFF - Параметр раrат является целым или вещественным значением, которое определяет максимальный угол разброса источника света (световой конус). Доступны значения из диапазона [0, 90] и 180. По умолчанию используется значение 180, что соответствует рассеянному свету. В нашей метафоре этот параметр определяет конструкцию отражателя. При значении 180 происходит смена метафоры. Фонарь заменяется на лампочку (без абажура).

GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION - Параметр раrат задает единственное целое или вещественное значение, определяющее один из трех факторов ослабления — постоянного, линейного или квадратичного. Допустимыми являются только неотрицательные значения. Интенсивность источника света ослабевает в соответствии с суммарным значением: постоянного фактора, линейного фактора, умноженного на расстояние между источником и вершиной, и квадратичного фактора, умноженного на квадрат того же расстояния:

______1______  ,

k0i+k1iSi+k2iS2i

где ki - соответствующие коэффициенты ослабления, a Si - расстояние от источника. По умолчанию факторы ослабления имеют значения (1, 0, 0).

С помощью векторной версии команды  glLight[i f]v можно задать дополнительные значения параметра pname:

GL_AMBIENT - Параметр params содержит четыре целых или вещественных значения RGBA, которые определяют интенсивность фонового освещения. По умолчанию значение рассеянного света равно (0.0, 0.0, 0.0, 1.0).

GL_DIFFUSE - Параметр params содержит четыре целых или вещественных значения RGBA, которые определяют интенсивность диффузного освещения. По умолчанию значение интенсивности диффузного света равно (0.0, 0.0, 0.0, 1.0) для всех источников кроме нулевого, для которого эта интенсивность равна (1.0, 1.0, 1.0, 1.0).

GL_SPECULAR -Параметр params содержит четыре целых или вещественных значения RGBA, которые определяют интенсивность освещения зеркального отражения. По умолчанию значение интенсивности зеркального отражения равно (0.0, 0.0, 0.0, 1.0) для всех источников кроме нулевого, для которого она равна (1.0, 1.0, 1.0, 1.0)
В OpenGL общая, диффузная и зеркальная составляющие света насчитываются отдельно, а затем суммируются.

GL_POSITION - Параметр params содержит четыре целых или вещественных значения, задающих координатный вектор [x, y, z, w], смысл которого определяет значение масштабирующего коэффициента w. Обратите внимание, этот вектор преобразуется видовой матрицей и сохраняется в видовых координатах.
Если компонент w равен 0, то данный источник рассматривается как направленный источник. А диффузное и зеркальное освещение рассчитываются в зависимости от направления, определяемого вектором, соединяющим точку, определяемую тройкой (x, y, z) c началом мировой системы координат. Ослабление заблокировано.
В противном случае, при w = 1, данный источник рассматривается как позиционный. Координатный вектор определяет положение источника света в однородных мировых координатах. Вектор так же преобразуется видовой матрицей и сохраняется в видовых координатах. Параметры освещения рассчитываются на основе действительного расположения источника в видовых координатах, ослабление разрешено. По умолчанию координатный вектор равен [0, 0, 1, 0], что соответствует удаленному в бесконечность источнику света, лучи которого направлены в сторону отрицательной полуоси Z мировой системы координат.

GL_SPOT_DIRECTION - Параметр params содержит три целых или вещественных значения (x, y, z), определяющие вектор направления света позиционного источника в однородных мировых координатах. Направление света источника по умолчанию задается значениями (0, 0, -1). Так же обратим внимание, на то, что этот вектор преобразуется видовой матрицей и сохраняется в видовых координатах. Рассмотрим подробнее смысл этой важного замечания. То есть в момент вызова команды glLight с соответствующими параметрами, формируется координатный вектор, который умножается на матрицу видового преобразования, переводится в видовые координаты и запоминается. Таким образом, положение источника и направление света, подобно геометрическим примитивам, подвергается повороту, переносу и другим геометрическим преобразованиям, накопленным в матрице видового преобразования на данный момент. Матрица проекций не оказывает влияния на эти свойства источника. Используя данный подход, легко сохранять неподвижность источника при движении сцены, или наоборот, организовать движение источника относительно неподвижной сцены.

Включение режима расчета освещения производиться командой glEnable с параметром GL_LIGHTING.

2.1 Модель освещения

Параметры модели задаются командой:

glLightModel[i f] v(GLenum pname, GLenum param)

Аргумент pname определяет единственное значение параметра модели освещения и может принимать следующие значения:

GL_LIGHT_MODEL_LOCAL_VIEWER - Параметр param содержит единственное булевское значение, определяющее местоположение наблюдателя. Если param = GL_FALSE, то направление наблюдения считается параллельным оси -z и направленным вдоль нее, независимо от действительного положения в видовых координатах. В противном случае (GL_TRUE) предполагается, что наблюдатель находится в начале видовой системы координат. По умолчанию параметр param установлен в GL_FALSE.

Использование локальной точки наблюдения позволяет создать более реалистичную картину зеркального освещения, так как для каждой точки поверхности формируется вектор, направленный на наблюдателя. В случае наблюдателя, расположенного в бесконечности, данный вектор для всех точек одинаков и направлен вдоль оси Z.

GL_LIGHT_MODEL_TWO_SIDE - Параметр param представляет единственное булевское значение, которое определяет расчет освещенности многоугольников для одной или двух граней. Этот параметр не влияет на расчет освещенности для точек, линий или битовых массивов. Если param = FALSE, то задано одностороннее освещение, и расчет освещенности производится только для лицевой грани. В противном случае (TRUE) задается двухстороннее освещение и, на ряду с лицевыми гранями, рассчитывается освещенность вершин обратных граней многоугольников. Их нормали направлены в противоположные стороны. По умолчанию FALSE. Если сцену составляют только замкнутые пространственные объекты (сферы, кубы и пр.), без сечений то целесообразно использовать расчет освещения только лицевых граней, что существенно ускоряет визуализацию объектов сцены.

GL_LIGHT_MODEL_COLOR_CONTROL - Параметр param может определятся символической константой GL_SEPATARE_SPECULAR_COLOR, заставляющей конвейер отделять вычисление зеркально отраженного света от других составляющих. В этом случае для каждой вершины рассчитываются два значения цвета: первое значение образуется совокупность всех не зеркальных составляющих, а второе суммой зеркальных составляющих. Данный режим важен при наложении текстур. При расчете результирующего цвета сначала первое значение комбинируется с цветовыми характеристиками текстуры, а затем результат объединяется со вторым значением. Такой подход позволяет получить более ярко выраженные зеркальные блики на текстурированной поверхности. Для возврата к значению, установленному по умолчанию, необходимо воспользоваться константой GL_SINGLE_COLOR .

Кроме того, для векторной версии команды доступно еще одно значение параметра pname.

GL_LIGHT_MODEL_AMBIENT - Параметр param содержит четыре целых или вещественных значения, которые задают полную фоновую интенсивность света. По умолчанию значение фонового цвета равно (0.2, 0.2,0.2, 1.0).

2.3 Грани

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

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

Если они обходятся по часовой стрелке, то видимой является одна из граней; если против часовой стрелки, то другая.

Выбор, какую грань считать лицевой, а какую обратной, осуществляется при помощи команды

glFrontFace(Glenum mode),

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

Команда:

glCullFace(GLenum mode)

позволяет указать какие грани - лицевые или обратные будут исключены из рассмотрения. Параметр mode может принимать одно из двух значений: GL_FRONT — для лицевых и GL_BACK — для обратных граней (последнее используется по умолчанию).

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

2.2 Свойства материала

Прежде, чем переходить к описанию способов задания свойств материалов, отметим различный смысл похожих параметров у источников света и материалов. В обоих случаях мы определяем цветовые характеристики. Однако у источников света эти характеристики соответствуют процентному отношению цветов в конкретной составляющей светового потока, испускаемого источником. Например, если мы определили диффузную составляющую источника как (1,1,1,0), то это означает, что в световом потоке, исходящем от источника, присутствует свет, способный диффузно отразиться от поверхности. В его состав входят красный, синий и зеленый цвета в равных пропорциях и при максимальной интенсивности. В общем, такой свет можно охарактеризовать как белый.

У материалов аналогичные характеристики определят степень отражения составляющих цветов. Так если мы зададим диффузную компоненту материала как (0.5,0,0,0), то данное определение будет означать, что данный материал диффузно отражает только красный свет и с половинной интенсивностью. А зеленый и синий цвета будут полностью поглощены поверхностью объекта. В результате освещения этого объекта рассмотренным источником поверхность объекта будет выглядеть темно-красной.

Если осветить данный объект источником с диффузной составляющей равной (0,1,1,0), то он будет выглядеть черным.

Таким образом, общая, диффузная и зеркальная составляющие отраженного поверхностью света будут рассчитываться по следующей схеме (LR*MR, LG*MG, LB*MB). Где (LR, LG, LB) – цветовые характеристики составляющей падающего света, а (MR, MG, MB) – характеристики отражения поверхностью данной составляющей.

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

Рассмотрим команду:

glMaterial[i f] [v]( face GLenum, pname GLenum, params GLtype).

Параметры материала, как и во многих других случаях, различаются для лицевой и обратной поверхностей. Параметры лицевой грани используются для точек, линий, битовых массивов и всех многоугольников, когда заблокировано двустороннее освещение, или только для лицевых, если двустороннее освещение разрешено. К каким поверхностям применяются задаваемые параметры, определяется аргументом face, который может принимать следующие значения: GL_FRONT, GL_BACK, GL_FRONT_AND_BACK.

Аргумент pname определяет, какие параметры материала будут обновляться. Для скалярной версии команды он может принимать только одно значение — GL_SHININESS, задающее степень зеркального отражения материала. Для векторной версии можно использовать следующие значения:

GL_AMBIENT - Параметр params содержит четыре целых или вещественных значения цветов RGBA, которые определяют рассеянный цвет материала. По умолчанию значение рассеянного цвета равно (0.2, 0.2, 0.2, 1.0);

GL DIFFUSE - Параметр params содержит четыре целых или вещественных значения RGBA, которые определяют цвет диффузного отражения материала. По умолчанию значение диффузного цвета равно (0.8, 0.8, 0.8,1.0); эта составляющая оказывает наибольшее влияние на результирующий цвет объекта. Обратите внимание. При смешивании цветов значения альфа компоненты всех других параметров игнорируется. Учитывается только альфа компонента, заданная для диффузного отражения.

GL SPECULAR - Параметр params содержит четыре целых или вещественных значения RGBA, которые определяют цвет зеркального отражения материала. По умолчанию значение зеркального цвета равно (0.0, 0 0, 0.0, 1.0).

GL_EMISSION - Параметр params содержит четыре целых или вещественных значения RGBA, которые определяют интенсивность излучаемого света материалом. По умолчанию значение излучаемого света равно (0.0, 0.0, 0.0, 1.0). Данное свойство используется для имитации фосфора и люминофоров, а так же для отображения источников света.

GL_SHININESS - Параметр params содержит одно целое или вещественное значение, которые определяют степень зеркального отражения материала. Можно использовать только значения от 0 до 128. По умолчанию установлено значение 0. Напомним что интенсивность зеркального отражения расчитывается на основе модели Фонга Is = Ilw(q,l)cosna и данный параметр определяет n — степень, аппроксимирующую пространственное распределение зеркально отраженного света.

GL_AMBIENT_AND_DIFFUSE - Эквивалентно двум вызовам команды с аргументами рnате, равными GL_AMBIENT и GL_DIFFUSE, и одинаковыми значениями параметра params

GL_COLOR_INDEXES - Параметр params содержит три целых или вещественных значения, определяющих индексы цветов для рассеянного, диффузного и зеркального отражения соответственно.

Из приведенного описания видно, что, задавая параметры материала, можно управлять тем, насколько блестящим будет выглядеть материал, и будет ли он самостоятельно излучать свет. Другими словами, можно определять отражающие свойства материала. Наиболее часто учитываемыми в различных моделях являются диффузный и зеркальный отраженный свет, поскольку диффузное отражение придает объекту его естественный цвет, а зеркальное определяет отражающие свойства поверхности: на очень блестящей поверхности зеркальное отражение приводит к появлению резко очерченных бликов, а для менее блестящих объектов выглядит более тускло. Таким образом, чтобы объект выглядел блестящим, необходимо сузить угол зеркального отражения, а для тусклых поверхностей наоборот расширить его.

Наряду с только что рассмотренной командой, для установки параметров материала в OpenGL реализована еще одна:

glColorMaterial(face GLenum, mode GLenum)

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

Определение нормалей и функции закрашивания

Плоское закрашивание

Для расчета интенсивности освещения поверхности в заданной точке, согласно рассмотренной модели, необходимо определить четыре вектора: направления на источник, направления на наблюдателя, отраженного света и нормаль. Определение первых трех векторов достаточно очевидно, а вычисление нормалей вызывает определенные трудности. Если окрашиваемая поверхность задана явным уравнением, то определение нормалей можно произвести классическими математическими методами. Нас больше интересуют частные случаи и приближенные методы вычислений, так как строгие расчеты требуют огромного объема вычислений. Как вы помните, поверхности при визуализации чаще всего аппроксимируются множеством малых плоских многоугольников (треугольниками или четырехугольниками). Нормали для всех точек плоскости совпадают и могут быть рассчитаны, исходя из координат любых трех точек плоскости, не лежащих на одной прямой. N = (p2-p0)*(p1-p0). Порядок сомножителей определит направление нормали относительно плоскости. При перестановке сомножителей получаются коллинеарные вектора (имеющие противоположное направление).

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

Для того, чтобы устранить данный эффект, необходимо сгладить переход между оттенками соседних участков.

Закрашивание методом Гуро

Метод сглаживания, предложенный Гуро, предполагает усреднение нормалей и билинейную интерполяцию интенсивностей, рассчитанных для каждой вершины многоугольника.

Вектора нормалей определяются для всех вершин многоугольников аппроксимирующих поверхность. Для усреднения нормали к некоторой вершине суммируются нормали ко всем многоугольникам, пересекающимся в этой вершине. Полученный результат нормализуется. Например, для вершины, в которой пересекаются четыре многоугольника, нормаль может быть посчитана следующим образом .

В некоторых случаях нормаль к вершине можно получить значительно легче. Например, при аппроксимации сферы нормаль к любой ее точке определится вектором, соединяющим центр сферы и данную точку. Необходимо только произвести его нормализацию.

Сложность реализации расчета нормалей по методу Гуро сводится к разработке модели, отражающей топологию объекта. То есть, исходя из данной модели, мы должны определять для каждой вершины все многоугольники, стыкующиеся в ней.

Для проведения билинейной интерполяции рассчитывают интенсивности в вершинах многоугольника, а для определения интенсивностей всех других точек проводят интерполяцию с помощью сканирующей строки. Рассмотрим участок полигональной поверхности, приведенный на рисунке. Интенсивность в точке P определяется линейной интерполяцией интенсивностей рассчитанных для точек Q и R. Линейная интерполяция производится на основе параметрического уравнения прямой, проходящей через две точки

P = P1t+(1-t)P2 . Очевидно, что при t=0 получаем точку P1, а при t=1 точку P2.

Аналогично интенсивность в точке P определиться как

IP = tIq+(1-t)Ir где 0 £ t £1 t= QP/QR.

Для получение интенсивности в точке Q интерполируем интенсивности в точках А и В.

Iq = uIa+(1-u)Ib где 0 £ u £ 1 u= AQ/AB.

Из этих же рассуждений находим интенсивность в точке R.

Ir = wIb+(1-w)Ic где 0 £ w £ 1 w= BR/BC.

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

Рассчитаем интенсивность для двух произвольных точек сканирующей строки.

IP1 = t1Iq+(1-t1)Ir,

IP2 = t2Iq+(1-t2)Ir

Найдем разность интенсивностей и выразим интенсивность во второй точке через интенсивность в первой точке:

IP2 = IP1+( Iq-Ir)(t2-t1)= Ip1+dIdt.

Другими словами, при постоянном шаге по параметру приращение интенсивности постоянно.

Закраска Гуро дает более реалистичное представление поверхности, однако не устраняет полностью полос Маха, так как обеспечивает только непрерывность значений интенсивностей вдоль границ многоугольников, не обеспечивая непрерывности изменения интенсивности (функция непрерывна, но производная имеет разрыв).

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

Рассмотрим пример. Выходом из данной ситуации является введение дополнительных многоугольников.

Закраска Фонга

Закраска Фонга предполагает интерполяцию не рассчитанных значений интенсивностей, а векторов нормалей. Такой подход требует значительно больших объемов вычислений, но при этом получается более реалистичное изображение.

nQ=unA+(1-u)nB   0 £ u £1

nR=wnB+(1-w)nC   0 £ w £1

nP=tnQ+(1-t)nR   0 £ t £1

где u=AQ/AB, w=BR/BC, t=QP/QR

nP2 = nP1+(nQ-nR)(t2-t1) = nP1+dndt

· 3 Цвет в машинной графике

Цвет — чрезвычайно сложная проблема, т. к. он имеет как психофизиологическую, так и физическую природу. Другими словами, цвет предмета зависит не только от самого предмета, но также и от источника света, освещающего предмет, и от системы человеческого видения. Более того, одни предметы отражают свет (доска, бумага), а другие его пропускают (стекло, вода). Если поверхность, которая отражает только синий свет, освещается красным светом, она будет казаться черной. Аналогично, если источник зеленого света рассматривать через стекло, пропускающее только красный свет, от тоже покажется черным.

Самым простым является ахроматический цвет, т. е. такой, какой мы видим на экране черно-белого телевизора. При этом белыми выглядят объекты, ахроматически отражающие более 80% света белого источника, а черными — менее 3%. Промежуточные значения дают различные оттенки серого. Единственным атрибутом такого цвета является интенсивность или количество. С интенсивностью можно сопоставить скалярную величину, определяя черное как 0, а белое как 1. Тогда среднесерому цвету будет соответствовать значение 0.5.

Если воспринимаемый свет содержит длины волн в произвольных неравных количествах, то он называется хроматическим. При субъективном описании такого цвета обычно используют три величины: цветовой тон, насыщенность и светлота. Цветовой тон позволяет различать цвета, такие как красный, зеленый, желтый и т. д. Насыщенность характеризует чистоту, т. е. степень ослабления (разбавления) данного цвета белым светом, и позволяет отличать розовый цвет от красного, изумрудный от ярко-зеленого и т. д. Другими словами, по насыщенности судят о том, насколько мягким или резким кажется цвет. Светлота отражает представление об интенсивности, как о факторе, не зависящем от цветового тона и насыщенности.

В основе трехкомпонентной теории света лежит предположение о том, что в центральной части сетчатки глаза находятся три типа чувствительных к цвету колбочек. Первый воспринимает зеленый цвет, второй — красный, а третий — синий цвет. Относительная чувствительность глаза максимальна для зеленого цвета и минимальна для синего. Если на все три типа колбочек воздействует одинаковый уровень энергетической яркости, то свет кажется белым. Ощущение белого цвета можно получить, смешивая любые три цвета, если ни один из них не является линейной комбинацией двух других. Такие цвета называют основными. Человеческий глаз способен различать около 350 000 различных цветов.

В компьютерной графике применяются две системы смешивания основных цветов: аддитивная — красный, зеленый, синий (RGB) и субтрактивная — голубой, пурпурный, желтый (CMYK). Цвета одной системы являются дополнительными к цветам другой: голубой — к красному, пурпурный — к зеленому, а желтый — к синему. Дополнительный цвет — это разность белого и данного цветов. Субтрактивная система цветов CMYK применяется для отражающих поверхностей, например, типографских красок, пленок и несветящихся экранов. Аддитивная цветовая система RGB удобна для светящихся поверхностей, например экранов ЭЛТ или цветных ламп и т.д. Цветовые пространства RGB и CMYK трехмерны, и их условно можно изобразить в виде куба. Началом координат в кубе RGB служит черный цвет, а в СMYK — белый.

Рис. __. Цветовые кубы: RGB (a), CMY (б)

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

[RGB] = [1 1 1]-[CMY].

В OpenGL используется цветовая модель RGB.

Художники пользуются иными принципами и характеризуют цвета как различные разбелы, оттенки и тона предельно насыщен­ных или чистых пигментов. Разбел получается при добавлении белого пигмента к чистому пигменту; при этом уменьшается насы­щенность. Оттенок получается при добавлении черного пигмента к чистому пигменту, в результате чего снижается светлота. Тона получаются при добавлении черного и белого пигментов к чистому пигменту. Во всех этих случаях получаются различные цвета одного и того же цветового тона, отличающиеся насыщенностью и светлотой. При смешении только черного и белого пигментов получаются серые цвета. На рис. 17.9 показаны соотношения между разбелами, оттенками и тонами. Можно было бы предложить измерять цвет процентным содержанием пигментов, смешение которых дает интересующий нас цвет.

Рис. ___. Разбелы, тона и оттенки

Рис. __. Одиночный шестигранный конус цветовой модели HSV.

Бесплатная лекция: "Занятие 7" также доступна.

 

Рис. __. Цветовой куб модели RGB, если на него смотреть вдоль главной диагонали. Видимые ребра куба изображены сплошными линиями, а невидимые – штриховыми.

3.1 Цветовая модель HSV

Цветовые модели RGB, CMYK являются аппаратно-ориентированными. В отличие от них предложенная Смитом модель HSV ориентирована на пользователя. В ее основу положены интуитивно принятые художниками понятия разбела, оттенка и тона. Подпространство, определяемое моделью, представляет собой шестигранный конус (рис. 2). Верхняя часть шестигранного конуса соответствует значению V=1; цвета при этом выражены с наибольшей интенсивностью. Отметим, что дополнительные цвета расположены друг против друга, т. е. отличаются один от другого на угол H=180°. Этот угол отсчитывается вокруг вертикальной оси, причем начало отсчета совпадает с красным цветом. Значением S является отношение, изменяющееся в диапазоне от 0 на осевой линии (ось V) до 1 на треугольных боковых гранях шестигранного конуса. Насыщенность измеряется относительно цветового охвата, задаваемого моделью.

Высота шестигранного конуса составляет единицу по координате V, а вершина конуса лежит в начале координат. Точка, в которой находится вершина, соответствует черному цвету; ее координата  V=0. С точкой V=0 может быть связано любое значение координаты S в диапазоне 0—1. Точка с координатами S=0, V=1 соответствует белому цвету. Промежуточные значения координаты V при S=0 (т. е. на осевой линии) соответствуют серым цветам. При S=0 значение H считается неопределенным. Если же S не равно нулю, значение H уже определено. Например, чистому красному цвету соответствуют координаты H=0, S=1, V=1. В самом деле, любой цвет с координатами V=1, S=1 похож на чистый пигмент, который художники используют в качестве начального приближения при смешении цветов. Добавление белого пигмента соответствует уменьшению V (без изменения S). Тона получаются путем уменьшения как S, так и V. И наконец, меняя координату H, можно выбрать чистый пигмент, с которым будем работать. Таким образом, координа­ты H, S и V взаимно однозначно соответствуют понятиям цветовой системы художника.


Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Нашёл ошибку?
Или хочешь предложить что-то улучшить на этой странице? Напиши об этом и получи бонус!
Бонус рассчитывается индивидуально в каждом случае и может быть в виде баллов или бесплатной услуги от студизбы.
Предложить исправление
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5140
Авторов
на СтудИзбе
441
Средний доход
с одного платного файла
Обучение Подробнее