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

Синтаксис OpenGl

Как вы возможно уже могли заметить, все команды в OpenGL начинаются с “gl” и состоят из одного или более слов с заглавной буквы без пробелов для обозначения выполняемой функции. Например, glBindVertexArray(). Все команды в OpenGL выглядят так. В программе вы также видели функции, начинающиеся на “glut”, которые входят в OpenGL Utility Toolkit (GLUT), библиотеку данных, написанную Марком Дж. Килгардом. Это популярный меж-платформный пакет для открытия окон и обработки ввода данных, помимо прочего. Мы использовали версию GLUT под названием “Freeglut”, изначально написанную Pawel W. Olszta и дополненную Андреасом Умбахом и Стивом Бэйкером (который продолжает работу с библиотекой на данный момент). Это современный вариант оригинальной библиотеки. Также вы можете заметить одну функцию “glewInit()”, которая была взята из библиотеки OpenGL Extension Wrangler, написанной Миланом Икитсом и Марцело Магайоном. Подробнее об этих двух библиотеках написано в Appendix X.

Согласно принятым в OpenGL наименованием функций, постоянные вроде GL_COLOR_BUFFER_BIT, которая встречалась вам в diplay(), предназначены для библиотек OpenGL. Все постоянные начинающиеся с GL_ используют нижнее подчеркивание для разделения слов. Их опдеделители только #defines, которые можно найти в файлах заголовков OpenGL: glcorearb.h и glext.h.

Для облегчения задачи переноса приложения на OpenGL на другие операционные системы, OpenGL также определяет разные виды данных по их функциям. Как например, GLfloat это данные чисел с плавающей запятой, используемые в определении вершин (vertices) в примере 1.1. OpenGL задает типы всем видам данных, которые применимы в программе. Они пречислины в Таблице 1.1. Кроме того, так как OpenGL пользуется языком “С”, нам не приходится говорить от перегрузке данных. Программа использует условное наименование данных для организации множества функций, в зависимости от ситуации. Например в Главе 2, “Основные понятия о шейдерах”, мы столкнемся с функцией glUniform*(), которая также может выглядить как glUniform2f() или glUniform3fv(). Приставки в конце “ядра” названия функции указывают независимые переменные. Например, “2” в glUniform2f() указывает, что два числовых значения будут переданы фукции (есть и другие параметры, но они одинаковы для всез 24 разновидностей glUniform*(); мы используем * для обозначения общего вида функции). Также обратите внимание на “f”после “2”. Это указывает, что эти два числовых параметра - порядка GLfloat. Наконец, некоторые версии функции glUniform*() заканчиваются на “v” - это означает вектор (vector). Таким образом в glUniform2fv() 2 цифровых значения с плавающей запятой проходят как одномерная полоса GLfloat, а не 2 раздельных параметра.

Для распознавания всех этих параметров, все буквы используемые как приставки перечислены в таблице 1.1, вместе с типами данных.

[таб. 1.1 Командные приставки и типы данных независимых переменных]

примечание:

Конвейер визуализации OpenGl

В OpenGL используется так называемый конвейер визуализации, то есть последовательность обработки предоставляемых OpenGL вашей программой данных, которые преобразуются в конечную картинку. Диаграмма 1.2 показывает порядок функционирования конвейра визуализации, который используется в версии 4.3. Конвейр визуализации OpenGL сильно развился со времен изобретения.

----

Диаграмма 1.2

----

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

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

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