- •Что такое OpenGl?
- •Первое знакомство с программой OpenGl
- •Синтаксис OpenGl
- •Конвейер визуализации OpenGl
- •Подготовка данных для отправки в OpenGl
- •Вершинные шейдеры
- •Мозаичные шейдеры
- •Наша первая программа: Подробное обсуждение Ввод main()
- •Запуск OpenGl
- •Распределение объектов буфера вершин
- •Инициализация вершинных и фрагментарных шейдеров
- •Наш первый рендеринг в OpenGl
- •Рисование в OpenGl
- •Включение и выключение команд в OpenGl
- •Шейдеры и OpenGl
- •Настраиваемый конвейер OpenGl
- •Обзор OpenGl Shading Language
- •Создание шейдера при помощи glsl Точка отправления
- •Задача переменных
- •Охват переменных
- •Инициализация переменных
- •Сложные типы
- •Получение доступа к элементам матриц и векторов
- •Структуры
- •Квалификаторы хранилищ
- •Заявления
- •Вычислительная инвариантность
- •Глобальные функции компиляции шейдеров
- •Блоки интерфейса
- •Унифицированные блоки
- •Указание унифицированных блоков в шейдере
- •Доступ к унифицированным блокам из приложения
- •Блоки In/Out
- •Компилирование шейдеров
- •Наша функция LoadShaders()
- •Подпрограммы шейдеров
- •Установка подпрограмм glsl
- •Раздельные объекты шейдеров
Синтаксис 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. От вас полностью зависит, какие шейдеры будут использованы, и что каждый из них будет делать. Но не все стадии абсолютно необходимы. Фактически, обязательны только вершинный и фрагментарный шейдеры. Мозаичный и геометрический шейдеры - опциональны.
Теперь давайте углубимся в каждую стадию по отдельность, чтобы разъяснить для вас некоторые важные моменты. Мы понимаем, что для начала обучения это может быть слегка чересчур, но пожалуйста потерпите: в конце концов понимание ключевых моментов облегчит для вас работу с программой в дальнейшем.
