- •Что такое OpenGl?
- •Первое знакомство с программой OpenGl
- •Синтаксис OpenGl
- •Конвейер визуализации OpenGl
- •Подготовка данных для отправки в OpenGl
- •Вершинные шейдеры
- •Мозаичные шейдеры
- •Наша первая программа: Подробное обсуждение Ввод main()
- •Запуск OpenGl
- •Распределение объектов буфера вершин
- •Инициализация вершинных и фрагментарных шейдеров
- •Наш первый рендеринг в OpenGl
- •Рисование в OpenGl
- •Включение и выключение команд в OpenGl
- •Шейдеры и OpenGl
- •Настраиваемый конвейер OpenGl
- •Обзор OpenGl Shading Language
- •Создание шейдера при помощи glsl Точка отправления
- •Задача переменных
- •Охват переменных
- •Инициализация переменных
- •Сложные типы
- •Получение доступа к элементам матриц и векторов
- •Структуры
- •Квалификаторы хранилищ
- •Заявления
- •Вычислительная инвариантность
- •Глобальные функции компиляции шейдеров
- •Блоки интерфейса
- •Унифицированные блоки
- •Указание унифицированных блоков в шейдере
- •Доступ к унифицированным блокам из приложения
- •Блоки In/Out
- •Компилирование шейдеров
- •Наша функция LoadShaders()
- •Подпрограммы шейдеров
- •Установка подпрограмм glsl
- •Раздельные объекты шейдеров
Первое знакомство с программой OpenGl
Поскольку в OpenGL можно делать огромное количество вещей, программа может оказаться большой и сложной. Однако, базовая структура всех приложений на OpenGL схожа со следующим:
Инициализация “состояния” связанная с рендерингом объектов;
Указать, к каким объектам применять рендеринг.
Перед тем, как вы приступите к кодированию, давайте рассмотрим некоторые распространенные термины из области графики. Рендеринг, о котором мы уже говорили ранее, это процесс создания компьютером изображения по модели. OpenGL лишь один из примеров программ рендеринга - есть много других. OpenGL основывается на растрезации, но есть и другие методы создания изображения, например, трассировка лучей, о которой в данной книге мы не можем подробно говорить ввиду объема темы. Однако же, даже система использующая трассировку лучей может использовать OpenGL для отображения изображения, или для вычисления данных для его создания.
Наши с вами модели, или объекты (эти термины взаимозаменяемы), состоят из геометрических примитивов - точек, линий, треугольников, - определяемы их вершинами.
Еще один важный для работы с OpenGL термин - это “шейдеры”, особые функции, выполняемые графических оборудованием. Проще всего понять, что такое шейдер, если представить его как микро-программу, специально созданную для графического процессора (GPU, как его еще называют). В OpenGL входят все составляющие для создания из шейдеров кода, исполняемого GPU. OpenGL использует четыре стадии применения шейдеров. Наиболее распространенные - вершинные шейдеры, которые работают с вершинами многогранников, и фрагментарные шейдеры, работающие с фрагментами генерированными при растрезации. Оба вида шейдеров необходимы для работы каждой программы на OpenGL.
Конечное изображение состоит из пиксилей выведенных на экран. Пиксел - это самая маленькая видимая на дисплее точка. Каждый пиксель в вашей системе хранится в кадровом буфере, который представляет из себя кусок памяти, отведенный для использования графическим оборудованием, оттуда выводятся данные на ваш экран.
На диаграмме 1.1 изображен вывод данных простой программы на OpenGL
[диаграмма до стр. 7]
Возможно, это больше данных кодировки, чем вы ожидали, но это самая базовая программа написанная в OpenGL. Мы используем некоторые невходящие в основной пакет OpenGL библиотеки, чтобы облегчить такие моменты работы, как создание окна, приём данных с клавиатуры и мыши, другими словами то, что не включено непосредственно в OpenGL. Мы также прописали некоторые вспомогательные функции и небольшие классы С++ для облегчения наших примеров. И хотя OpenGL пользуется библиотеками языка “С”, все наши примеры на С++, но на элементарном С++. Проще говоря, С++ мы используем лишь для ввода математических показателей, векторов и матриц.
По сути, вот что делает программа из диаграммы 1.1 (в подробностях мы её рассмотрим позже, не волнуйтесь):
В вводную часть программы мы включили соответствующие файлы заголовков, и глобальные переменные1 и другие полезные программные составляющие;
Процедура инициализации init() нужна для загрузки данных, которые будет в дальнейшем использовать программа, например вершинные данные для рендеринга примитивов, или графические данные, используемые при наложении текстур, о которых подробнее см. Главу 6;
В этой версии init(), мы сначала указываем положение для двух треугольников, которые мы подвергнем рендерингу. После указываем шейдеры, которые далжна будет применить программа. Секция LoadShaders() была написана нами заранее для облегчения процесса загрузки шейдеров GPU. В Главе 2 мы подробно обсудим, что для этого нужно сделать.
В финальной части init() происходит то, что ты назовём трубопроводом шейдеров, где прописывается связь данных в вашем приложении с переменными программ шейдеров. Об этом тоже подробнее читайте в Главе 2.
Процедура отображения display(). Вот где действительно происходит рендеринг. То есть, эта часть указывает OpenGL какие функции использовать для рендеринга. Почти все процедуры display() выполняют следующие три стадии как и наша простая программа:
Очищают окно посредством команды glClear().
Отдает команду OpenGL для рендеринга указанных вами объектов.
Отдает команду отображения на экране.
И наконец, main() выполняет функцию создания окна и запуска раздела init(), и наконец, запуска цикла событий. Здесь вы также можете увидеть функции с “gl”, но отличающиеся от других похожих функций в приложении. О них мы поговорим уже скоро, а используем мы их для облегчения написания программ в OpenGL на разных операционных системах: GLUT и GLEW.
Перед тем как вдаться в подробности процедур, давайте рассмотрим функции ярлыков OpenGL, постоянных и других полезных программных составляющих.
