кг ответы. 1. Определение OpenGL. Определение api. Пример имени функции OpenGL
![]()
|
1. Определение OpenGL. Определение API. Пример имени функции OpenGL. OpenGL - кросс-платформерный, независимый от языка программирования API для работы с графикой. API (Application Programming Interface, Интерфейс программирования приложений) - набор готовых классов, процедур, функций, структур и констант, предоставляемых библиотекой или операционной системой для использования во внешних программных продуктах. Все команды, процедуры и функции OpenGL начинаются с префикса gl, а все константы - с GL_. glColor3f(1,1,1); - функция GL_POINT - константа В функциях OpenGL могут присутствовать суффиксы, например у функции glColor они могут быть такими: glColor[3][f][ ](1,1,1); Первый суффикс ([3] в данном случае) обозначает количество входных параметров, второй ([f]) - их тип (они описаны во втором вопросе на сайте), третий - является ли параметром массив (если нет, то он вообще не пишется, если да, то добавляется буква v). Квадратные скобки здесь просто для наглядности, как можно заметить из первого примера, пишутся суффиксы без них. Пример функции с параметром-массивом: glColor3fv(V); GL_float V{1,1,1}; Число входных параметров может быть равно 1, 2, 3 или 4. 2. Основные типы данных OpenGL. 3. Виды буферов OpenGL. Работа с буферами. фрейм буфер (где строится изображение), z-буфер, служащий для удаления невидимых поверхностей, буфер трафарета и аккумулирующий буфер. glClear(GLbitfield mask), очищающает буферы, заданные переменной mask. Параметр mask является комбинацией следующих констант: GL_COLOR_BUFFER_BIT – очистить буфер изображения (фреймбуфер); GL_DEPTH_BUFFER_BIT – очистить z-буфер; GL_ACCUM_BUFFER_BIT – очистить аккумулирующий буфер; GL_STENCIL_BUFFER_BIT – очистить буфер трафарета. glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) задает цвет очистки фрейм-буффера glClearDepth(GLfloat depth) задает значение z в z-буффере при его очистке glClearStencil(GLint s) задает значение, записываемое в буффер-трафарета glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) задает цвет, записываемый в аккум. буффер при его очистке Сама команда glClear очищает одновременно все заданные буферы, заполняя их соответствующими значениями. 4. Работа с цветом в OpenGL. glColor{3 4}{b s i f d ub us ui}[v](TYPE red, …). Цифра 3 или 4 указывает на количество требуемых аргументов, а буква, следующая за цифрой, показывает тип аргументов. Например, в процедуру glColor3i будут переданы три параметра целого типа. 5. Понятие вершин в OpenGL. Работа с вершинами. Все геом. объекты строятся на вершинах. Вершина задается в виде точки с координатами. Опенгл юзает однородные координаты. То есть объекты задаются вершинами, а вершины процедурой: glVertex{2 3 4}{s i f d}[v](TYPE x, …), где реальное количество параметров определяется первым суффиксом (2, 3 или 4), а суффикс v означает, что в качестве единственного аргумента выступает массив, содержащий необходимое количество координат. Например: glVertex2s(1, 2); glVertex3f(2.3, 1.5, 0.2); GLdouble vect[] = {1.0, 2.0, 3.0, 4.0}; glVertex4dv(vect); Когда нам нужно сделать примитив, необходимо начать процесс рисования и уточнить вид примитива. То есть объект состоит из вершин, но мы должны не просто создать вершины, а также сгруппировать их, уточнить, что они принадлежат одному объекту. В Опенгл это оформляется между вызовом процедур glBegin() и glEnd() . glBegin(GLenum mode) обозначает начало списка вершин, описывающих геометрический примитив. Тип примитива задаётся параметром mode, который принимает одно из следующих значений: GL_POINTS – набор отдельных точек; GL_LINES – пары вершин, задающих отдельные точки; GL_LINE_STRIP – незамкнутая ломаная; GL_LINE_LOOP – замкнутая ломаная; GL_POLYGON – простой выпуклый многоугольник; GL_TRIANGLES – тройки вершин, интерпретируемые как вершины отдельных треугольников; GL_TRIANGLE_STRIP – связанная полоса треугольников; GL_TRIANGLE_FAN – веер треугольников; GL_QUADS – четвёрки вершин, задающие выпуклые четырёхугольники; GL_QUAD_STRIP – полоса четырёхугольников. glEnd() отмечает конец списка вершин. Между командами glBegin() и glEnd() могут находится команды задания различных атрибутов вершин: glVertex(), glColor(), glNormal(), glCallList(), glCallLists(), glTexCoord(), glEdgeFlag(), glMaterial(). Все остальные команды OpenGL недопустимы и приводят к возникновению ошибок. В момент вызова glVertex() OpenGL присваивает создаваемой вершине текущий цвет, координаты текстуры, вектор нормали и т. д. Изначально вектор нормали полагается равным (0, 0, 1), цвет полагается равным (1, 1, 1, 1), координаты текстуры полагаются равными нулю. 6. Графические примитивы GL_POINTS, GL_LINES. Все эти константы из названий вопросов – это кандидаты на роль параметра mode в процедуре glBegin(mode). Они определяют тип примитива, который будет сформирован из вершин, создаваемых после вызова glBegin(); GL_POINTS – набор отдельных точек; GL_LINES – пары вершин, задающих отдельные точки; glPointSize(GLfloat size) задает размер точек (по стоку = 1) gflineWidth(GLfloatwidth) задает ширину линий (по стоку = 1) Линии можно делать пунктирными. 7. Графические примитивы GL_LINE_STRIP, GL_LINE_LOOP. GL_LINE_STRIP – незамкнутая ломаная GL_LINE_LOOP – замкнутая ломаная 8. Графические примитивы GL_POLYGON, GL_TRIANGLES. GL_POLYGON – простой выпуклый многоугольник; GL_TRIANGLES – тройки вершин, интерпретируемые как вершины отдельных треугольников; glPolygonMode(GLenum face, GLenum mode) задает правила рисования многоугольников. face может принимать значения GL_FRONT_AND_BACK (обе стороны), GL_FRONT (лицевая сторона) или GL_BACK (нелицевая сторона) и задает то, какие стороны многоугольника отрисовывать (лицевая, нелицевая или обе) Вершины, создаваемые против часовой стрелки - лицевые mode может принимать значения GL_POINT, GL_LINE или GL_FILL, обозначая, что многоугольник должен рисоваться как набор граничных точек, граничная ломаная линия или заполненная область. Например: glPolygonMode(GL_FRONT, GL_FILL); glPolygonMode(GL_BACK, GL_LINE). 9. Графические примитивы GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN. GL_TRIANGLE_STRIP – связанная полоса треугольников; GL_TRIANGLE_FAN – веер треугольников; 10. Графические примитивы GL_QUAD, GL_QUAD_STRIP. GL_QUADS – четвёрки вершин, задающие выпуклые четырёхугольники; GL_QUAD_STRIP – полоса четырёхугольников. 11. Работа с вершинами. Рисование окружности. glBegin(GL_LINE_LOOP); for (int i = 0; I < N; i++) { float angle = 2 * M_PI * i / N; glVertex2f(cos(angle), sin(angle)); } glEnd(); 12. Рисование точек в OpenGL. Рисование линий по шаблону (GL_LINE_STIPPLE). Линии можно делать пунктирными. Шаблон, которым будет рисоваться линия, можно задать при помощи процедуры glLineStipple(Glint factor, GLushort pattern). Шаблон задается переменной pattern и растягивается в factor раз. Использование шаблонов линии необходимо разрешить при помощи команды glEnable(GL_USE_STIPPLE). Запретить использование шаблонов линий можно командой glDisable(GL_LINE_STIPPLE). 13. Рисование многоугольников. Стороны (грани) многоугольников. Многоугольник представляет собой замкнутую форму, поверхность которой может быть закрашена и границы которой определяются набором вершин, соединённых отрезками. Многоугольники являются основными компонентами, из которых формируются трехмерные закрашенные объекты. Библиотека позволяет формировать несколько типов многоугольников: треугольники, четырехугольники, многоугольники. У всех многоугольников выделяют лицевую и обратную грани. Библиотека позволяет для каждой из граней задавать различные свойства, например, такие как: свойства материала, видимость, освещённость, режим отображения. По умолчанию лицевой гранью является та, которая получается при обходе вершин против часовой стрелки. Данный примитив задается на Object Pascal с помощью константы GL_POLYGON и на C# - с помощью значения Polygon перечисления BeginMode, которые передаются в качестве значения параметра команде Begin. Порядок обхода вершин многоугольника для определения лицевой и обратной граней соответствует порядку задания вершин. Примитив может использоваться только для создания выпуклых многоугольников Библиотека OpenGL позволяет для многоугольников определять режим отображения лицевых и обратных граней. Для этого используется команда PolygonMode (face, mode: GLenum); В библиотеке OpenTK на C# команда реализуется с помощью статического метода класса GL: void PolygonMode(MaterialFace face, PolygonMode mode); В Object Pascal команда реализуется с помощью процедуры: procedure glPolygonMode (face, mode: GLenum); Первый параметр команды face определяет грани, для которых определяется режим отображения. Второй параметр mode: По умолчанию для лицевых и обратных граней используется режим закрашивания поверхности (GL_FILL в Object Pascal, PolygonMode.Fill – на C#). Различные режимы отображения сторон многоугольников часто используются при отладке программ, формирующих сложные объекты. Режим отбора граней позволяет определить, какие из граней (лицевые, обратные) будут отображаться. Для включения и выключения режима используются команды Enable и Disable с параметром GL_CULL_FACE на Object Pascal и значением CullFace перечисления EnableCap на C#. По умолчанию режим отбора граней отключен и отображаются лицевые и обратные грани. Для задания граней многоугольников, которые не должны отображаться используется команда: CullFace (mode: GLenum); В C# команда реализуется с помощью статического метода класса GL библиотеки OpenTK: void CullFace(CullFaceMode mode); В Object Pascal команда реализуется с помощью процедуры: procedure glCullFace (mode: GLenum); В качестве параметра mode задаётся значение, которое определяет не отображаемые грани. В Object Pascal для этого используются объявленные в модуле Opengl.pas констранты, в C# для этого используются значения перечисления CullFaceMode. 14. Преобразование объектов в пространстве, общие принципы. Для задания координат объектов в OpenGL используются однородные координаты. Это позволяет представлять различные преобразования в виде квадратных матриц размером 4*4, а сложные преобразования представлять в виде произведения матриц, реализующих более простые преобразования. В OpenGL для представления координат вершин используется вектор- столбец. Все матрицы библиотеки, используемые в библиотеке OpenGL, являются вертикальными: Схема координатных преобразований. Видовые предобразования. Входными данными для этого этапа являются координаты примитивов, задаваемые с помощью команды Vertex и её аналогов (например, команды Rect). Координаты вершин примитивов умножаются на текущую видовую матрицу. Результатом умножения являются видовые координаты вершин: Обычно видовая матрица используется для таких преобразований как перенос, масштабирование и поворот. Для выполнения этих операций библиотека реализует команды Translate, Scale, Rotate. Каждая из этих команд формирует матрицу, осуществляющую соответствующее преобразование, и умножает её на текущую матрицу. Если М – текущая видовая матрица, Т – матрица преобразования, то результирующая матрица М’, которая заменит текущую матрицу, будет получена в результате операции: В результате новые преобразования как бы добавляются к тем, которые выполнялись с помощью текущей матрицы. Сложные координатные преобразования обычно представляют в виде комбинации более простых преобразований. При необходимости видовая матрица может быть полностью сформирована программно. После инициализации библиотеки видовая матрица является единичной. Перспективные преобразования На этом этапе координатных преобразований видовые координаты вершин (полученные на предыдущем этапе вычислений) умножаются на матрицу проекций Р. В библиотеке реализованы две команды для формирования наиболее часто используемых проекций: команда Ortho - для формирования матрицы параллельной проекции и команда Frustum – для получения матрицы центральной перспективной проекции. При выполнении этих команд определяется область видимости трехмерной сцены. Матрица проекции, кроме выполнения проекционных преобразований, также выполняет масштабирование координат видимой области к интервалу [-1,1] для каждой из осей координат. Преобразованные таким образом координаты вершин называются усечёнными координатами. Деление перспективы На третьем этапе выполняется преобразование нормализованных координат вершин к декартовым координатам, путем деления каждой из первых трех координат на четвёртую: В терминах OpenGL это преобразование носит название "деление перспективы". Результатом выполнения этого преобразования является получение декартовых координат вершин. 15. Матрицы, участвующие в преобразовании координат в OpenGL. Процедура glLoadIdentity(); Матрица перемещений Матрица перемещения, это, наверное, самая простая матрица из всех. Вот она: Тут X, Y, Z – это значения, которые мы хотим добавить к нашей позиции вершины. Итак, если нам нужно переместить вектор (10,10,10,1) на 10 пунктов, по позиции Х, то: Матрица Масштабирования Матрица масштабирования так же достаточно проста: Поэтому если вам хочется увеличить вектор(позицию или направление, не важно) в два раза по всем направлениям: МАТРИЦУ ВРАЩЕНИЯ НЕ НАШЕЛ. ЧТО_ТО НА АГЛИЙСКОМ glLoadIdentity() - текущая матрица будет заменена единичной. 16. Преобразование переноса и масштабирования. Параллельный перенос Для выполнения параллельного переноса библиотека реализует команду Translate[f d]. Команда имеет три параметра, определяющие координаты вектора параллельного переноса. Команда Translate формирует матрицу параллельного переноса и умножает её на текущую матрицу OpenGL. При выполнении команды Translate формируется вертикальная матрица: где x, y, z– координаты вектора параллельного переноса. Полученная матрица (T) умножается на текущую матрицу библиотеки (M), и результирующая матрица (M’) заменяет текущую матрицу OpenGL: В результате преобразование параллельного переноса добавляется к тем преобразованиям, которые выполняла текущая матрица на момент вызова команды Translate. В библиотеке OpenTK команда реализована как ряд статических методов класса GL (C#): void Translate(Vector3 trans); void Translate(Vector3d trans); void Translate(double x, double y, double z); void Translate(float x, float y, float z); В Object Pascal в файле OpenGL.pas объявлено несколько процедур, которые реализуют эту команду, и различаются только типом параметров: procedure glTranslated (x,y,z: GLdouble); procedure glTranslatef (x,y,z: GLfloat); procedure glTranslate(x,y,z: GLdouble); overload; procedure glTranslate(x,y,z: GLfloat); overload; Масштабирование относительно начала координат Для выполнения операции масштабирования относительно начала координат используется команда Scale[f d]. Команда имеет три параметра, которые определяют коэффициенты масштабирования для каждой из осей координат. Команда формирует матрицу: В результате выполнения команды Scale матрица масштабирования (S) умножается на текущую матрицу (M), и результирующая матрица (M’) заменяет текущую матрицу: В результате к преобразованиям, выполняемым текущей матрицей перед вызовом команды Scale, добавляется еще преобразование масштабирования. В библиотеке OpenTK команда реализована как ряд статических методов класса GL (C#): void Scale(Vector3 scale); void Scale(Vector3d scale); void Scale(double x, double y, double z); void Scale(float x, float y, float z); 17. Получение проекций. Перспективное проецирование. Для задания центральной перспективной проекции в OpenGL используется команда Frustum: Frustum (l, r, b, t, n, f: GLdouble); Команда Frustum имеет шесть параметров, которые определяют граничные координаты области видимости: l, r – левая и правая границы области видимости вдоль оси OX; b, t – нижняя и верхняя границы области видимости вдоль оси OY; n, f – ближняя и дальняя границы области видимости вдоль оси OZ. Ближняя граница оси OZ (параметр n) так же определяет положение плоскости проекции, которая располагается перпендикулярно оси OZ. Точка наблюдения находится в начале координат. Видимый объем представляет собой усеченную пирамиду, проекция видимой области формируется на плоскости усечения, перпендикулярной оси OZ. Значения l, r, b, t задаются для ближней к наблюдателю плоскости отсечения. Значения n и f должны быть положительными. Команда Frustum формирует матрицу (P): При выполнении команды Frustum матрица перспективной проекции (P) умножается на текущую матрицу (M), и результирующая матрица (M’) замещает текущую матрицу: Центр сцены имеет координаты: После умножения на матрицу проекции координаты вершин будут в интервале [-1,1] для всех осей координат. Эффект перспективы зависит от расстояния ближней плоскости до наблюдателя. Чем ближе плоскость проекции расположена к точке наблюдения, тем больше эффект перспективы. 18. Получение проекций. Ортогональное (параллельное) проецирование. Для формирования матрицы параллельной проекции используется команда Ortho(l, r, b, t, n, f: GLdouble) Команда имеет шесть параметров. Каждая пара параметров определяет координаты границ области видимости для каждой из осей координат: l, r – левая и правая границы области видимости вдоль оси OX; b, t – нижняя и верхняя границы области видимости вдоль оси OY; n, f – ближняя и дальняя границы области видимости вдоль оси OZ. Фактически параметры команды определяют расположение граничных плоскостей, ограничивающих видимую область пространства. Команда Ortho формирует матрицу: Диагональные элементы матрицы выполняют усечение каждой из осей координат в соответствии с границами области видимости, определяемой командой Ortho. В результате координаты видимой области находятся в интервале [-1;1] для каждой из осей. Поэтому диагональные элементы имеют вид дроби с числом 2 в качестве числителя (длина области видимости в усеченных координатах) и знаменателя, который равен длине области видимости в мировых координатах. Элемент в третьем столбце матрицы имеет отрицательный знак для изменения направления оси OZ на противоположное, и преобразует мировую систему координат в видовую. Элементы матрицы четвертого столбца переносят изображение в центр системы координат с учётом усечения координат. Центр сцены для параллельной проекции имеет координаты: Формируемая командой Ortho матрица ( ) умножается на текущую матрицу (M), результирующая матрица (M’) заменяет текущую матрицу: 19. Стек матриц в OpenGL. Задание моделей закрашивания. OpenGL реализует стек матриц, который функционирует по принципу "последним пришел – первым ушел. Для видовой матрицы размер стека составляет не менее 32 матриц, для проекционной – не менее 2 матриц. Небольшой размер стека проекционных матриц объясняется тем, что проекционные матрицы редко используются для реализации композиции преобразований. Текущий стек матриц изменяется при изменении типа текущей матрицы с помощью команды MatrixMode, поэтому текущая видовая матрица может быть скопирована только в стек видовых матриц. Для копирования текущей матрицы в соответствующий её типу стек матриц используется команда PushMatrix. Если на момент вызова команды стек уже заполнен, то копия текущей матрицы в стек добавлена не будет и библиотека сгенерирует ошибку переполнения стека: Которую можно проанализировать с помощью команды GetError: Для извлечения последней матрицы из стека в текущую матрицу используется команда PopMatrix: Если стек пуст, то текущая матрица не будет изменена, а библиотека сгенерирует ошибку: Которую можно проанализировать с помощью команды GetError 20. Освещение, световые свойства материалов. Можно считать, что фоновое освещение создается бесконечным множеством источников света, заполняющих весь объем сцены. Удобно считать, что направленный свет (диффузный и отраженный) создается прожектором ( spotlights ), бесконечно удаленным от поверхности освещения и генерирующим параллельные лучи. Примером параллельного источника света является Солнце. В OpenGL понятие модели освещения слагается из следующих компонентов 1. Интенсивность общего фонового освещения. 2. Положение точки обзора - локального по отношению к сцене или бесконечно удаленного. 3. Расчет освещенности для лицевых и оборотных граней объектов. 4. Требования, должен или нет отраженный цвет быть отделен от фонового и рассеянного и наложен на объект после операций текстурирования. Свойства материала объекта определяют характер рассеивания света. Большинство свойств материала по смыслу похожи на свойства источников света. Механизм их указания помощью функции glMaterialfv() подобен установке параметров источника света. Команды задания свойств материала имеют следующий синтаксис: void glMaterial{if}(GLenum face, GLenum pname, TYPE param); void glMaterial{if}v(GLenum face, GLenum pname, TYPE *param); В OpenGL различают четыре типа создаваемого освещения (соответственно, четыре типа источников света): 1. Фоновое (ambient) освещение (рассредоточенное освещение, свет окружающей среды) - свет, отраженный окружающими объектами столько раз, что его направление невозможно установить. Он выглядит приходящим со всех направлений. Объекты, освещенные рассеянным светом, равномерно окрашиваются со всех сторон и во всех направлениях. Такой свет не дает тени и отражается от поверхности во всех направлениях. 2. Диффузный (или рассеянное, diffuse) свет - свет, поступающий из определенного направления, но равномерно отражается от поверхности во всех направлениях. При прямом попадании на поверхность он более яркий, чем при легком прикосновении к ней вскользь. 3. Отраженный (или зеркальный, specular) свет - приходит из конкретного направления и отражается от поверхности также в определенном направлении. Отражающую способность поверхности можно представить как свойство с названием блеск ( shininess ). Сильно отраженный свет обычно дает яркое пятно на поверхности, именуемое "зайчиком" или "бликом". 4. Излучаемый (или эмиссионный, emission) свет - свет, который исходит от самого объекта. В модели освещения OpenGL цвет самосвечения добавляет яркости самому объекту и не зависит от любых других источников света. Этот свет не вносит дополнительного освещения в сцену, т.е. не освещает соседние объекты. Команда задает текущие значения свойств материала для использования при расчете освещенности. Аргумент face может принимать значения GL_FRONT, GL_BACK, GL_FRONT_AND_BACK в соответствии с тем, к лицевым или оборотным сторонам объекта применяется это свойство, или и к тем и другим вместе. Устанавливаемое свойство материала идентифицируется именем pname (приведены в таблице ниже), а его значение передается в аргументе param. В векторном варианте param является указателем на вектор значений. Невекторная версия команды применяется только для параметра GL_SHININESS. 21. Источники света. Процедура glLight(...); Источники света характеризуются набором свойств, включая цвет, яркость, положение, ориентацию и т.д., которые могут очень сильно влиять на вид сцены. Свойства источников света, в нашем примере, устанавливаются функцией glLightfv(), которая вызывается несколько раз для настройки свойств источника, но каждый раз с разными аргументами настройки. В общем случае создания и настройки источников света имеет вид void glLight{if}(GLenum light, GLenum pname, TYPE param); void glLight{if}v(GLenum light, GLenum pname, TYPE *param); Параметр light имеет значения GL_LIGHT0, ..., GL_LIGHT7, которые определяют номерное имя создаваемого источника. Настраиваемое свойство указывается одним из значений перечисления pname, приведенных в таблице ниже. Аргумент param - это собственно значение настраиваемого свойства pname или указатель на набор значений (в векторной версии). OpenGL поддерживает по меньшей мере 8 независимый источников света, расположенных в любых точках сцены или даже вне отображаемого (отсекающего) объема. Как видно из таблицы, OpenGL позволяет связать с каждым источником света три различных параметра цвета: GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR. Для того, чтобы использовать источники света, системе необходима дополнительная информация о нормалях к вершинам поверхностей. Нормали вычислялись неявно самой используемой нами сервисной функцией glutSolidSphere(1.0, 20, 16); Обычно используются единичные векторы нормали. После создания и настройки источников света их необходимо включить с помощью команды glEnable(GL_LIGHTING), тем самым сообщив OpenGL о необходимости принимать во внимание при рисовании сцены условия освещенности. Если освещение включено, но материал, источник освещения или нормали не заданы, то объект останется темным и неосвещенным (будет виден черный силуэт, если фон имеет цвет). 22. Пример вывода источника света. #include #include #include { GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat mat_shininess[] = { 50.0 }; GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_SMOOTH); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); } void display(void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutSolidSphere (1.0, 20, 16); glFlush (); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho (-1.5, 1.5, -1.5(GLfloat)h/(GLfloat)w, 1.5(GLfloat)h/(GLfloat)w, -10.0, 10.0); else glOrtho (-1.5(GLfloat)w/(GLfloat)h, 1.5(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; } Это Пример вывода источника света. Параметр pname команды glMaterialfv Имя параметра Значение по умолчанию GL_AMBIENT Краткийкомментарий (0.2, 0.2, 0.2, 1.0) GL_DIFFUSE цвет фоновогоотражения материала (0.8, 0.8, 0.8, 1.0) GL_SPECULAR цвет рассеянногоотражения материала (0.0, 0.0, 0.0, 1.0) GL_EMISSION цвет зеркальногоотражения материала (0.0, 0.0, 0.0, 1.0) GL_SHININESS цвет собственногоизлучения материала 0.0 ( ). степень в формуле зеркальногоотражения коэффициент блеска Допускаются значения [0; 128]. GL_AMBIENT_AND_DIFFUSE в интервале цвет фоновогои рассеянногоотражения материала 23. Пример программы для OpenGL с объяснением хедеров и инициализации OpenGL. 24. Библиотеки GLU и GLUT. OpenGL Utility Library (GLU) — графическая библиотека, надстройка над OpenGL, использующая её функции для рисования более сложных объектов. Обычно поставляется вместе с библиотекой OpenGL. В числе этих функций: переключение между экранными и мировыми координатами, создание текстур, рисование квадратичных поверхностей, составление мозаики прямоугольных примитивов, интерпретация кодов ошибок OpenGL, расширенный набор функций трансформации для установки точек обзора и более простого управления камерой и др. Также содержит функции для рисования дополнительных графических примитивов, таких как сфера, цилиндр, конус, диск и др. Функции библиотеки GLU очень легко найти в тексте программы по префиксу glu в названии функции. OpenGL Utility Toolkit (GLUT) — библиотека утилит для приложений под OpenGL, которая в основном отвечает за системный уровень операций ввода- вывода при работе с операционной системой. Из функций можно привести следующие: создание окна, управление окном, мониторинг за вводом с клавиатуры и событий мыши. GLUT даже включает возможность создания несложных всплывающих меню. Использование библиотеки GLUT преследует две цели. Во-первых, это создание кроссплатформенного кода. Во-вторых, GLUT позволяет облегчить изучение OpenGL. |