Создание графических моделей с помощью Open Graphics Library

Свойства источника света

Показывать лекцию целиком

Цель лекции: Изучить команды OpenGL изменения свойств источников света, реализацию этих команд на Object Pascal и в библиотеке OpenTK на C#.

Для каждого источника света параметры определяются индивидуально. Параметры для первого источника света (источник света с индексом ноль) отличаются от параметров остальных источников света.

Для задания параметров источника света используется команда:

Light[if][v](light, pname: GLenum; param: GLType);

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

  • light - источник света;
  • pname - изменяемый параметр материала;
  • param – значение или указатель на массив значений изменяемого параметра.
  • Ниже приведены объявления методов класса GL библиотеки OpenTK на C# и процедур на Object Pascal, реализующих команду Light, для параметра param вещественного типа.

    C#:
      void Light(LightName light, LightParameter pname, float param);
      void Light(LightName light, LightParameter pname, float[] @params);
    Object Pascal:
      procedure glLightf (light, pname: GLenum; param: GLfloat);
      procedure glLightfv (light, pname: GLenum; params: PGLfloat);
    

    Как и для свойств материала для источника света можно определить фоновую, диффузную, рассеянную и зеркальную составляющие освещения.

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

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

    Рассеянная (Ambient) составляющая освещения примитива от одного источника света представляет собой произведение рассеянной составляющей этого источника света и рассеянной составляющей материала:

    $$A=A_{ист.света} \times A_{материала}$$

    Диффузная (Diffuse) составляющая зависит не только от соответствующих составляющих источника света и материала, но и от косинуса угла между направлением нормали и направлением от вершины к источнику света:

    $$D=(max(\vec{L} \times \vec{N},0))\times D_{ист.света}\times D_{материала}$$

    $$\vec{L}\times(Lx,Ly,Lz) $$ – единичный вектор от вершины к источнику света;

    $$\vec{N}\times(nx,ny,nz) $$ – единичный вектор нормали.

    Зеркальная составляющая также зависит от соответствующих составляющих источника света и материала, нормали и вектора от вершины к источнику света, точки наблюдения, а так же от значения параметра $$SHININESS$$, который определяется для материала.

    $$S=(max(\vec{S} \times \vec{N},0))^{shininess}\times S_{ист.света}\times S_{материала}$$

    где

  • $$SHININESS$$ –зеркальная экспонента материала;
  • $$\vec{L}$$ – вектор от вершины к источнику света;
  • $$\vec{V}$$ – вектор от вершины к точке наблюдения;
  • $$\vec{S}$$ – вектор, который равен нормированной сумме векторов $$\vec{L}$$ и $$\vec{V}$$.
  • Ослабление источника света с увеличением расстояния до объекта библиотека OpenGL определяет по формуле:

    $$S=\frac{1}{k_0+k_1\times l+k_2\times l^2$$

    где:

    $$l$$ - расстояние от источника света до объекта;

    $$k_0$$ – коэффициент постоянного ослабления;

    $$k_1$$ – коэффициент линейного ослабления;

    $$k_2$$ – коэффициент квадратичного ослабления.

    Фоновая составляющая освещения источника света

    Определение фоновой составляющей освещения осуществляется с помощью параметра pname команды Light. При использовании библиотеки OpenTK (C#) параметр должен быть равен значению Ambient перечисления LightParameter, в Object Pascal - константе GL_AMBIENT.

    На C# параметр param является массивом четырёх вещественных значений, содержащих RGBA составляющие фонового освещения.

    В Object Pascal параметр param является указателем на массив из четырех значений, которые также определяют RGBA составляющие фонового освещения.

    Примеры изменения фоновой составляющей приведены в листинге 7.1 - на C# и в листинге 7.2 - на Object Pascal.

    GL.Light(LightName.Light0, LightParameter.Ambient, new float[] {0.1f, 0.0f, 0.0f, 1.0f});
    
    Var
      params: TGLArrayf4;
    Begin
    …
      params[0] := 1;
      params[1] := 0;
      params[2] := 0;
      params[3] := 1;
      glLightfv(GL_LIGHT0, GL_AMBIENT, @params);
    …
    End;
    

    По умолчанию значение фонового освещения для всех источников света равно (0, 0, 0, 1).

    Диффузная составляющая освещения источника света

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

    C#:
      LightParameter.Diffuse
    Object Pascal:
      GL_DIFFUSE
    

    По умолчанию значение диффузного освещения "нулевого" источника света равно (1, 1, 1, 1), для других источников света составляющая равна (0, 0, 0, 1).

    Зеркальная составляющая освещения источника света

    Интенсивность и цвет зеркального отражения от источника света определяет значение параметра pname команды Light:

    C#:
      LightParameter.Specular
    Object Pascal:
      GL_SPECULAR
    

    По умолчанию значение зеркального отражения от "нулевого" источника света равно (1, 1, 1, 1), для других источников света она равна (0, 0, 0, 1).

    Положение источника света в пространстве

    Для определения положения источника света в пространстве используется значение для параметра pname команды Light:

    C#:
      LightParameter.Position
    Object Pascal:
      GL_POSITION
    

    В качестве значения параметра param команды Light в библиотеке OpenTK (C#) передается массив из четырех значений, в Object Pascal - указатель на массив из четырёх значений.

    Значения массива определяют нормализованные координаты источника света в пространстве. Если положение источника света необходимо задать в декартовых координатах (что чаще всего используется), то четвертый параметр массива должен быть равен 1, а первые три параметра должны определять декартовые координаты x, y, z.

    Эта позиция преобразуется видовой матрицей и сохраняется в видовых координатах. Если компонент положения w (последний элемент массива) равен нулю, то источник света расположен в бесконечности, освещение от него направлено в начало координат, ослабление освещения от расстояния в этом случае не происходит.

    По умолчанию нулевой источник освещения имеет координаты (0, 0, 1 ,0), и является направленным вдоль отрицательного направления оси OZ.

    Направление источника света

    Для определения направления источника света в однородных мировых координатах для параметра pname команды Light используется значение:

    C#:
      LightParameter.SpotDirection
    Object Pascal:
      GL_SPOT_DIRECTION
    

    Параметр params должен содержать указатель на четыре значения, определяющих направление источника света в однородных мировых координатах. По умолчанию направление источника света задается значениями (0, 0, 1, 1). Отработка этого параметра имеет смысл, если угол освещения источником света имеет значение отличное от 180° (параметр LightParameter.SpotCutoff на C# и GL_SPOT_CUTOFF на Object Pascal).

    Сфокусированность источника света

    Для определения сфокусированности источника света используется значение для параметра pname команды Light:

    C#:
      LightParameter.SpotExponent
    Object Pascal:
      GL_SPOT_EXPONENT
    

    Параметр param должен содержать целое или вещественное значение из диапазона [0, 128]. Максимальное значение соответствует максимальной сфокусированности источника света. Значение 0 соответствует рассеянному освещению, которое используется как значение по умолчанию для всех источников света.

    Угол освещения источником света

    Mаксимальный угол разброса излучения света определяется командой Light с помощью значения параметра pname:

    C#:
      LightParameter.SpotCutoff
    Object Pascal:
      GL_SPOT_CUTOFF
    

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

    Зависимость интенсивности освещения от расстояния

    Для определения ослабления источника света с увеличением расстояния до освещаемого примитива так же используется команда Light.

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

    $$S=\frac{1}{(k_0+k_1\times l+k_2\times l^2)}$$

    Для изменения коэффициентов $$k_0,k_1,k_2$$ используются значения параметра .

    Значения параметра pname команды Light для определения интенсивности освещения от расстояния
    КонстантаЗначение параметра pname команды Light
    Библиотека OpenTK, C#Object Pascal
    $$k_0$$LightParameter.ConstantAttenuationGL_CONSTANT_ATTENUATION
    $$k_1$$LightParameter.LinearAttenuationGL_LINEAR_ATTENUATION
    $$k_2$$LightParameter.QuadraticAttenuationGL_QUADRATIC_ATTENUATION

    Краткие итоги

    Все источники света библиотеки OpenGL можно разделить на две группы: точечные и бесконечно удалённые. Точечные источники света имеют конкретные координаты. У бесконечно удаленных источников света четвертая координата равна нулю. "Нулевой" источник света относится к бесконечно удалённым источникам света, так как его координаты (0,0,1,0). Бесконечно удаленные источники света всегда направлены в начало координат. Для всех источников света могут быть определены рассеянная, диффузная и зеркальная составляющие освещения.

    Вернуться к учебному плану