1 2 3 4 5 6 7 8 9 … 20
1 2 3 4 5 6 7 8 9 … 20 ©dereksiz.org 2022 | Басты бет |
Основы OpenGl
Все функции библиотеки OpenGL можно разделить на пять категорий:
Функции описания примитивов определяют объекты нижнего уровня иерархии (примитивы), которые способна отображать графическая подсистема. В OpenGL в качестве примитивов выступают точки, линии, многоугольники и т.д.;
Функции описания источников света служат для описания положения и параметров источников света, расположенных в трехмерной сцене;
Функции задания атрибутов. В качестве атрибутов OpenGL позволяет задавать цвет, характеристики материала, текстуры, параметры освещения;
Функции визуализации позволяют задать положение наблюдателя в виртуальном пространстве, параметры объектива камеры. Это позволяет не только правильно построить изображение, но и отсечь объекты, оказавшиеся вне поля зрения;
Набор функций геометрических преобразований позволяет выполнять различные преобразования объектов – поворот, перенос, масштабирование.
При этом OpenGL может выполнять дополнительные операции, такие как использование сплайнов для построения линий и поверхностей, удаление невидимых фрагментов изображений, работа с изображениями на уровне пикселей и т.д.
Интерфейс OpenGL
OpenGL состоит из набора библиотек. Все базовые функции хранятся в основной библиотеке (GL). Помимо основной, OpenGL включает в себя несколько дополнительных библиотек, которые могут подключаться как в виде отдельных модулей, так и в виде библиотек динамической компоновки (Dynamic Link Library — DLL).
Рис. 3.1 Организация библиотеки OpenGL
Библиотека GLU
GLU (OpenGL Utilities Library) содержит несколько подпрограмм, которые используют OpenGL для выполнения таких задач, как установка матриц для определенного ориентирования и проецирования просмотра, выполнение тесселяции многоугольников (разбиение произвольного многоугольника на выпуклые многоугольники) и визуализация поверхности. Библиотека GLU предоставляет множество возможностей моделирования: поверхности второго порядка, NURBS-кривые и NURBS-поверхности (Non-Uniform Rational B Spline — неравномерный рациональный B-сплайн). Библиотека GLU представляет собой стандартную часть реализации OpenGL. Существуют также наборы инструментов более высокого уровня, такие как FSG (Farengheit Scene Graph). Подпрограммы GLU используют префикс glu.
Библиотека GLUT
Для вывода изображения OpenGL-программы должны использовать механизмы системы управления окнами. Для этого можно вызывать функции API оконной системы, например, WinAPI, однако в этом случае приложение будет компилироваться только под одну выбранную оконную систему. Чтобы упростить задачу разработчикам, была создана библиотека GLUT (Graphics Library Utility Toolkit), которая представляет собой независимый от оконной системы инструментарий, написанный Марком Килгардом (Mark Kilgard) для того чтобы скрыть сложность программного интерфейса API различных оконных систем, отвечающих за создание окон, в которые будет производиться вывод генерируемых изображений, обработка нажатий клавиш клавиатуры, перемещение мыши и пр. Подпрограммы GLUT используют префикс glut. Функционально аналогичная библиотека GLX, интегрирующая Х Window с OpenGL, менее популярна.
Библиотека GLAUX
Вспомогательная библиотека GLAUX (OpenGL Auxiliary Library) содержит функции, создающие простые трёхмерные геометрические объекты, такие как сфера, куб, параллелепипед, цилиндр, конус и пр. , функции, загружающие изображения из файлов, функции, работающие с окном вывода графики и т.д.
Синтаксис команд OpenGL
В названии команд OpenGL используется префикс gl и заглавные буквы для отделения слов, составляющих название команды (например, glClearColor()). Подобным же образом OpenGL определяет константы, начинающиеся с GL_ со всеми заглавными буквами и символом подчеркивания для отделения слов (например, GL_COLOR_BUFFER_BIT).
Следует также обратить внимание на буквы и цифры в конце названия некоторых команд (например, 3f в glColor3f() и glVertex3f()). Цифра 3 в названии команды glColor3f() означает, что она получает три аргумента, существует и другая версия, получающая четыре аргумента (четвертый – коэффициент прозрачности, называемый альфа — каналом). Буква f означает, что аргументы имеют формат числа с плавающей точкой. Подобное соглашение об именовании команд позволяет программисту использовать более удобный для него формат аргументов.
Некоторые команды воспринимают до восьми различных типов данных. Буквы, используемые в качестве суффиксов для указания конкретного типа данных в реализации OpenGL для ISO — стандарта языка C приведены в таблице 3.1.
Таблица 3.1. Суффиксы команд и соответствующие им типы аргументов
Суффиксы | Тип данных | Аналогичный тип языка С | Тип, определенный в OpenGL |
b | целое 8 бит | signed char | GLbyte |
s | целое 16 бит | short | GLshort |
i | целое 32 бита | int или long | GLint, GLsizei |
f | число с плавающей точкой 32 бита | float | GLfloat, GLclampf |
d | число с плавающей точкой 64 бита | double | GLdouble, GLclampd |
ud | беззнаковое целое 8 бит | unsigned char | GLubyte, GLboolean |
us | беззнаковое целое 16 бит | unsigned short | GLushort |
ui | беззнаковое целое 32 бита | unsigned int или unsigned long | GLuint, GLenum, GLbitfield |
Примитивы библиотек GLU и GLUT
Рассмотрим стандартные команды построения примитивов, которые реализованы в библиотеках GLU и GLUT.
Чтобы построить примитив из библиотеки GLU, надо сначала создать указатель на quadric-объект с помощью команды gluNewQuadric(), а затем вызвать одну из команд: gluSphere(), gluCylinder(), gluDisk(), gluPartialDisk(). Рассмотрим эти команды отдельно (табл. 3.2).
Таблица 3.2. Функции библиотеки GLU
Название функции | Назначение |
void gluSphere( GLUquadricObj *qobj, GLdouble radius, GLint slices, GLint stacks) | Эта функция строит сферу с центром в начале координат и радиусом radius. При этом число разбиений сферы вокруг оси z задается параметром slices, а вдоль оси z – параметром stacks. |
void gluCylinder( GLUquadricObj *qobj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks) | Данная функция строит цилиндр без оснований (то есть кольцо), продольная ось параллельна оси z, заднее основание имеет радиус baseRadius, и расположено в плоскости z=0, переднее основание имеет радиус topRadius и расположено в плоскости z= height. Если задать один из радиусов равным нулю, то будет построен конус. Параметры slices и stacks имеют аналогичный смысл, что и в предыдущей команде. |
void gluDisk( GLUquadricObj *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops) | Функция строит плоский диск (то есть круг) с центром в начале координат и радиусом outerRadius. При этом если значение innerRadius отлично от нуля, то в центре диска будет находиться отверстие радиусом innerRadius. Параметр slices задает число разбиений диска вокруг оси z, а параметр loops – число концентрических колец, перпендикулярных оси z. |
void gluPartialDisk( GLUquadricObj *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops, GLdouble startAngle, GLdouble sweepAngle) | Отличие этой функции от предыдущей заключается в том, что она строит сектор круга, начальный и конечный углы которого отсчитываются против часовой стрелки от положительного направления оси y и задаются параметрами startAngle и sweepAngle. Углы измеряются в градусах. |
Команды, проводящие построение примитивов из библиотеки GLUT, реализованы через стандартные примитивы OpenGL и GLU. Для построения нужного примитива достаточно произвести вызов соответствующей команды. Объект каждого типа может быть создан в двух режимах – в виде сплошной трехмерной фигуры или каркасного объекта (для каркасного объекта фрагмент «Solid» в названии функции заменяется на «Wire»).
Таблица 3.2. Функции библиотеки GLUT
Название функции | Назначение |
void glutSolidSphere ( GLdouble radius, GLint slices, GLint stacks) | Функция glutSolidSphere() строит сферу, а glutWireSphere() – каркас сферы радиусом radius. При этом число разбиений сферы вокруг оси z задается параметром slices, а вдоль оси z – параметром stacks. |
void glutSolidCube( GLdouble size) | Построение куба или каркаса куба с центром в начале координат и длиной ребра size. |
void glutSolidCone( GLdouble base, GLdouble height, GLint slices, GLint stacks) | Функция строит конус или его каркас высотой height и радиусом основания base, расположенный вдоль оси z. Основание находится в плоскости z=0. |
void glutSolidTorus( GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings) | Построение тора или его каркаса в плоскости z=0. Внутренний и внешний радиусы задаются параметрами innerRadius, outerRadius. Параметр nsides задает число сторон в кольцах, составляющих ортогональное сечение тора, а rings – число радиальных разбиений тора. |
void glutSolidTetrahedron (void) void glutWireTetrahedron (void) | Функции строят тетраэдр (правильную треугольную пирамиду) или его каркас, при этом радиус описанной сферы вокруг него равен 1. |
void glutSolidOctahedron (void) void glutWireOctahedron (void) | Построение октаэдра или его каркаса, радиус описанной вокруг него сферы равен 1. |
void glutSolidDodecahedron (void) void glutWireDodecahedron (void) | Функции строят додекаэдр или его каркас, радиус описанной вокруг него сферы равен квадратному корню из трех. |
void glutSolidIcosahedron (void) void glutWireIcosahedron (void) | Построение икосаэдра или его каркаса, радиус описанной вокруг него сферы равен 1. |
Для корректного построения перечисленных примитивов необходимо удалять невидимые линии и поверхности, для чего надо включить соответствующий режим вызовом команды glEnable(GL_DEPTH_TEST).
2.1. Примитивы OpenGLВ OpenGL приложения отображают примитивы, указывая тип примитива и последовательность вершин со связанными данными. Тип примитива определяет, как OpenGL интерпретирует и отображает последовательность вершин. 2.1.1. Типы примитивовOpenGL предоставляет десять различных типов примитивов для рисования точек, линий и многоугольников, как показано на рис. 2-1. Рис. 2-1. Примитивные типы OpenGL.OpenGL интерпретирует вершины и отображает каждый примитив, используя следующие правила:
Для GL_QUADS, GL_QUAD_STRIP и GL_POLYGON все примитивы должны быть как плоскими, так и выпуклыми. В противном случае поведение OpenGL не определено. Библиотека GLU поддерживает тесселяцию полигонов, что позволяет приложениям визуализировать заполненные примитивы, которые являются невыпуклыми или самопересекающимися, или которые содержат отверстия. Для получения дополнительной информации см. набор функций «gluTess» в Справочном руководстве OpenGL ® . 2.1.2. Совместное использование вершинОбратите внимание, что GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN и GL_QUAD_STRIP имеют общие вершины среди составляющих их сегментов прямых, треугольников и четырехугольников. В общем, вы должны использовать эти примитивы, когда это возможно и практично, чтобы уменьшить избыточные вычисления для каждой вершины. Вы можете визуализировать примитив GL_QUAD_STRIP с двумя четырехугольниками, используя, например, GL_QUADS. При отображении в виде GL_QUAD_STRIP вашему приложению потребуется отправить только шесть уникальных вершин. Однако версия этого примитива GL_QUADS потребовала бы восьми вершин, две из которых избыточны. Передача одинаковых вершин в OpenGL увеличивает количество операций над каждой вершиной и может создать узкое место производительности в конвейере рендеринга. |
Учебное пособие по GLSL — примитивная сборка » Lighthouse3d.com
Этап сборки примитивов получает в качестве входных данных обработанные вершины от вершинного шейдера и информацию о соединении вершин от приложения, как указано в семействе команд OpenGL glDraw*
.
Связность вершин указывает, как вершины соединяются для создания примитива. Примитивы могут быть точками, линиями, треугольниками или участками. Кроме того, может также предоставляться информация о смежности, т. е. приложение может также предоставлять вершины, составляющие смежные примитивы. Эта информация используется только для шейдера геометрии, и если такой шейдер не активен, информация о смежности будет игнорироваться.
На выходе сборка примитивов создает примитивы или патчи. Например, если вход представляет собой последовательность из шести вершин, а информация о соединении указывает, что мы используем треугольники, на выходе будут два треугольника. Для треугольных полос, а также с учетом шести вершин, на выходе будет четыре треугольника.
Патчи — это примитивные типы, принимаемые шейдером управления тесселяцией, доступные в OpenGL 4+. Количество вершин патча не фиксировано, как в случае с примитивами, и может варьироваться от 1 до константы, зависящей от реализации, 9.0117 GL_MAX_PATCH_VERTICES , вершин на патч.
Графически, предполагая, например, что тип примитива — GL_TRIANGLES, это можно изобразить следующим образом:
В следующей таблице показаны возможные настройки входной информации о соединении и полученные выходные данные, а также шейдеры, которые их используют.
Команда glDraw | выходной примитив | используется в шейдерах |
GL_POINTS | точек | геометрия; фрагмент |
GL_LINES | строки | геометрия; фрагмент |
GL_LINE_STRIP | строки | геометрия; фрагмент |
GL_LINE_LOOP | строки | геометрия; фрагмент |
GL_LINES_ADJACENCY | линии_смежности | геометрия |
GL_LINE_STRIP_ADJACENCY | линии_смежности | геометрия |
ГЛ_ТРЕУГОЛЬНИКИ | треугольники | геометрия; фрагмент |
GL_TRIANGLE_STRIP | треугольники | геометрия; фрагмент |
GL_TRIANGLE_FAN | треугольники | геометрия; фрагмент |
GL_TRIANGLES_ADJACENCY | треугольники_смежности | геометрия |
GL_TRIANGLE_STRIP_ADJACENCY | треугольники_смежности | геометрия |
GL_PATCHES | патчи | управление тесселяцией |
Ниже приведены примеры того, что можно получить с помощью точек, линий и треугольников.