Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

RedBook

.pdf
Скачиваний:
20
Добавлен:
11.06.2015
Размер:
7.43 Mб
Скачать

Сглаженный текст Создайте для каждого символа карту текстуры с

относительно большим разрешением и наложите их на меньшие области (полигоны) с использованием текстурной фильтрации. Такой метод позволяет преобразовывать текст (поворачивать, масштабировать или искажать другими способами).

Сглаженные линии Метод работает так же, как и для текста: сделайте линии на текстуре шириной в несколько пикселей и используйте фильтрацию.

Масштабирование и поворот изображений Если вы поместите изображение в текстуру, а текстуру на полигон, преобразования полигона будут отражаться и на изображении.

Изгибание изображений Сохраните изображение в карте текстуры, но наложите ее не на полигон, а на сплайновую поверхность (используйте вычислители). Изменение контрольных точек поверхности приведет к изменениям в изображении.

Проектирование изображений Поместите изображение в карту текстуры и спроецируйте его как прожектор, создав небольшой прожекторный эффект.

14.18 Рисование изображений, буферизованных по глубине

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

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

Например, если вы рисуете молекулярную модель, созданную из сфер, у вас может быть припасено изображение великолепно просчитанной сферы (и ассоциированные с ним значения глубины), вычисленной с использованием закраски Фонга или трассировки лучей или с помощью какого-либо другого метода не поддерживаемого OpenGL непосредственно. Чтобы нарисовать сложную сцену, вам могут потребоваться сотни таких сфер, совместно буферизуемых по глубине.

Чтобы добавить глубинированное изображение к сцене, сначала запишите его значения глубины в буфер глубины с помощью команды glDrawPixels(). Затем активизируйте тест глубины, установите маску записи в 0, чтобы рисования не происходило, и активизируйте трафарет таким образом, чтобы рисование в буфер трафарета происходило всегда, когда происходит запись в буфер глубины.

Затем нарисуйте изображение в цветовом буфере, маскированном буфером трафарета (в который вы только что записали) таким образом, чтобы рисование происходило только в тех областях, где в буфере трафарета стоит 1. Во время этого рисования установите функцию трафарета на обнуление буфера трафарета, чтобы он автоматически очищался к моменту добавления следующего изображения. Если объекты нужно придвинуть к наблюдателю или отодвинуть от него, нужно использовать ортографическую проекцию; в подобных случаях для перемещения глубинированного изображения используйте GL_DEPTH_BIAS и команду glPixelTransfer*().

14.19 Многоугольники Вороного

Если взять множество S точек плоскости, многоугольником Вороного (или территорией Диричлета) для произвольной точки A из S будет множество всех точек плоскости, находящихся ближе к точке A, чем к любой другой точке из S. Множество

получившихся точек представляет собой решение многих проблем вычислительной геометрии. Многоугольники Вороного для набора точек показаны на рисунке 14-3.

Рисунок 14-3. Многоугольники Вороного

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

предварительном расчете глубины конуса в виде изображения и использование этого изображения в качестве величин глубины, как описано в предыдущем разделе. Однако для рисования в буфер кадра изображение (в отличие от случая со сферами) вам не требуется. Пока вы рисуете в буфер глубины, используйте буфер трафарета для запоминания пикселей, на которых нужно рисовать: сначала очистите буфер, а затем записывайте ненулевые значения в тех местах, где тест глубины прошел. Чтобы нарисовать границы территорий Диричлета нарисуйте полигон размером со все окно, но разрешите рисование только там, где величины трафарета имеют ненулевое значение.

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

14.20 «Жизнь» в буфере трафарета

«Игра в жизнь» («Game of Life») изобретенная Джоном Конвейем, проходит на прямоугольной сетке, где каждая клетка может быть «жива» или «мертва». Чтобы вычислить следующее поколение из текущего, сосчитайте количество живых соседей для каждой клетки (соседями каждой клетки являются 8 смежных клеток). Клетка жива в поколении n+1, если она была жива в поколении n и имеет двух или трех живых соседей. Клетка также жива в поколении n+1, если она была мертва в поколении n и имеет точно живых соседей. Во всех остальных случаях клетка мертва в поколении n+1. В зависимости от начальной конфигурации эта игра генерирует потрясающе интересные рисунки. Рисунок 14-4 демонстрирует 6 поколений игры.

Рисунок 14-4. 6 поколений из «Игры в жизнь»

Одним из способов создания этой игры с помощью OpenGL является использование многопроходного алгоритма. Данные содержатся в цветовом буфере по одному пикселю на клетку игровой сетки. Предположим, что цвет фона черный (все нули), и, что цвет всех живых клеток не черный (отличный от нуля). Очистите буферы глубины и трафарета в нули, установите маску записи буфера глубины в 0, а функцию сравнения так, чтобы тест глубины проходили пиксели, имеющие значение глубины не равное хранимому в буфере. Для итерирования считайте изображение с экрана, разрешите запись в буфер глубины и установите функцию сравнения, чтобы она увеличивала значение в буфере трафарета везде, где проходит тест глубины, а иначе оставляла содержимое буфера трафарета неизменным. Запретите рисование в цветовой буфер.

Далее, нарисуйте изображение 8 раз, смещая его на один пиксель в каждом вертикальном, горизонтальном и диагональном направлениях. Когда вы закончите, буфер трафарета будет содержать числа, равные количеству живых соседей для каждого пикселя. Разрешите рисование в цветовой буфер, установите текущий цвет равным цвету живых клеток, а функцию трафарета установите таким образом, чтобы рисование происходило только там, где значение трафарета равно 3 (три живых соседа). Кроме того, если рисование происходит, уменьшайте величину в буфере трафарета. Затем нарисуйте прямоугольник, покрывающий все изображение это окрасит каждую клетку, имеющую точно 3 живых соседа «живым» цветом.

На данный момент буфер трафарета содержит числа 0, 1, 2, 4, 5, 6, 7 и 8. Клетки со значениями трафарета 0, 1, 4, 5, 6, 7 и 8 должны быть очищены «мертвым» цветом. Установите функцию трафарета таким образом, чтобы рисование происходило только там, где значение трафарета не равно 2, а операцию трафарета на обнуление

значения в любом случае. Затем нарисуйте большой полигон «мертвого» цвета размером со все изображение. Итерация окончена.

Для того, чтобы получить пригодную версию такой программы, вам, возможно, стоит увеличить сетку, чтобы каждая клетка имела размер больший, чем один пиксель, поскольку с одним пикселем на клетку трудно различить рисунок.

14.21 Альтернативные варианты использования glDrawPixels() и glCopyPixels()

Вы можете считать, что glDrawPixels() предназначена только для рисования прямоугольных областей пикселей. Несмотря на то, что именно для этого команда применяется чаще всего, существуют и другие интересные варианты использования.

Видео даже если ваша машина не обладает специальной видеоаппаратурой, вы можете отображать небольшие видео клипы, по очереди рисуя кадры с помощью glDrawPixels() в одной и той же области заднего буфера и затем переключая буферы. Размер кадра, при котором вы можете выводить их с допустимой скоростью, зависит от того, как быстро ваша аппаратура рисует, так что если вы хотите качественную картинку, вы можете быть ограничены размером 100x100 (или меньше).

Кисть в программе рисования форма вашей кисти может быть сымитирована с помощью величин альфа. Цвет краски представлен в виде цветовых величин. Чтобы нарисовать что-либо синей круглой кистью, рисуйте синий квадрат с помощью glDrawPixels(). При этом центр изображения квадрата должен иметь максимальное альфа, которое убывало бы с удалением от центра. Рисуйте, установив функцию наложения на использование значения альфа входящего цвета и (1-альфа) имеющегося в буфере цвета. Если все значения альфа кисти намного меньше единицы,

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

Фильтрованное масштабирование если вы изменяете размер пиксельного изображения с использованием дробного фактора, фильтрация, которую применит OpenGL может привести к серьезным визуальным неприятностям. Чтобы улучшить качество фильтрации, сдвигайте получившееся изображение на расстояние меньшее пикселя и перерисовывайте его несколько раз с использованием альфа наложения для усреднения результирующих пикселей. Результатом будет фильтрованное масштабирование.

Транспозиция изображений вы можете переключать изображения одинакового размера на месте с помощью glCopyPixels() и операции XOR. Этот метод позволяет избежать необходимости считывать изображения обратно в процессорную память. Если A и B представляют собой 2 изображения, операция выглядит так:

a.A=A XOR B

b.B=A XOR B

c.A=A XOR B

Приложение A. Переменные состояния

В этом приложении перечисляются переменные состояния OpenGL, их значения по умолчанию, их смысл и команды, с помощью которых можно получить их текущее значение.

Опросные команды

В дополнение к основным командам, позволяющим получить простые значения переменных состояния (таким как glGetIntegerv() или glIsEnabled()), существуют более специализированные команды для возврата более сложных значений. Ниже перечислены прототипы этих команд.

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

void glGetClipPlane (GLenum plane, GLdouble *equation);

void glGetColorTable (GLenum target, GLenum pname, GLenum type, GLvoid *table);

void glGetColorTableParameter{if}v (GLenum target, GLenum pname, TYPE *params);

void glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, GLvoid *image);

void glGetConvolutionParameter{if}v (GLenum target, GLenum pname, TYPE *params);

GLenum glGetError (void);

void glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);

void glGetHistogramParameter{if}v (GLenum target, GLenum pname, TYPE *params);

void glGetLight{if}v (GLenum light, GLenum pname, TYPE *params); void glGetMap{ifd}v (GLenum target, GLenum query, TYPE *v);

void glGetMaterial{if}v (GLenum face, GLenum pname, TYPE *params); void glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);

void glGetMinmaxParameter{if}v (GLenum target, GLenum pname, TYPE **params);

void glGetPixelMap {f ui us}v (GLenum map, TYPE *values); void glGetPolygonStipple (GLubyte *mask);

void glGetSeparableFilter (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);

const GLubyte* glGetString (GLenum name);

void glGetTexEnv{if}v (GLenum target, GLenum pname, TYPE *params); void glGetTexGen{ifd}v (GLenum coord, GLenum pname, TYPE *params); void glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);

void glGetTexLevelParameter{if}v (GLenum target, GLint level, GLenum pname, TYPE *params);

void glGetTexParameter{if}v (GLenum target, GLenum pname, TYPE *params);

GLboolean glIsList (GLuint list); GLboolean glIsTexture (GLuint texObject);

void gluGetNurbsProperty (GLUnurbsObj *nobj, GLenum property, GLfloat *value);

const GLubyte* gluGetString (GLenum name);

void gluGetTessProperty (GLUtesselator *tess, GLenum which, GLdouble *data);

Переменные состояния OpenGL

Следующие страницы содержат таблицы, в которых перечислены имена переменных состояния. Для каждой переменной в таблице есть описание, группа атрибутов, к которой она принадлежит, начальное или минимальное значение, а также рекомендуемая для получения значения переменной команда glGet*(). Для переменных состояния, значения которых могут быть получены с помощью команд glGetBooleanv(), glGetIntegerv(), glGetFloatv() или glDoublev() в таблице приводится только одна из этих команд та, которая более всего подходит в соответствии с типом возвращаемого значения. (Некоторые переменные, связанные с вершинными массивами могут опрашиваться только с помощью glGetPointerv().) Эти

переменные состояния не могут быть получены с помощью команды glIsEnabled(). Однако переменные, для которых glIsEnabled() указано в качестве команды опроса, могут быть получены так же и с помощью команды glBooleanv(), glGetIntegerv(), glGetFloatv() или glDoublev(). Переменные состояния, для которых в таблице указана любая другая опросная команда, могут быть получены только с помощью этой команды.

Замечание: Когда вы опрашиваете состояние текстуры, например, GL_TEXTURE_MATRIX, в реализации OpenGL, поддерживающей расширение GL_ARB_multitexture, будут возвращены величины, относящиеся только к активному в данный момент текстурному блоку.

Если в таблице приводится одна или более групп атрибутов, это значит, что переменная состояния относится к этой группе или группам. Если группа атрибутов не указана переменная не принадлежит ни к одной группе. Для сохранения и восстановления значений всех переменных состояния, относящихся к определенной группе или группам атрибутов, можно использовать команды glPushAttrib(), glPopAttrib(), glPushClientAttrib() и glPopClientAttrib().

Все опрашиваемые переменные состояния имеют начальное значение, однако, для переменных, зависящих от реализации, начальные значения могут не приводиться.

Таблица A-1. Текущие величины и связанные с ними данные

Переменная состояния

Описание

Группа

Начальное

Опросная

атрибутов

значение

команда

 

 

GL_CURRENT_COLOR

Текущий цвет

текущие

(1,1,1,1)

glGetIntegerv(),

glGetFloatv()

 

 

 

 

GL_CURRENT_INDEX

Текущий цветовой

текущие

1

glGetIntegerv(),

индекс

glGetFloatv()

 

 

 

 

Текущие

 

 

 

GL_CURRENT_TEXTURE_COORDS

координаты

текущие

(0,0,0,1)

glGetFloatv()

 

текстуры

 

 

 

GL_CURRENT_NORMAL

Текущая нормаль

текущие

(0,0,1)

glGetFloatv()

GL_CURRENT_RASTER_POSITION

Текущая позиция

текущие

(0,0,0,1)

glGetFloatv()

растра

 

 

 

 

GL_CURRENT_RASTER_DISTANCE

Текущая дистанция

текущие

0

glGetFloatv()

растра

 

 

 

 

 

Цвет,

 

 

 

GL_CURRENT_RASTER_COLOR

ассоциированный с

текущие

(1,1,1,1)

glGetIntegerv(),

текущей позицией

glGetFloatv()

 

 

 

 

растра

 

 

 

 

Цветовой индекс,

 

 

 

GL_CURRENT_RASTER_INDEX

ассоциированный с

текущие

1

glGetIntegerv(),

текущей позицией

glGetFloatv()

 

 

 

 

растра

 

 

 

 

Координаты

 

 

 

 

текстуры,

 

 

 

GL_CURRENT_RASTER_TEXTURE_COORDS ассоциированные с

текущие

(0,0,0,1)

glGetFloatv()

 

текущей позицией

 

 

 

 

растра

 

 

 

GL_CURRENT_RASTER_POSITION_VALID

Бит допустимости

текущие

GL_TRUE

glGetBooleanv()

позиции растра

 

 

 

 

GL_EDGE_FLAG

Флаг ребра (флаг

текущие

GL_TRUE

glGetBooleanv()

границы)

 

 

 

 

 

 

 

 

Таблица A-2. Вершинные массивы

 

 

 

 

 

 

 

 

Переменная состояния

Описание

Группа

Начальное

Опросная

атрибутов

значение

команда

 

 

GL_VERTEX_ARRAY

Активность массива

вершинные

GL_FALSE

glIsEnabled()

координат вершин

массивы

 

 

 

 

 

 

 

 

GL_VERTEX_ARRAY_SIZE

GL_VERTEX_ARRAY_TYPE GL_VERTEX_ARRAY_STRIDE GL_VERTEX_ARRAY_POINTER GL_NORMAL_ARRAY GL_NORMAL_ARRAY_TYPE GL_NORMAL_ARRAY_STRIDE GL_NORMAL_ARRAY_POINTER GL_COLOR_ARRAY GL_COLOR_ARRAY_SIZE GL_COLOR_ARRAY_TYPE GL_COLOR_ARRAY_STRIDE GL_COLOR_ARRAY_POINTER GL_INDEX_ARRAY GL_INDEX_ARRAY_TYPE GL_INDEX_ARRAY_STRIDE GL_INDEX_ARRAY_POINTER GL_TEXTURE_COORD_ARRAY GL_TEXTURE_COORD_ARRAY_SIZE GL_TEXTURE_COORD_ARRAY_TYPE GL_TEXTURE_COORD_ARRAY_STRIDE GL_TEXTURE_COORD_ARRAY_POINTER GL_EDGE_FLAG_ARRAY GL_EDGE_FLAG_ARRAY_STRIDE GL_EDGE_FLAG_ARRAY_POINTER

GL_CLIENT_ACTIVE_TEXTURE_ARB

Число координат на

вершинные

вершину

массивы

Тип координат

вершинные

вершин

массивы

Смещение между

вершинные

вершинами

массивы

Указатель на массив

вершинные

координат вершин

массивы

Активность массива

вершинные

нормалей

массивы

Тип координат

вершинные

нормали

массивы

Смещение между

вершинные

нормалями

массивы

Указатель на массив

вершинные

координат нормалей

массивы

Активность массива

вершинные

RGBA цветов

массивы

Число компонент на

вершинные

вершину

массивы

Тип цветовых

вершинные

компонентов

массивы

Смещение между

вершинные

цветами

массивы

Указатель на массив

вершинные

цветов

массивы

Активность массива

вершинные

цветовых индексов

массивы

Тип индексов

вершинные

массивы

 

Смещение между

вершинные

индексами

массивы

Указатель на массив

вершинные

индексов

массивы

Активность массива

вершинные

координат текстуры

массивы

Число координат на

вершинные

элемент

массивы

Тип координат

вершинные

текстуры

массивы

Смещение между

вершинные

координатами

массивы

Указатель на массив

вершинные

координат текстуры

массивы

Активность массива

вершинные

флагов ребра

массивы

Смещение между

вершинные

флагами

массивы

Указатель на массив

вершинные

флагов

массивы

Активный

 

текстурный блок для

 

спецификации

вершинные

массивом

массивы

текстурных

 

координат

 

4

glGetIntegerv()

GL_FLOAT

glGetIntegerv()

0

glGetIntegerv()

NULL

glGetPointerv()

GL_FALSE

glIsEnabled()

GL_FLOAT

glGetIntegerv()

0

glGetIntegerv()

NULL

glGetPointerv()

GL_FALSE

glIsEnabled()

4

glGetIntegerv()

GL_FLOAT

glGetIntegerv()

0

glGetIntegerv()

NULL

glGetPointerv()

GL_FALSE

glIsEnabled()

GL_FLOAT

glGetIntegerv()

0

glGetIntegerv()

NULL

glGetPointerv()

GL_FALSE

glIsEnabled()

4

glGetIntegerv()

GL_FLOAT

glGetIntegerv()

0

glGetIntegerv()

NULL

glGetPointerv()

GL_FALSE

glIsEnabled()

0

glGetIntegerv()

NULL

glGetPointerv()

GL_TEXTURE0_

glGetIntegerv()

ARB

 

Таблица A-3. Преобразования

Переменная состояния

Описание

Группа

Начальное

Опросная

атрибутов

значение

команда

 

 

GL_COLOR_MATRIX

Стек цветовых

-

Единичная

glGetFloatv()

матриц

 

 

 

 

GL_MODELVIEW_MATRIX

Стек видовых матриц -

Единичная

glGetFloatv()

 

 

 

 

 

GL_PROJECTION_MATRIX

Стек проекционных

-

Единичная

glGetFloatv()

матриц

 

 

 

 

GL_TEXTURE_MATRIX

Стек текстурных

-

Единичная

glGetFloatv()

матриц

 

 

 

 

 

Начальная точка и

 

 

 

GL_VIEWPORT

размеры порта

порт просмотра

-

glGetIntegerv()

 

просмотра

 

 

 

GL_DEPTH_RANGE

Разброс глубин

порт просмотра

0, 1

glGetFloatv()

GL_COLOR_STACK_DEPTH

Указатель стека

-

1

glGetIntegerv()

цветовых матриц

 

 

 

 

GL_MODELVIEW_STACK_DEPTH

Указатель стека

-

1

glGetIntegerv()

видовых матриц

 

Указатель стека

 

 

 

GL_PROJECTION_STACK_DEPTH

проекционных

-

1

glGetIntegerv()

 

матриц

 

 

 

GL_TEXTURE_STACK_DEPTH

Указатель стека

-

1

glGetIntegerv()

текстурных матриц

 

 

 

 

GL_MATRIX_MODE

Текущий матричный

трансформация

GL_MODELVIEW

glGetIntegerv()

режим

 

 

 

 

 

Активность режима

трансформация/

 

 

GL_NORMALIZE

нормализации

GL_FALSE

glIsEnabled()

включенные

 

нормалей

 

 

 

 

 

 

 

Активность режима

трансформация/

 

 

GL_RESCALE_NORMAL

масштабирования

GL_FALSE

glIsEnabled()

включенные

 

нормалей

 

 

 

 

 

 

 

Коэффициенты i-ой

 

 

 

GL_GET_CLIP_PLANEi

пользовательской

трансформация

(0,0,0,0)

glGetClipPlane()

отсекающей

 

 

 

 

 

плоскости

 

 

 

 

Активность i-ой

 

 

 

GL_GET_CLIP_PLANEi

пользовательской

трансформация/

GL_FALSE

glIsEnabled()

отсекающей

включенные

 

 

 

 

плоскости

 

 

 

 

 

 

 

 

Таблица A-4. Цвет

Переменная

Описание

Группа

Начальное

Опросная

состояния

атрибутов

значение

команда

 

GL_FOG_COLOR

Цвет тумана

туман

(0,0,0,0)

glGetFloatv()

GL_FOG_INDEX

Цветовой индекс тумана

туман

0

glGetFloatv()

GL_FOG_DENSITY

Плотность

туман

1.0

glGetFloatv()

экспоненциальная тумана

 

 

 

 

GL_FOG_START

Начало линейного тумана

туман

0.0

glGetFloatv()

GL_FOG_END

Конец линейного тумана

туман

1.0

glGetFloatv()

GL_FOG_MODE

Режим тумана

туман

GL_EXP

glGetIntegerv()

GL_FOG

Активность тумана

туман/

GL_FALSE

glIsEnabled()

включенные

 

 

 

 

GL_SHADE_MODEL

Режим закраски

освещение

GL_SMOOTH

glGetIntegerv()

 

 

 

 

 

Таблица A-5. Освещение

Переменная состояния

Описание

Группа

Начальное

Опросная

атрибутов

значение

команда

 

 

 

Активность

освещение/

 

 

GL_LIGHTING

расчета

GL_FALSE

glIsEnabled()

включенные

 

освещенности

 

 

 

 

 

 

GL_COLOR_MATERIAL

Активность режима

освещение

GL_FALSE

glIsEnabled()

 

цвета материала

 

 

 

 

Параметр,

 

 

 

 

совпадающий с

 

GL_AMBIENT_

 

GL_COLOR_MATERIAL_PARAMETER

текущим цветом

освещение

glGetIntegerv()

AND_DIFFUSE

 

для режима цвета

 

 

 

 

 

 

 

материала

 

 

 

 

 

 

 

 

GL_COLOR_MATERIAL_FACE

GL_AMBIENT

GL_DIFFUSE

GL_SPECULAR

GL_EMISSION

GL_SHININESS

GL_LIGHT_MODEL_AMBIENT GL_LIGHT_MODEL_LOCAL_VIEWER

GL_LIGHT_MODEL_TWO_SIZE

GL_LIGHT_MODEL_COLOR_CONTROL

GL_AMBIENT

GL_DIFFUSE

GL_SPECULAR

GL_POSITION GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUDRATIC_ATTENUATION

GL_SPOT_DIRECTION

GL_SPOT_EXPONENT

GL_SPOT_CUTOFF

GL_LIGHTi

GL_COLOR_INDEXES

Затрагиваемые грани для режима цвета материала

Фоновый цвет материала

Диффузный цвет материала

Зеркальный цвет материала

Исходящий цвет материала

Зеркальная

экспонента

материала

Глобальный фоновый цвет

Локален ли наблюдатель

Включено ли двухстороннее освещение

Отделяется ли зеркальный цвет

Фоновая

интенсивность источника i

Диффузная

интенсивность источника i

Зеркальная

интенсивность источника i

Позиция источника i

Постоянный фактор ослабления

Линейный фактор ослабления

Квадратичный фактор ослабления

Прожекторное

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

Прожекторная

экспонента источника i

Прожекторный угол источника i

Активность источника i

Цветовые индексы для освещения в индексном режиме

освещение

GL_FRONT_

glGetIntegerv()

AND_BACK

 

 

освещение

(0.2,0.2,0.2,1.0)

glGetMaterialfv()

освещение

(0.8,0.8,0.8,1.0)

glGetMaterialfv()

освещение

(0.0,0.0,0.0,1.0)

glGetMaterialfv()

освещение

(0.0,0.0,0.0,1.0)

glGetMaterialfv()

освещение

0.0

glGetMaterialfv()

освещение

(0.2,0.2,0.2,1.0)

glGetFloatv()

освещение

GL_FALSE

glGetBooleanv()

освещение

GL_FALSE

glGetBooleanv()

освещение

GL_SINGLE_

glGetIntegerv()

COLOR

 

 

освещение

(0.0,0.0,0.0,1.0)

glGetLightfv()

освещение

-

glGetLightfv()

освещение

-

glGetLightfv()

освещение

(0.0,0.0,1.0,0.0)

glGetLightfv()

освещение

1.0

glGetLightfv()

освещение

0.0

glGetLightfv()

освещение

0.0

glGetLightfv()

освещение

(0.0,0.0,-1.0)

glGetLightfv()

освещение

0.0

glGetLightfv()

освещение

180.0

glGetLightfv()

освещение/

GL_FALSE

glIsEnabled()

включенные

 

 

освещение/

0,1,1

glGetMaterialfv()

включенные

 

 

Таблица A-6. Растеризация

Переменная состояния

Описание

Группа

Начальное

Опросная команда

 

 

атрибутов

значение

 

GL_POINT_SIZE

Размер точек

точка

1.0

glGetFloatv()

GL_POINT_SMOOTH

Активность режима

точка/включенные

GL_FALSE

glIsEnabled()

 

сглаживания точек

 

 

 

GL_LINE_WIDTH

Толщина линий

линия

1.0

glGetFloatv()

GL_LINE_SMOOTH

Активность режима

линия/включенные

GL_FALSE

glIsEnabled()

 

сглаживания

 

 

 

GL_LINE_STIPPLE_PATTERN

GL_LINE_STIPPLE_REPEAT

GL_LINE_STIPPLE

GL_CULL_FACE

GL_CULL_FACE_MODE

GL_FRONT_FACE

GL_POLYGON_SMOOTH

GL_POLYGON_MODE

GL_POLYGON_OFFSET_FACTOR

GL_POLYGON_OFFSET_BIAS

GL_POLYGON_OFFSET_POINT

GL_POLYGON_OFFSET_LINE

GL_POLYGON_OFFSET_FILL

GL_POLYGON_STIPPLE

-

линий

Рисунок шаблона линий

Повторение шаблона линий

Активность режима шаблонирования линий

Активность режима удаления нелицевых граней

Какие грани нужно удалять

Что считать лицевой гранью

Активность режима сглаживания полигонов

Режим

растеризации

полигонов

Фактор

полигонального

смещения

Скос

полигонального

смещения

Активность

полигонального смещения для точек

Активность

полигонального смещения для линий

Активность

полигонального смещения для закрашенных областей

Активность режима шаблонирования полигонов

Рисунок шаблона полигона

линия

линия

линия/

включенные

полигон/

включенные

полигон

полигон

полигон/

включенные

полигон

полигон

полигон

полигон/

включенные

полигон/

включенные

полигон/

включенные

полигон/

включенные

Единицы

1 GL_FALSE

GL_FALSE GL_BACK GL_CCW GL_FALSE

GL_FILL

0

0

GL_FALSE

GL_FALSE

GL_FALSE

GL_FALSE

шаблон полигона

Единицы

glGetIntegerv()

glGetIntegerv()

glIsEnabled()

glIsEnabled()

glGetIntegerv()

glGetIntegerv()

glIsEnabled()

glGetIntegerv()

glGetFloatv()

glGetFloatv()

glIsEnabled()

glIsEnabled()

glIsEnabled()

glIsEnabled()

glGetPolygonStipple()

Таблица A-7. Текстурирование

Переменная состояния

Описание

Группа атрибутов

Начальное

Опросная команда

 

 

 

значение

 

 

Активность

 

 

 

 

текстурирован

текстура/включенн

 

 

GL_TEXTURE_x

ия с

GL_FALSE

glIsEnabled()

ые

 

размерностью

 

 

 

 

 

 

 

x

 

 

 

 

Объект

 

 

 

 

текстуры

 

 

 

GL_TEXTURE_BINDING_x

прикреплен к

текстура

GL_FALSE

glGetIntegerv()

GL_TEXTURE_x

 

 

 

 

 

(где x – 1D, 2D

 

 

 

 

или 3D)

 

 

 

 

Изображение

 

 

 

GL_TEXTURE

x-D текстуры

-

-

glGetTexImage()

 

на уровне i

 

 

 

GL_TEXTURE_WIDTH

Ширина i-го

-

0

glGetTexLevelParameter

изображения

*()

 

 

 

 

 

 

 

 

Соседние файлы в предмете Компьютерная Графика