Введение в модели закрашивания 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Введение в модели закрашивания



 

Механизм отражения света от текущей поверхности очень сложен и зависит от многих факторов.

В модели закрашивания, часто используемой в графике, предполагается, что объекты сцены освещаются двумя типами источников: точечными источниками света и фоновым светом (ambient light). Эти источники света «сверкают» на различных поверхностях объектов, и падающий свет взаимодействует с поверхностью одним из трех возможных способов (рис. 4.1):

· некоторая часть поглощается поверхностью и превращается в тепло;

· некоторая часть отражается от поверхности;

· некоторая часть проходит внутрь объекта, как в случае куска стекла.

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

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

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

· зеркальные отражения больше похожи на зеркало и имеют ярко выраженную направленность: падающий свет не поглощается объектом, а отражается прямо от его наружной поверхности. Это порождает блики, и поверхность выглядит блестящей.

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


Использование источников света в OpenGL

Создание источника света

OpenGL позволяет задать до восьми источников с именами GL_LIGHT0, GL_LIGHT1 и т.д. Каждый источник обладает различными свойствами и должен быть задействован (включен). У каждого его свойства имеется значение по умолчанию. Например, для создания источника, расположенного в точке (1, 2, 2) в мировых координатах, следует выполнить следующий код:

Листинг 2. Пример создания источника света

GLfloat myLightPosition[] = {1.0, 2.0, 2.0, 1.0};

glLightfv(GL_LIGHT0, GL_POSITION, myLightPosition);

glEnable(GL_LIGHTING); // Включение расчета освещенности

glEnable(GL_LIGHT0); // включаем этот конкретный источник

Массив myLightPosition[] (имя можно использовать любое) определяет положение источника света и передается в функцию glLightfv() вместе с именем источника GL_LIGHT0, для того чтобы связать его с конкретным источником, обозначенным именем GL_LIGHT0.

Некоторые источники, такие как настольная лампа, находятся «внутри» сцены, в то время как другие, например солнце, бесконечно удалены от сцены. OpenGL позволяет создавать источники света обоих типов посредством задания положения источника в однородных координатах.

Тогда мы имеем

(x, y, z, 1): локальный источник света в положении (x, y, z)  и

(x, y, z, 0): вектор к бесконечно удалённому источнику света в направлении (x, y, z).

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

Можно также разложить источник света на различные цвета. OpenGL позволяет присвоить различный цвет каждому из трех типов света, испускаемого источником: фоновому, диффузному и зеркальному.

С помощью приведенного ниже кода определяются массивы для хранения цветов, испускаемых источниками света. Эти массивы затем передаются в функцию glLightfv():

Листинг 3. Пример задания цветов, испускаемых источником света

GLfloat myAmbient[] = {0.2, 0.4, 0.6, 1.0};

GLfloat myDiffuse[] = {0.8, 0.9, 0.5, 1.0};

GLfloat mySpecular[] = {1.0, 0.8, 1.0, 1.0};

glLightfv(GL_LIGHT0, GL_AMBIENT, myAmbient);

glLightfv(GL_LIGHT0, GL_DIFFUSE, myDiffuse);

glLightfv(GL_LIGHT0, GL_SPECULAR, mySpecular);

Цвета задаются в так называемом формате RGBA, что означает: R ed (красный), G reen (зеленый), B lue (синий) и A lpha (альфа). Величина alpha иногда используется для смешения двух цветов на экране. Для наших целей здесь alpha = 1.0.

Источники света имеют различные значения по умолчанию.

Для всех источников:

default ambient = (0, 0, 0, 1) фоновый по умолчанию.

Наименьшая яркость – черный.

Для источника света LIGHT0:

default diffuse = (1, 1, 1, 1) диффузный по умолчанию.

Наибольшая яркость – белый.

default specular = (1, 1, 1, 1) зеркальный по умолчанию.

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

 

Прожекторы

Источники света по умолчанию являются точечными источниками. Это означает, что они излучают свет равномерно по всем направлениям. Однако OpenGL позволяет превратить их в прожекторы, так чтобы они излучали свет в ограниченном числе направлений. На рис. 5.1 показан прожектор, нацеленный в направлении d c «углом пропускания» («cutoff angle») α. Угол пропускания α может принимать значения диапазона [0, 90].

В точках, лежащих вне конуса пропускания, свет не виден вообще. Для таких вершин, как Р, которые лежат внутри этого конуса, количество света, достигающего точки Р, пропорционально множителю cosε(β), где β – угол между вектором d и прямой, соединяющей источник с точкой Р. Показатель степени ε лежит в диапазоне [0, 128] и выбирается пользователем так, чтобы обеспечить нужное уменьшение интенсивности света в зависимости от угла.

Параметры прожектора устанавливаются следующим образом: с помощью функции glLightf(…) задается его единственный параметр, а с помощью функции glLightfv(…) – вектор:

glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0); // угол пропускания равен 45о

glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 4.0); // ε = 4.0

GLfloat myDirection[] = {2.0, 1.0, -4.0}; // направление прожектора

glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, myDirection);

По умолчанию установлены следующие значения этих параметров: d = (0, 0, -1), α = 180о; ε = 0, что соответствует действующему во всех направлениях точечному источнику света.

 



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 39; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.128.171.246 (0.01 с.)