Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ к ЛР_v0.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
587.09 Кб
Скачать

September 11, 2016

ver. 0.6.2

Предисловие

При изучении курса "Компьютерная геометрия и графика" студенты выполняют лабораторные работы, варианты которых приведены в данных методических указаниях.

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

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

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

Защита лабораторной работы состоит из двух частей: практической и теоретической. В практической части студент должен объяснить принципы работы представленных им программ, в теоретической – ответить на вопросы по теме лабораторной работы. При подготовке к защите студенту рекомендуется ответить на контрольные вопросы.

Лабораторная работа № 1. Знакомство с OpenGl с использованием кроссплатформенной библиотеки sdl

Цель работы – познакомиться с возможностями создания программ с использованием двумерной или трехмерной компьютерной графики на языках высокого уровня с помощью OpenGL и библиотеки SDL; научиться создавать простейшее приложение с поддержкой различных версий OpenGL.

Теоретические сведения

Simple DirectMedia Layer (сокращенно SDL) – свободная кроссплатформенная библиотека, предоставляющая единый интерфейс к графической подсистеме, устройствам ввода и звуковой подсистеме, официально поддерживающая операционные системы Mac OS X, Linux, Microsoft Windows, iOS и Android.

SDL написан на языке C и может использоваться программами на большом числе языков программирования с различными парадигмами, для многих из которых необходимые расширения предоставляются разработчиками библиотеки. Данная библиотека активно используется при написании кроссплатформенных мультимедийных приложений, в основном – компьютерных игр [1].

Общее представление о кроссплатформенной библиотеке SDL, понятия пикселя и цветовой модели RGB, дают учебные пособия А. Н. Гущина [1] и [Гущин А. Н. SDL2]. Далее будут рассматриваться только основные возможности SDL для работы с OpenGL.

Двумерная и трехмерная графика с помощью OpenGl

Open Graphics Library (сокращенно OpenGL) – спецификация, определяющая независимый от языка программирования платформонезависимый программный интерфейс (APIApplication Programming Interface) для написания приложений, использующих двумерную и / или трехмерную векторную графику. Включает множество функций для рисования сложных трехмерных сцен из простых примитивов.

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

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

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

Основным принципом работы OpenGL является получение наборов векторных графических примитивов в виде точек, линий и треугольников с последующей математической обработкой полученных данных и построением растровой картинки на экране и/или в памяти.

Векторные трансформации и растеризация выполняются графическим конвейером (graphics pipeline), который представляет собой дискретный автомат. Следовательно, абсолютное большинство команд OpenGL можно разделить на две группы: либо добавляющие графические примитивы на вход конвейера, либо конфигурирующие конвейер на различные виды трансформаций.

С точки зрения программирования, OpenGL является низкоуровневым процедурным API, что требует соблюдение точной последовательности шагов (инструкций), чтобы построить результирующую растровую графику, – в программировании такой подход называется императивным. Это является основным отличием от дескрипторных подходов (например, в DirectX), когда вся сцена передается в виде структуры данных (чаще всего дерева), которое обрабатывается и строится на экране.

С одной стороны, императивный подход требует глубокого знания и понимания законов трехмерной графики и математических моделей, а с другой стороны – предоставляет полную свободу действий в инновациях.

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

Каждый производитель имеет аббревиатуру, например, компания NVIDIA – аббревиатуру NV, которая используется при именовании новых функций (например, glCombinerParameterfvNV), а также констант – GL_NORMAL_MAP_NV. Если определенное расширение реализуют несколько производителей, то применяется аббревиатура EXT (например, glDeleteRenderbuffersEXT).

Со временем, если расширение получает широкое применение, оно стандартизируется консорциумом Architecture Review Board и приобретает аббревиатуру ARB (например, GL_ARB_vertex_buffer_object). Такое расширение имеет официальный статус и, в большинстве случаев, включается в одну из следующих спецификаций OpenGL.

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

Список зарегистрированных расширений можно найти в официальной базе расширений [3].

Начиная с OpenGL 3.0 появилась так называемая deprecation model. Часть старой функциональности, относящаяся к fixed function rendering, а также к рендерингу, основанному на функциях glBegin и glEnd, и многие другие устаревшие и неактуальные вещи, были объявлены как устаревшими (deprecated), и были, впоследствии, удалены из спецификации OpenGL 3.1. Это позволило сохранить основную спецификацию в актуальной и современной форме.

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

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

В рамках лабораторных работ по "компьютерной геометрии и графике" будут рассматриваться основные расширения OpenGL по работе со следующими технологиями:

    • vertex buffer objects (VBO);

    • vertex array objects (VAO);

    • shader and program objects.