Планета знаний
Скачать 1.68 Mb.
|
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 ? |