Главная страница
Навигация по странице:

  • 5) Что в OpenGL является атомарным примитивом Какие типы примитивов вы знаете

  • 7) Что такое операторные скобки и для чего они используются в OpenGL

  • 1) Какие системы координат используются в OpenGL 2) Перечислите виды матричных преобразований в OpenGL.Каким образом в OpenGL происходят преобразования объ- ектов

  • 6) Какие стандартные команды для задания проекций вы зна- ете

  • Планета знаний


    Скачать 1.68 Mb.
    НазваниеПланета знаний
    АнкорOpenGL book
    Дата14.06.2021
    Размер1.68 Mb.
    Формат файлаpdf
    Имя файлаgltutorialcourse2.pdf
    ТипКнига
    #217321
    страница3 из 9
    1   2   3   4   5   6   7   8   9
    OpenGL?
    2) Для чего нужна функция обновления изображения и что она делает?

    3) Что такое примитив в OpenGL?
    4) Что такое атрибут? Перечислите известные вам атрибуты вершин в OpenGL.

    5) Что в OpenGL является атомарным примитивом? Какие типы примитивов вы знаете?
    6) Для чего в OpenGL используются команды glEnable и
    glDisable
    ?

    52
    Глава 3. Рисование геометрических объектов

    7) Что такое операторные скобки и для чего они используются в OpenGL?
    8) Что такое дисплейные списки? Как определить список и как вызвать его отображение?
    9) Поясните организацию работы с массивами вершин и их отличие от дисплейных списков.
    10) Поясните работу команды glDrawElements()

    3.6. Контрольные вопросы
    53
    Рис. 3.1. Примитивы OpenGL.

    Глава 4.
    Преобразования объектов
    В OpenGL используются как основные три системы коорди- нат: левосторонняя, правосторонняя и оконная. Первые две си- стемы являются трехмерными и отличаются друг от друга на- правлением оси z: в правосторонней она направлена на наблю- дателя, в левосторонней  в глубину экрана. Ось x направлена вправо относительно наблюдателя, ось y  вверх.
    Левосторонняя система используется для задания значений параметрам команды gluPerspective()
    ,
    glOrtho()
    , которые будут рассмотрены в пункте 4.3. Правосторонняя система координат используется во всех остальных случаях. Отображение трехмер- ной информации происходит в двухмерную оконную систему координат.
    Строго говоря, OpenGL позволяет путем манипуляций с мат- рицами моделировать как правую, так и левую систему коорди- нат. Но на данном этапе лучше пойти простым путем и запом- нить: основной системой координат OpenGL является правосто- ронняя система.
    55

    56
    Глава 4. Преобразования объектов
    (а)
    (б)
    (в)
    Рис. 4.1. Системы координат в OpenGL. (а)  правосторонняя,
    (б)  левосторонняя, (в)  оконная.
    4.1. Работа с матрицами
    Для задания различных преобразований объектов сцены в
    OpenGL используются операции над матрицами, при этом раз- личают три типа матриц: модельно-видовая, матрица проекций и матрица текстуры. Все они имеют размер 4Ц4. Видовая матри- ца определяет преобразования объекта в мировых координатах,
    такие как параллельный перенос, изменение масштаба и поворот.
    Матрица проекций определяет, как будут проецироваться трех- мерные объекты на плоскость экрана (в оконные координаты), а матрица текстуры определяет наложение текстуры на объект.
    Умножение координат на матрицы происходит в момент вы- зова соответствующей команды OpenGL, определяющей коорди- нату (как правило, это команда glVertex
    .)
    Для того чтобы выбрать, какую матрицу надо изменить, ис- пользуется команда:
    void glMatrixMode (GLenum mode)
    вызов которой со значением параметра mode
    , равным
    GL_MODELVIEW
    ,
    GL_PROJECTION
    или
    GL_TEXTURE
    , вклю- чает режим работы с модельно-видовой матрицей, матрицей проекций, или матрицей текстуры соответственно. Для вызова команд, задающих матрицы того или иного типа, необходимо

    4.1. Работа с матрицами
    57
    сначала установить соответствующий режим.
    Для определения элементов матрицы текущего типа вызыва- ется команда void glLoadMatrix [ f d ] ( GLtype *m)
    где m
    указывает на массив из 16 элементов типа
    oat или double в соответствии с названием команды, при этом сначала в нем должен быть записан первый столбец матрицы, затем второй,
    третий и четвертый. Еще раз обратим внимание: в массиве m
    матрица записана по столбцам.
    Команда void gl Lo adI de nti ty ( void )
    заменяет текущую матрицу на единичную.
    Часто бывает необходимо сохранить содержимое текущей матрицы для дальнейшего использования, для чего применя- ются команды void glPushMatrix ( void )
    void glPopMatrix ( void )
    Они записывают и восстанавливают текущую матрицу из сте- ка, причем для каждого типа матриц стек свой. Для модельно- видовых матриц его глубина равна как минимум 32, для осталь- ных  как минимум 2.
    Для умножения текущей матрицы на другую матрицу ис- пользуется команда void glMultMatrix [ f d ] ( GLtype *m)
    где параметр m
    должен задавать матрицу размером 4Ц4. Если обозначить текущую матрицу за M, передаваемую матрицу за T ,
    то в результате выполнения команды glMultMatrix текущей ста- новится матрица M ? T . Однако обычно для изменения матрицы того или иного типа удобно использовать специальные коман- ды, которые по значениям своих параметров создают нужную матрицу и умножают ее на текущую.

    58
    Глава 4. Преобразования объектов
    В целом, для отображения трехмерных объектов сцены в ок- но приложения используется последовательность, показанная на рисунке 4.2.
    Рис. 4.2. Преобразования координат в OpenGL
    Запомните: все преобразования объектов и камеры в OpenGL
    производятся с помощью умножения векторов координат на мат- рицы. Причем умножение происходит на текущую матрицу в мо- мент определения координаты командой glVertex и некоторыми другими.
    4.2. Модельно-видовые преобразования
    К модельно-видовым преобразованиям будем относить пере- нос, поворот и изменение масштаба вдоль координатных осей.
    Для проведения этих операций достаточно умножить на соот- ветствующую матрицу каждую вершину объекта и получить из-

    4.2. Модельно-видовые преобразования
    59
    мененные координаты этой вершины:
    ?
    ?
    ?
    ?
    x
    0
    y
    0
    z
    0 1
    ?
    ?
    ?
    ?
    = M
    ?
    ?
    ?
    ?
    x y
    z
    1
    ?
    ?
    ?
    ?
    где M  матрица модельно-видового преобразования. Перспек- тивное преобразование и проецирование производится аналогич- но. Сама матрица может быть создана с помощью следующих команд:
    void g l T r a n s l a t e [ f d ] ( GLtype x , GLtype y , GLtype z )
    void glRotate [ f d ] ( GLtype angle ,
    GLtype x , GLtype y , GLtype z )
    void g l S c a l e [ f d ] ( GLtype x , GLtype y , GLtype z )
    glTranslate производит перенос объекта, прибавляя к коорди- натам его вершин значения своих параметров.
    glRotate производит поворот объекта против часовой стрелки на угол angle (измеряется в градусах) вокруг вектора
    (x,y,z)
    glScale производит масштабирование объекта (сжатие или растяжение) вдоль вектора
    (x,y,z)
    , умножая соответствующие координаты его вершин на значения своих параметров.
    Все эти преобразования изменяют текущую матрицу, а пото- му применяются к примитивам, которые определяются позже.
    В случае, если надо, например, повернуть один объект сцены,
    а другой оставить неподвижным, удобно сначала сохранить те- кущую видовую матрицу в стеке командой glPushMatrix
    , затем вызвать glRotate с нужными параметрами, описать примитивы,
    из которых состоит этот объект, а затем восстановить текущую матрицу командой glPopMatrix
    Кроме изменения положения самого объекта, часто бывает необходимо изменить положение наблюдателя, что также при- водит к изменению модельно-видовой матрицы.
    Это можно сделать с помощью команды

    60
    Глава 4. Преобразования объектов void gluLookAt (
    GLdouble eyex , GLdouble eyey , GLdouble eyez ,
    GLdouble centx , GLdouble centy , GLdouble centz ,
    GLdouble upx , GLdouble upy , GLdouble upz )
    где точка (eyex, eyey, eyez) определяет точку наблюдения,
    (centx, centy, centz)
    задает центр сцены, который будет проеци- роваться в центр области вывода, а вектор (upx, upy, upz) задает положительное направление оси y, определяя поворот камеры.
    Если, например, камеру не надо поворачивать, то задается зна- чение (0, 1, 0), а со значением (0, ?1, 0) сцена будет перевернута.
    Строго говоря, эта команда совершает перенос и поворот объ- ектов сцены, но в таком виде задавать параметры бывает удоб- нее. Следует отметить, что вызывать команду gluLookAt()
    имеет смысл перед определением преобразований объектов, когда мо- дельно-видовая матрица равна единичной.
    Запомните: матричные преобразования в OpenGL нужно за- писывать в обратном порядке. Например, если вы хотите снача- ла повернуть объект, а затем передвинуть его, сначала вызови- те команду glTranslate()
    , а только потом 
    glRotate()
    . После этого определяйте сам объект.
    4.3. Проекции
    В OpenGL существуют стандартные команды для задания ортографической (параллельной) и перспективной проекций.
    Первый тип проекции может быть задан командами void glOrtho ( GLdouble l e f t , GLdouble right ,
    GLdouble bottom , GLdouble top ,
    GLdouble near , GLdouble f a r )
    void gluOrtho2D ( GLdouble l e f t , GLdouble right ,
    GLdouble bottom , GLdouble top )

    4.3. Проекции
    61
    Первая команда создает матрицу проекции в усеченный объ- ем видимости (параллелепипед видимости) в левосторонней си- стеме координат.
    Параметры команды задают точки (left, bottom, znear) и
    (right, top, zf ar)
    , которые отвечают левому нижнему и право- му верхнему углам окна вывода. Параметры near и
    far задают расстояние до ближней и дальней плоскостей отсечения по уда- лению от точки (0, 0, 0) и могут быть отрицательными.
    Рис. 4.3. Ортографическая проекция
    Во второй команде, в отличие от первой, значения near и
    far устанавливаются равными
    ?
    1
    и
    1
    соответственно. Это удобно,
    если OpenGL используется для рисования двумерных объектов.
    В этом случае положение вершин можно задавать, используя команды glVertex2
    Перспективная проекция определяется командой void g l u P e r s p e c t i v e ( GLdouble angley , GLdouble aspect ,
    GLdouble znear , GLdouble z f a r )
    которая задает усеченный конус видимости в левосторонней си- стеме координат. Параметр angley определяет угол видимости в градусах по оси у и должен находиться в диапазоне от 0 до 180.

    62
    Глава 4. Преобразования объектов
    Угол видимости вдоль оси x задается параметром aspect
    , кото- рый обычно задается как отношение сторон области вывода (как правило, размеров окна).
    Рис. 4.4. Перспективная проекция
    Параметры zfar и
    znear задают расстояние от наблюдателя до плоскостей отсечения по глубине и должны быть положительны- ми. Чем больше отношение zfar/znear, тем хуже в буфере глу- бины будут различаться расположенные рядом поверхности, так как по умолчанию в него будет записываться ѕсжатаяї глубина в диапазоне от 0 до 1.
    Прежде чем задавать матрицы проекций, не забудь- те включить режим работы с нужной матрицей командой glMatrixMode(GL_PROJECTION)
    и сбросить текущую с помощью вызова glLoadIdentity()
    Пример:
    /* ортографическая проекция */
    glMatrixMode (GL_PROJECTION) ;
    glLoadI de nti ty ( ) ;
    glOrtho (0 , w, 0 , h , ?1.0 , 1 . 0 ) ;

    4.4. Область вывода
    63 4.4. Область вывода
    После применения матрицы проекций на вход следующего преобразования подаются так называемые усеченные (clipped)
    координаты. Затем находятся нормализованные координаты вер- шин по формуле:
    ?
    ?
    x n
    y n
    z n
    ?
    ?
    =
    ?
    ?
    x c
    /w c
    y c
    /w c
    z c
    /w c
    ?
    ?
    Область вывода представляет собой прямоугольник в окон- ной системе координат, размеры которого задаются командой void glViewPort ( GLint x , GLint y ,
    GLint width , GLint height )
    Значения всех параметров задаются в пикселах и определяют ширину и высоту области вывода с координатами левого нижне- го угла (x,y) в оконной системе координат. Размеры оконной си- стемы координат определяются текущими размерами окна при- ложения, точка (0,0) находится в левом нижнем углу окна.
    Используя параметры команды glViewPort()
    , OpenGL вычис- ляет оконные координаты центра области вывода (ox,oy) по фор- мулам:
    o x
    =
    x + width/2
    o y
    =
    y + height/2
    Пусть p x
    = width
    , p y
    = height
    , тогда можно найти оконные координаты каждой вершины:
    ?
    ?
    x w
    y w
    z w
    ?
    ?
    =
    ?
    ?
    (p x
    /2)x n
    + o x
    (p y
    /2)y n
    + o y
    [(f ? n)/2]z n
    + (n + f )/2
    ?
    ?
    При этом целые положительные величины n и f задают ми- нимальную и максимальную глубину точки в окне и по умол- чанию равны 0 и 1 соответственно. Глубина каждой точки за- писывается в специальный буфер глубины (z-буфер), который

    64
    Глава 4. Преобразования объектов используется для удаления невидимых линий и поверхностей.
    Установить значения n и f можно вызовом функции void glDepthRange (GLclampd n , GLclampd f )
    Команда glViewPort()
    обычно используется в функции, заре- гистрированной с помощью команды glutReshapeFunc()
    , которая вызывается, если пользователь изменяет размеры окна прило- жения.
    4.5. Контрольные вопросы

    1) Какие системы координат используются в OpenGL?
    2) Перечислите виды матричных преобразований в OpenGL.

    Каким образом в OpenGL происходят преобразования объ- ектов?
    3) Что такое матричный стек?
    4) Перечислите способы изменения положения наблюдателя в
    OpenGL.
    5) Какая последовательность вызовов команд glTranslate()
    ,
    glRotate()
    и glScale ()
    соответствует команде gluLookAt(0, 0, ?10, 10, 0, 0, 0, ?1, 0)
    ?

    6) Какие стандартные команды для задания проекций вы зна- ете?
    7) Что такое видовые координаты? Нормализованные коорди- наты?

    Глава 5.
    Материалы и освещение
    Для создания реалистичных изображений необходимо опре- делить как свойства самого объекта, так и свойства среды, в которой он находится. Первая группа свойств включает в себя параметры материала, из которого сделан объект, способы нане- сения текстуры на его поверхность, степень прозрачности объ- екта. Ко второй группе можно отнести количество и свойства источников света, уровень прозрачности среды, а также модель освещения. Все эти свойства можно задавать, вызывая соответ- ствующие команды OpenGL.
    5.1. Модель освещения
    В OpenGL используется модель освещения, в соответствии с которой цвет точки определяется несколькими факторами: свой- ствами материала и текстуры, величиной нормали в этой точке,
    а также положением источника света и наблюдателя. Для кор- ректного расчета освещенности в точке надо использовать еди- ничные нормали, однако команды типа glScale могут изменять длину нормалей. Чтобы это учитывать, используйте уже упо- минавшийся режим нормализации векторов нормалей, который
    65

    66
    Глава 5. Материалы и освещение включается вызовом команды glEnable (GL_NORMALIZE)
    Для задания глобальных параметров освещения используют- ся команды void glLightModel [ i f ] (GLenum pname , GLenum param )
    void glLightModel [ i f ] v (GLenum pname ,
    const GLtype *params )
    Аргумент pname определяет, какой параметр модели освеще- ния будет настраиваться и может принимать следующие значе- ния:
    GL_LIGHT_MODEL_LOCAL_VIEWER  параметр param должен быть булевым и задает положение наблюда- теля. Если он равен
    GL_FALSE
    , то направление обзора счи- тается параллельным оси ?z вне зависимости от положе- ния в видовыx координатах. Если же он равен
    GL_TRUE
    ,
    то наблюдатель находится в начале видовой системы коор- динат. Это может улучшить качество освещения, но услож- няет его расчет.
    Значение по умолчанию:
    GL_FALSE
    GL_LIGHT_MODEL_TWO_SIDE  параметр param дол- жен быть булевым и управляет режимом расчета освещен- ности как для лицевых, так и для обратных граней. Если он равен
    GL_FALSE
    , то освещенность рассчитывается только для лицевых граней. Если же он равен
    GL_TRUE
    , расчет проводится и для обратных граней.
    Значение по умолчанию:
    GL_FALSE
    GL_LIGHT_MODE_AMBIENT  параметр params дол- жен содержать четыре целых или вещественных числа, ко- торые определяют цвет фонового освещения даже в случае отсутствия определенных источников света.
    Значение по умолчанию: (0.2, 0.2, 0.2,1.0).

    5.2. Спецификация материалов
    67 5.2. Спецификация материалов
    Для задания параметров текущего материала используются команды void g l M a t e r i a l [ i f ] (GLenum face , GLenum pname ,
    GLtype param )
    void g l M a t e r i a l [ i f ] v (GLenum face , GLenum pname ,
    GLtype *params )
    С их помощью можно определить рассеянный, диффузный и зеркальный цвета материала, а также степень зеркального от- ражения и интенсивность излучения света, если объект должен светиться. Какой именно параметр будет определяться значени- ем param
    , зависит от значения pname
    :
    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_SHININESS  параметр params должен содержать одно целое или вещественное значение в диапазоне от 0 до 128,
    которое определяет степень зеркального отражения мате- риала.
    Значение по умолчанию: 0.

    68
    Глава 5. Материалы и освещение
    GL_EMISSION  параметр params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют интенсивность излучаемого света материала.
    Значение по умолчанию: (0.0, 0.0, 0.0, 1.0).
    GL_AMBIENT_AND_DIFFUSE  эквивалентно двум вызовам команды glMaterial()
    со значением pname
    GL_AMBIENT
    и
    GL_DIFFUSE
    и одинаковыми значениями params
    Из этого следует, что вызов команды glMaterial[ i f ]()
    возмо- жен только для установки степени зеркального отражения ма- териала (shininess). Команда glMaterial[ i f ]v()
    используется для задания остальных параметров.
    Параметр face определяет тип граней, для которых зада- ется этот материал и может принимать значения
    GL_FRONT
    ,
    GL_BACK
    или
    GL_FRONT_AND_BACK
    Если в сцене материалы объектов различаются лишь одним параметром, рекомендуется сначала установить нужный режим,
    вызвав glEnable()
    c параметром
    GL_COLOR_MATERIAL
    , а затем использовать команду void g l C o l o r M a t e r i a l (GLenum face , GLenum pname)
    где параметр face имеет аналогичный смысл, а параметр pname может принимать все перечисленные значения. После этого зна- чения выбранного с помощью pname свойства материала для кон- кретного объекта (или вершины) устанавливаются вызовом ко- манды glColor
    , что позволяет избежать вызовов более ресурсоем- кой команды glMaterial и повышает эффективность программы.
    Другие методы оптимизации приведены в главе 9.
    Пример определения свойств материала:
    float mat_dif [ ] = { 0 . 8 , 0 . 8 , 0 . 8 } ;
    float mat_amb [ ] = { 0 . 2 , 0 . 2 , 0 . 2 } ;
    float mat_spec [ ] = { 0 . 6 , 0 . 6 , 0 . 6 } ;

    5.3. Описание источников света
    69
    float s h i n i n e s s = 0 . 7 * 128;
    g l M a t e r i a l f v (GL_FRONT_AND_BACK,GL_AMBIENT,
    mat_amb ) ;
    g l M a t e r i a l f v (GL_FRONT_AND_BACK,GL_DIFFUSE,
    mat_dif ) ;
    g l M a t e r i a l f v (GL_FRONT_AND_BACK,GL_SPECULAR,
    mat_spec ) ;
    g l M a t e r i a l f
    (GL_FRONT, GL_SHININESS,
    s h i n i n e s s ) ;
    5.3. Описание источников света
    Определение свойств материала объекта имеет смысл, толь- ко если в сцене есть источники света. Иначе все объекты будут черными (или, строго говоря, иметь цвет, равный рассеянному цвету материала, умноженному на интенсивность глобального фонового освещения, см. команду glLightModel
    ). Добавить в сце- ну источник света можно с помощью команд void g l L i g h t [ i f ] (GLenum l i g h t , GLenum pname ,
    GLfloat param )
    void g l L i g h t [ i f ] (GLenum l i g h t , GLenum pname ,
    GLfloat *params )
    Параметр light однозначно определяет источник света.
    Он выбирается из набора специальных символических имен вида
    GL_LIGHTi
    , где i должно лежать в диапазоне от 0 до кон- станты
    GL_MAX_LIGHT
    , которая обычно не превосходит вось- ми.
    Параметры pname и
    params имеют смысл, аналогичный ко- манде glMaterial
    . Рассмотрим значения параметра pname
    :
    GL_SPOT_EXPONENT  параметр param должен содер- жать целое или вещественное число от 0 до 128, задающее

    70
    Глава 5. Материалы и освещение распределение интенсивности света. Этот параметр описы- вает уровень сфокусированности источника света.
    Значение по умолчанию: 0 (рассеянный свет).
    GL_SPOT_CUTOFF  параметр param должен содержать целое или вещественное число между 0 и 90 или равное
    180, которое определяет максимальный угол разброса све- та. Значение этого параметра есть половина угла в вершине конусовидного светового потока, создаваемого источником.
    Значение по умолчанию: 180 (рассеянный свет).
    GL_AMBIENT  параметр params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют цвет фонового освещения.
    Значение по умолчанию: (0.0, 0.0, 0.0, 1.0).
    GL_DIFFUSE  параметр params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют цвет диффузного освещения.
    Значение по умолчанию: (1.0, 1.0, 1.0, 1.0) для
    GL_LIGHT0
    и (0.0, 0.0, 0.0, 1.0) для остальных.
    GL_SPECULAR  параметр params должен содержать четы- ре целых или вещественных значения цветов RGBA, кото- рые определяют цвет зеркального отражения.
    Значение по умолчанию: (1.0, 1.0, 1.0, 1.0) для
    GL_LIGHT0
    и (0.0, 0.0, 0.0, 1.0) для остальных.
    GL_POSITION  параметр params должен содержать четыре целых или вещественных числа, которые определяют поло- жение источника света. Если значение компоненты w рав- но 0.0, то источник считается бесконечно удаленным и при расчете освещенности учитывается только направление на точку (x, y, z), в противном случае считается, что источник расположен в точке (x, y, z, w). В первом случае ослабления

    5.3. Описание источников света
    71
    света при удалении от источника не происходит, т.е. источ- ник считается бесконечно удаленным.
    Значение по умолчанию: (0.0, 0.0, 1.0, 0.0).
    GL_SPOT_DIRECTION  параметр params должен хра- нить четыре целых или вещественных числа, которые опре- деляют направление света.
    Значение по умолчанию: (0.0, 0.0, ?1.0, 1.0).
    Эта характеристика источника имеет смысл, если значение
    GL_SPOT_CUTOFF
    отлично от 180 (которое, кстати, зада- но по умолчанию).
    GL_CONSTANT_ATTENUATION ,
    GL_LINEAR_ATTENUATION ,
    GL_QUADRATIC_ATTENUATION  параметр params задает значение одного из трех коэффициентов, опреде- ляющих ослабление интенсивности света при удалении от источника. Допускаются только неотрицательные значения. Если источник не является направленным (см.
    GL_POSITION
    ), то ослабление обратно пропорционально сумме:
    attconstant + attlinear ? d + attquadratic ? d
    2
    где d  расстояние между источником света и осве- щаемой им вершиной;
    attconstant
    ,
    attlinear и
    attquadratic равны параметрам,
    заданным с
    по- мощью констант
    GL_CONSTANT_ATTENUATION
    ,
    GL_LINEAR_ATTENUATION
    и
    GL_QUADRATIC_ATTENUATION
    соответственно.
    По умолчанию эти параметры задаются тройкой (1, 0, 0), и фактически ослабления не происходит.

    72
    Глава 5. Материалы и освещение
    При изменении положения источника света следует учиты- вать следующий факт: в OpenGL источники света являются объ- ектами, во многом такими же, как многоугольники и точки. На них распространяется основное правило обработки координат в
    OpenGL  параметры, описывающее положение в пространстве,
    преобразуются текущей модельно-видовой матрицей в момент формирования объекта, т.е. в момент вызова соответствующих команд OpenGL. Таким образом, формируя источник света одно- временно с объектом сцены или камерой, его можно привязать к этому объекту. Или, наоборот, сформировать стационарный ис- точник света, который будет оставаться на месте, пока другие объекты перемещаются.
    Общее правило такое: eсли положение источника света зада- ется командой glLight перед определением положения виртуаль- ной камеры (например, командой glLookAt()
    ), то будет считаться,
    что координаты (0, 0, 0) источника находится в точке наблюде- ния и, следовательно, положение источника света определяется относительно положения наблюдателя.
    Если положение устанавливается между определением поло- жения камеры и преобразованиями модельно-видовой матрицы объекта, то оно фиксируется, т.е. в этом случае положение источ- ника света задается в мировых координатах. Для использования освещения сначала надо установить соответствующий режим вы- зовом команды glEnable(GL_LIGHTING)
    , а затем включить нуж- ный источник командой glEnable(GL_LIGHTi)
    Еще раз обратим внимание на то, что при выключенном осве- щении цвет вершины равен текущему цвету, который задается командами glColor
    . При включенном освещении цвет вершины вычисляется исходя из информации о материале, нормалях и источниках света.
    При выключении освещения визуализация происходит быст- рее, однако в таком случае приложение должно само рассчиты- вать цвета вершин.

    5.4. Создание эффекта тумана
    73
    Текст программы, демонстрирующей основные принципы определения материалов и источников света, приведен в при- ложении Б.
    5.4. Создание эффекта тумана
    В завершение рассмотрим одну интересную и часто использу- емую возможность OpenGL  создание эффекта тумана. Легкое затуманивание сцены создает реалистичный эффект, а иногда может и скрыть некоторые артефакты, которые появляются, ко- гда в сцене присутствуют отдаленные объекты.
    Туман в OpenGL реализуется путем изменения цвета объек- тов в сцене в зависимости от их глубины, т.е. расстояния до точ- ки наблюдения. Изменение цвета происходит либо для вершин примитивов, либо для каждого пикселя на этапе растеризации в зависимости от реализации OpenGL. Этим процессом можно частично управлять  см. раздел 7.
    Для включения эффекта затуманивания необходимо вызвать команду glEnable(GL_FOG)
    Метод вычисления интенсивности тумана в вершине можно определить с помощью команд void glFog [ i f ] (enum pname , T param )
    void glFog [ i f ] v (enum pname , T params )
    Аргумент pname может принимать следующие значения:
    GL_FOG_MODE  аргумент param определяет формулу, по которой будет вычисляться интенсивность тумана в точке.
    В этом случае param может принимать следующие значения:
    GL_EXP  интенсивность задается формулой f = e
    (?d?z)
    ;
    GL_EXP2  интенсивность задается формулой f = e
    ?(d?z)
    2
    ;

    74
    Глава 5. Материалы и освещение
    GL_LINEAR  интенсивность вычисляется по формуле f =
    e ? z/e ? s
    , где z  расстояние от вершины, в которой вы- числяется интенсивность тумана, до точки наблюдения.
    Коэффициенты d, e, s задаются с помощью следующих зна- чений аргумента pname
    :
    GL_FOG_DENSITY 
    param определяет коээфициент d
    GL_FOG_START 
    param определяет коэффициент s
    GL_FOG_END 
    param определяет коэффициент e.
    Цвет тумана задается с помощью аргумента pname
    , равного
    GL_FOG_COLOR
    . В этом случае params
     указатель на массив из 4-х компонент цвета.
    Приведем пример использования этого эффекта:
    GLfloat FogColor [ 4 ] = { 0 . 5 , 0 . 5 , 0 . 5 , 1 } ;
    glEnable (GL_FOG) ;
    glFogi (GL_FOG_MODE,GL_LINEAR) ;
    glFogf (GL_FOG_START, 2 0 . 0 ) ;
    glFogf (GL_FOG_END, 1 0 0 . 0 ) ;
    glFogfv (GL_FOG_COLOR, FogColor ) ;
    5.5. Контрольные вопросы
    1) Поясните разницу между локальными и бесконечно уда- ленными источниками света.
    2) Для чего служит команда glColorMaterial
    ?

    1   2   3   4   5   6   7   8   9


    написать администратору сайта