Построение реалистических изображений
Введение
Компьютерная графика в настоящее время уже вполне сформировалась как наука. Существует аппаратное и программное обеспечение для получения разнообразных изображений – от простых чертежей до реалистичных образов естественных объектов. Компьютерная графика используется практически во всех научных и инженерных дисциплинах для наглядности восприятия и передачи информации. Знание её основ в наше время необходимо любому учёному или инженеру. Она властно вторгается в бизнес, медицину, рекламу, индустрию развлечений и многие другие области. В компьютерной графике имеется уникальная возможность получить в собственное распоряжение очень точного и исполнительного помощника, который может создать любые рисованные картинки, – нужно только проинструктировать его, как это сделать. Для программирования графики можно использовать одну из стандартных библиотек, тем более, что их достаточно много. Графический стандарт OpenGL, разработан и утверждён в 1992 году девятью ведущими фирмами, среди которых: Digital Equipment Corporation, Evans & Sutherland, Hewlett-Packard Co., IBM Corp., Intel Corp., Intergraph Corp., Silicon Graphics Inc., Sun Microsystems Inc. и конечно же Microsoft Corp. В основу стандарта была положена библиотека IRIS GL, разработанная Silicon Graphics. Это достаточно простая в изучении и использовании графическая система, обладающая при этом поразительно широкими возможностями: стабильность, надёжность, переносимость, простота использования. Построение реалистических изображений Построение реалистических изображений включает в себя как физические, так и психологические процессы. Свет, после взаимодействия с окружающей средой попадает в глаз, где вырабатываются электроимпульсы, воспринимаемые мозгом. Восприятие – это приобретаемое свойство. Из опытов известно, что чувствительность глаза к яркости света изменяется по логарифмическому закону. Причем глаз приспосабливается к средней яркости обозреваемой сцены, поэтому область с постоянной яркостью на темном фоне кажется ярче или светлее, чем на светлом. Это явление называется одновременным контрастом(рис. 1).
Рис. 1.Эффект одновременного контраста
Яркость центрального квадрата на обоих рисунках равна 0.5, а охватывающего – 0.8 на левом и 0.2 на правом рисунке. Похожее на одновременный контраст явление существует и для цветов. Еще одним свойством глаза, имеющим значение для компьютерной графики, является то, что границы областей постоянной интенсивности кажутся более яркими, в результате чего такие области воспринимаются как имеющие переменную интенсивность. Это явление называется эффектом полос Махаособенно хорошо заметно на полутоновых поверхностях, заданных многоугольниками. Увеличивая количество граней многоугольников, его можно ослабить, но полностью устранить нельзя (рис. 2). Это только несколько вопросов, возникающих при создании реалистических изображений. Мы же займемся вопросами закрашивания видимых поверхностей. Внешний вид поверхности зависит от вида источника света, которым освещается объект, от свойств поверхности (цвет, текстура, отражательная способность), а также от положения и ориентации поверхности относительно источника света и других поверхностей. Источник света может представлять собой точечный источник, подобный солнцу или лампе накаливания, или же распределенный источник, аналогичный группе ламп дневного света. На практике во многих случаях присутствует также естественный свет, падающий с самых разных направлений.
Рис. 2.Эффект полос Маха
Наиболее простым для моделирования источником является рассеянный естественный свет, т. к. он обеспечивает постоянное освещение всех поверхностей независимо от их ориентации. К сожалению, такой свет дает весьма нечеткие изображения, поскольку достаточно редки ситуации, когда освещение обеспечивается только естественным светом. При естественном освещении две смежные стороны куба должны быть закрашены одинаково, а их общее ребро должно быть неразличимо.
Более сложным (с точки зрения моделирования), но зато более реальным, является точечный источник, при использовании которого освещенность поверхности зависит от ее ориентации: если лучи направлены перпендикулярно к поверхности – она освещена ярко. Чем меньше угол падения лучей, тем меньше освещенность. Такое изменение освещенности позволяет эффективно распознавать трехмерную структуру объекта. Повышение реалистичности изображения может быть достигнуто путем воспроизведения теней, которые отбрасывает объект, освещенный точечным источником света. Тени не только повышают реалистичность изображения, но и являются дополнительным средством для распознавания глубины. Еще одним способом повышения реалистичности изображения является воспроизведение свойств поверхности. Одни поверхности являются матовыми и рассеивают отраженный свет по разным направлениям; другие – обладают блеском и отражают свет только в некоторых направлениях. Поверхности могут быть полупрозрачными, т.е. пропускать часть света и одновременно отражать другую часть. Другим свойством поверхности является их текстура. Очень редко поверхности бывают совершенно гладкими, однако именно такими их моделируют с помощью многоугольников и параметрических поверхностей. Аналогична поверхность редко бывает окрашена равномерно: чаще на ней бывает какой либо узор. Реалистичность изображения можно повысить путем нанесения узора на поверхность. Само перечисление способов построения реалистичных изображений говорит о том, какой большой объем работы необходимо проделать, чтобы получить что-нибудь, в самом деле, стоящее. И это было бы действительно так если бы не библиотека OpenGL, которая берет на себя большую часть «черновой» работы.
Освещение объектов
Световая энергия, падающая на поверхность, частично поглощается и превращается в тепло, а частично отражается и пропускается. Объект можно увидеть, только если он отражает или пропускает свет. Количество поглощенной, отраженной или пропущенной энергии зависит от длины волны света. Если объект поглощает лишь определенные длины волн, то у света, исходящего от объекта, изменяется распределение энергии – объект выглядит цветным. Цвет объекта определяется поглощаемыми длинами волн. Свойства отраженного света зависят от строения, направления и формы источника света, а также от ориентации и свойств поверхности. Отраженный от объекта свет может быть диффузным или зеркальным. Свойством диффузного отражения, т.е. равномерного по всем направлениями рассеивания света, обладают матовые поверхности. При этом кажется, что поверхности имеют одинаковую яркость независимо от угла обзора. Для таких поверхностей справедлив закон, устанавливающий соответствие между количеством отраженного света и косинусом угла между направлением L на точечный источник света и нормалью к поверхности (рис. 3), т.е. количество отраженного света не зависит от положения наблюдателя, а определяется материалом объекта и длиной волны света. Для представления диффузного отражения от цветных поверхностей расчеты проводятся отдельно для основных составляющих цвета.
Рис. 3.Падающий свет и нормаль к поверхности
Зеркальное отражение происходит от внешней поверхности объекта. Если осветить ярким светом яблоко, то в результате зеркального отражения возникнет световой блик, а свет, отраженный от остальной части яблока, появится вследствие диффузного отражения. При этом в том месте, где находится световой блик, яблоко кажется не красным, а скорее белым, т.е. окрашенным в цвет падающего света. Если изменить положение головы, то сместится и световой блик. Это объясняется тем, что блестящие поверхности неодинаково отражают свет по всем направлениям. От идеально отполированной поверхности свет отражается только в том направлении, для которого углы падения и отражения совпадают. Это означает, что наблюдатель сможет увидеть зеркально отраженный свет только в том случае, если угол α равен нулю (рис. 4). Таким образом, интенсивность зеркального отражения зависит от угла падения, длины волны падающего света и свойств вещества.
Рис. 4.Зеркальное отражение
Поверхности могут обладать не только свойствами зеркального и диффузного отражения, но и свойствами направленного и диффузного пропускания. Направленное пропускание света происходит сквозь прозрачные вещества (например, стекло). Через них обычно хорошо видны предметы, даже, несмотря на то, что лучи света, как правило, преломляются, т.е. отклоняются от первоначального направления. Диффузное пропускание света происходит сквозь просвечивающие материалы (например, замерзшее стекло), в которых поверхностные или внутренние неоднородности приводят к беспорядочному перемешиванию световых лучей. Поэтому когда предмет рассматривается через просвечивающее вещество, его очертания размыты. Очевидно, что если имеется не один, а несколько источников света, то каждая из перечисленных составляющих от каждого источника суммируется. Все из перечисленных свойств моделей освещенности нашли свое отражение, с той или иной степенью полноты, в OpenGL. Перечислим те параметры, которые необходимо учитывать при расчете освещенности: текущий вектор нормали, свойства материала, параметры источника света, параметры модели освещения. Рассмотрим каждый из них более подробно с точки зрения поддержки этих параметров вOpenGL. Нормали В самом общем случае нормаль к поверхности представляет ее локальную кривизну, и, следовательно, направление зеркального отражения (рис. 5) Применительно к нашим знаниям можно сказать, что нормалью называется вектор, определяющий ориентацию грани (рис. 6). Вектор нормали является одной из характеристик, ассоциированных с каждой вершиной, и для его определения в OpenGL предусмотрены специальные команды:
void glNormal3 [b s i f d] (type coords) void glNormal3 [b s i f d]v (type coords)
которые присваивают значения координат, заданных параметрами coords, вектору нормали. Аргументы типов GLbyte, GLshortи GLintпреобразуются в формат с плавающей точкой и ограничиваются диапазоном [-1.0, 1.0]. В общем случае нормаль, определяемая этими командами, не имеет единицы длины. Однако если включен режим нормализации (выполнена команда glEnable с аргументом GL_NORMALIZE), то нормали, определенные при помощи этой команды, нормализуются после трансформации. По умолчанию нормализация заблокирована, а вектор нормали имеет координаты (0.0, 0.0, 1.0).
Рис. 5.Векторы нормали Рис. 6.Грань и нормаль к ней
Изменять параметры вектора текущей нормали можно в любой момент времени. И, управляя их текущими значениями, можно добиваться очень интересных эффектов, в частности, при освещении объектов. Свойства материала
Различные материалы по-разному отражают свет. Металл это делает хорошо, а пластиковые поверхности обычно выглядят тусклыми. Кроме того, некоторые поверхности сами излучают свет, например, фосфор. Задавая различные параметры материала, можно управлять тем, насколько блестящим он будет выглядеть, и будет ли он сам излучать свет. На рис. 7 изображены 24 чайника, освещаемые одним источником света.
Рис. 7 Объекты с различными свойствами материала Что здесь для нас интересно? Прежде всего – сами свойства. В приведенном фрагменте мы устанавливали рассеянный, диффузный и зеркальный цвета материала, причем, только для его лицевой поверхности. Можно ли задавать какие-нибудь еще параметры? Для ответа на этот вопрос рассмотрим команды:
void glMaterial [i f] (GLenum face, GLenum pname, GLtype* params) и void glMaterial [i f] v (GLenum face, GLenum pname, GLtype* param)
которые позволяют определить различные свойства материала. Какие именно – зависит от используемых параметров. Параметры материала, как и во многих других случаях, различаются для лицевой и обратной поверхностей. Параметры лицевой поверхности используются для точек, линий, битовых массивов и всех многоугольников, когда заблокировано двустороннее освещение или только для лицевых, если двустороннее освещение разрешено. Параметры для обратных поверхностей определяют затенение невидимых многоугольников, только когда разрешено двустороннее освещение. К каким поверхностям применяются задаваемые параметры, определяется аргументом face:
GL_FRONT лицевые GL_BACK обратные GL_FRONT_AND_BACK и те и другие
Аргумент рnameопределяет, какие параметры материала будут обновляться и может принимать только одно значение – GL_SHININESS, задающее степень зеркального отражения материала для первой версии команды и следующие значения для второй:
Последний аргумент – param (s) содержит значение(я), которые присваиваются соответствующему параметру. Из приведенного описания видно, что, задавая параметры материала, можно управлять тем, насколько блестящим будет выглядеть материал и будет ли он самостоятельно излучать свет. Другими словами, можно определять отражающие свойства материала. Наиболее часто учитываемыми в различных моделях являются диффузный и зеркальный отраженный свет, поскольку диффузное отражение придает объекту его естественный цвет, а зеркальное определяет отражающие свойства поверхности: на очень блестящей поверхности зеркальное отражение приводит к появлению резко очерченных бликов, а для менее блестящих объектов выглядит более тускло. Таким образом, чтобы объект выглядел блестящим, необходимо сузить угол зеркального отражения, а для тусклых поверхностей наоборот расширить его. Используемые при моделировании математические зависимости показывают, что интенсивность отраженного света определяется не углом отражения, а косинусом этого угла. Например, для модели Фонга зависимость имеет вид
Is= w (i, λ) cosnα, где w (i, λ) – кривая отражения, представляющая отношение зеркально отраженного света к падающему как функцию угла падения i и длины волны λ, а n – степень, аппроксимирующая пространственное распределение зеркально отраженного света. Зачем я все это описываю? Дело в том, что в OpenGL имеется возможность косвенного управления углом зеркального отражения. Осуществляется это при помощи параметра GL_SHININESS, позволяющего определять именно значение n. Каждый параметр устанавливается отдельным вызовом команды и, следовательно, не зависит от остальных. Сложность здесь только одна – как определить необходимые значения задаваемых цветов, чтобы получить поверхность того материала, который требуется. Наряду с только что рассмотренной командой, для установки параметров материала в OpenGL реализована еще одна:
void glColorMaterial (GLenum face, GLenum mode)
У этой команды аргумент 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, в отличие от многих других графических библиотек, позволяет программисту самому определять, какую грань считать лицевой, а какую обратной. Осуществляется это при помощи команды
void glFrontFace (Glenum mode)
которая позволяет определить, какая грань берется в качестве лицевой, в зависимости от направления обхода многоугольника – по часовой стрелке или против. Направление обхода задается параметром mode, который может принимать значения GL_CW – по часовой стрелке и GL_CCW – против часовой стрелки (установлено по умолчанию). Кроме возможности самостоятельного определения типа грани – лицевая или обратная, OpenGL предоставляет также механизм, позволяющий исключить из процесса вывода грани одного типа.
void glCullFace (GLenum mode)
эта команда позволяет указать грань – лицевую или обратную. В качестве граней могут использоваться треугольники, квадраты, многоугольники или прямоугольники. Являются они лицевыми или обратными, задается командой 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 является символической константой, определяющей устанавливаемый параметр:
Аргумент param определяет значение, которое устанавливается для параметра pname источника light. После того как установлены параметры источников света, эти источники можно включать и выключать в любое время. Источник света i включается или выключается командами glEnable или glDisable с аргументом GL LIGHTi, который определяется как GL_LIGHTi = GL_LIGHT0 + i. Определение параметров источников света во многом подобно установке свойств материала. Каждый параметр задается отдельно, а если какой-либо не определен явным образом, то он все равно участвует в процессе освещения со значением, установленным по умолчанию. Отличающиеся параметры интуитивно понятны, и на первом этапе работы с источниками света некоторые трудности может вызвать только тот, который определяет максимальный угол разброса, – GL_SPOT_CUTOFF. Но и он становится совершенно понятным, если посмотреть на рис. 10: чем больше это значение, тем более «рассеянным» становится свет от источника.
Рис. 10. Углы разброса источника света
Рис. 11. Три видимых источника света и один невидимый – фоновый
Возможности OpenGL по поддержке режима освещения не ограничиваются заданием параметров материала и источников света. Имеется возможность определить модель освещения. Модель освещения
Параметры модели освещения задаются командами
void gILightModelfi f] (GLenum pname, GLenum param) void glLightModel [i f] v (GLenum pname, contst GLtype* params)
Аргумент pname определяет единственное значение параметра модели освещения и может принимать следующие значения:
Аргумент param определяет значение, которое присваивается параметру модели освещения, заданному параметром pname. Подведем некоторый итог. В режиме RGBA цвет освещенной вершины определяется суммой интенсивностей эмиссии материала, рассеянного отражения материала и полной фоновой интенсивности модели освещения. Вклад каждого источника света складывается из трех составляющих: фоновой, диффузной и зеркальной. Фоновая составляющая складывается из фонового отражения материала и фоновой интенсивности света. Диффузная составляющая определяется диффузным отражением материала, диффузной интенсивностью источника света и нормализованным вектором нормали. И, наконец, зеркальная составляющая определяется зеркальным отражением материала, зеркальной интенсивностью источника света и нормализованными векторами от вершины к источнику света и к наблюдателю. Вклад всех трех составляющих уменьшается в зависимости от расстояния до источника, от направления на него, экспоненциального разброса и угла разброса источника света. Компонент альфа результирующего цвета устанавливается в значение альфа диффузного отражения материала. Кроме рассмотренных возможностей моделирования освещения объектов, которые непосредственно поддерживаются OpenGL, для придания большей реалистичности следует учитывать также такие факторы, как прозрачность некоторых материалов и, наоборот, полную непрозрачность, которая приводит к появлению теней. Эти возможности OpenGL непосредственно не поддерживаются, и их учет полностью ложится на плечи программистов. Рассмотрим некоторые аспекты этих вопросов.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|