opengl язык шейдеров книга рецептов

OpenGL 4. Язык шейдеров. Книга рецептов

Скачать книгу

О книге «OpenGL 4. Язык шейдеров. Книга рецептов»

Язык шейдеров OpenGL (OpenGL Shading Language, GLSL) является фундаментальной основой программирования с использованием OpenGL. Его применение дает беспрецедентную гибкость и широту возможностей, позволяет использовать мощь графического процессора (GPU) для реализации улучшенных приемов отображения и даже для произвольных вычислений. Версия GLSL 4.x несет еще более широкие возможности, благодаря введению новых видов шейдеров: шейдеров тесселяции и вычислительных шейдеров. В этой книге рассматривается весь спектр приемов программирования на GLSL, начиная с базовых видов шейдеров – вершинных и фрагментных, – и заканчивая геометрическими, вычислительными и шейдерами тесселяции. Здесь приводится множество практических примеров – от наложения текстур, воспроизведения теней и обработки изображений до применения искажений и манипуляций системами частиц. Прочтя ее, вы сможете задействовать GPU для решения самых разных задач, даже тех, что никак не связаны с формированием изображений. Издание предназначено для программистов трехмерной графики, желающих задействовать в своих проектах всю мощь современных программных и аппаратных средств.

Произведение было опубликовано в 2013 году издательством ДМК-Пресс. На нашем сайте можно скачать книгу «OpenGL 4. Язык шейдеров. Книга рецептов» в формате pdf или читать онлайн. Рейтинг книги составляет 3 из 5. Здесь так же можно перед прочтением обратиться к отзывам читателей, уже знакомых с книгой, и узнать их мнение. В интернет-магазине нашего партнера вы можете купить и прочитать книгу в бумажном варианте.

Источник

Книги по OpenGL, которые стоит изучить

Подборка актуальных книг для изучения спецификации OpenGL на русском языке.

OpenGL. Профессиональное программирование 3D графики на C++. Сергей Гайдуков

opengl язык шейдеров книга рецептов. Смотреть фото opengl язык шейдеров книга рецептов. Смотреть картинку opengl язык шейдеров книга рецептов. Картинка про opengl язык шейдеров книга рецептов. Фото opengl язык шейдеров книга рецептов

Книга раскрывает все возможности графической библиотеки на языке C++. В ней описываются способы применения инструментов для создания трехмерных изображений. Книга содержит примеры и объяснения к ним.

Предназначена для опытных программистов.

Достоинства:

Недостатки:

OpenGL 4. Язык шейдеров. Книга рецептов. Дэвид Вольф

opengl язык шейдеров книга рецептов. Смотреть фото opengl язык шейдеров книга рецептов. Смотреть картинку opengl язык шейдеров книга рецептов. Картинка про opengl язык шейдеров книга рецептов. Фото opengl язык шейдеров книга рецептов

Язык шейдеров – это фундамент программирования на основе OpenGL. В книге описаны, как самые базовые шейдеры, так и более сложные шейдеры вычисления, геометрии и тесселяции.

Достоинства:

Недостатки:

Инструментальные средства программирования и отладки шейдеров. Станислав Горнаков

opengl язык шейдеров книга рецептов. Смотреть фото opengl язык шейдеров книга рецептов. Смотреть картинку opengl язык шейдеров книга рецептов. Картинка про opengl язык шейдеров книга рецептов. Фото opengl язык шейдеров книга рецептов

В книге автор рассматривает основные принципы DirectX. Предоставлена информация о том, как создавать и отлаживать шейдеры при помощи OpenGL.

Недостатки:

Расширения OpenGL. Алексей Боресков

opengl язык шейдеров книга рецептов. Смотреть фото opengl язык шейдеров книга рецептов. Смотреть картинку opengl язык шейдеров книга рецептов. Картинка про opengl язык шейдеров книга рецептов. Фото opengl язык шейдеров книга рецептов

В книге даны сведения о популярных расширениях OpenGL, их использование в системах Linux и Windows. Автор делится знаниями, как реализовывать большое количество эффектов, какие возможности ускорителей благодаря языку шейдера.

Книга имеет много примеров, задач, решения которых осуществляется при помощи OpenGL. Она полезна для программистов при написании игр, систем проектирования и визуализации.

Автор старался как можно доступнее объяснить материал, поэтому учебник OpenGL подойдет студентам, аспирантом и начинающим графическим разработчикам.

Достоинства:

Недостатки:

WebGL: программирование трехмерной графики. Коичи Мацуда, Роджер Ли

opengl язык шейдеров книга рецептов. Смотреть фото opengl язык шейдеров книга рецептов. Смотреть картинку opengl язык шейдеров книга рецептов. Картинка про opengl язык шейдеров книга рецептов. Фото opengl язык шейдеров книга рецептов

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

Издание создано для опытных программистов, которые хотят освоить 3-D графику в своих веб-разработках.

Достоинства:

Недостатки:

Выводы

Делитесь толковыми книгами по OpenGL не попавшими в эту подборку в комментариях!

Источник

Программирование шейдеров OpenGL

opengl язык шейдеров книга рецептов. Смотреть фото opengl язык шейдеров книга рецептов. Смотреть картинку opengl язык шейдеров книга рецептов. Картинка про opengl язык шейдеров книга рецептов. Фото opengl язык шейдеров книга рецептов

Приемы программирования на GLSL.

Дэвид Вольф «OpenGL 4. Язык шейдеров. Книга рецептов» ДМК Пресс, 2015 год, 368 стр. (32,3 мб. pdf)

Тема книги — язык программирования шейдеров OpenGL (OpenGL Shading Language, GLSL). Рассмотрены методы программирования на GLSL, как базовых видов шейдеров (вершинных, фрагментных), так и геометрических, вычислительных и шейдеров тесселяции (автоматизированный процесс замощения полигонами). С помощью геометрических шейдеров и шейдеров тесселяции можно выполнять геометрические построения, а с помощью вычислительных – произвольные вычисления на GPU. В книге приводится большое количество практических примеров: наложение текстур, создание теней и искажений, обработки изображений, создание, преобразование и управление системами частиц. Книга поможет понять основные концепции трехмерной графики и задействовать GPU в своих проектах, даже тех, что никак не связаны с формированием изображений. Издание предназначено для программистов знакомых с основами трехмерной графики и уже имеющих некоторый опыт программирования в OpenGL. ISBN: 978-5-97060-255-3

Глава. 1. Введение в GLSL 18
Использование загрузчика функций для доступа к новейшей функциональности OpenGL 21
Использование GLM для математических вычислений 25
Использование типов GLM для передачи данных в OpenGL 26
Определение версий GLSL и OpenGL 27
Компиляция шейдера 29
Компоновка шейдерной программы 33
Передача данных в шейдер с использованием вершинных атрибутов и вершинных буферных объектов 36
Получение списка активных атрибутов и их индексов 45
Передача данных в шейдер с использованием uniform-переменных 48
Получение списка активных uniform-переменных 51
Использование uniform-блоков и uniform-буферов 53
Получение отладочных сообщений 59
Создание класса C++, представляющего шейдерную программу 62
Рассеянное отражение с единственным точечным источником света 68

Глава. 2. Основы шейдеров GLSL 66
Фоновый, рассеянный и отраженный свет 73
Использование функций в шейдерах 80
Реализация двустороннего отображения 83
Реализация модели плоского затенения 87
Использование подпрограмм для выбора функциональности в шейдере 89
Отбрасывание фрагментов для получения эффекта решетчатой поверхности 94

Глава. 3. Освещение, затенение и оптимизация 98
Освещение несколькими точечными источниками света 98
Освещение источником направленного света 101
Пофрагментное вычисление освещенности для повышения реализма 104
Использование вектора полупути для повышения производительности 107
Имитация узконаправленных источников света 110
Придание изображению «мультяшного» вида 113
Имитация тумана 116
Настройка проверки глубины 119

Глава. 4. Текстуры 122
Наложение двухмерной текстуры 123
Наложение нескольких текстур 128
Использование карт прозрачности для удаления пикселей 131
Использование карт нормалей 134
Имитация отражения с помощью кубической текстуры 140
Имитация преломления с помощью кубической текстуры 147
Наложение проецируемой текстуры 152
Отображение в текстуру 157
Использование объектов-семплеров 162

Глава. 5. Обработка изображений и приемы работы с экранным пространством 165
Применение фильтра выделения границ 166
Применение фильтра размытия по Гауссу 172
Преобразование диапазона яркостей HDR с помощью тональной компрессии 179
Эффект размытости на границах ярких участков 184
Повышение качества изображения с помощью гамма-коррекции 189
Сглаживание множественной выборкой 192
Отложенное освещение и затенение 197
Реализация порядконезависимой прозрачности 203

Глава. 6. Использование геометрических шейдеров и шейдеров тесселяции 215
Отображение точечных спрайтов с помощью геометрического шейдера 220
Наложение каркаса на освещенную поверхность 225
Рисование линий силуэта с помощью геометрического шейдера 233
Тесселяция кривой 242
Тесселяция двухмерного прямоугольника 247
Тесселяция трехмерной поверхности 252
Тесселяция с учетом глубины 257

Глава. 7. Тени 261
Отображение теней с помощью карты теней 261
Сглаживание границ теней методом PCF 272
Смягчение границ теней методом случайной выборки 275
Создание теней с использованием приема теневых объемов и геометрического
шейдера 282

Глава. 8. Использование шума в шейдерах 291
Создание текстуры шума с использованием GLM 293
Создание бесшовной текстуры шума 296
Создание эффекта облаков 298
Создание эффекта текстуры древесины 300
Создание эффекта разрушения 303
Создание эффекта брызг краски 305
Создание эффекта изображения в приборе ночного видения 308

Глава. 9. Системы частиц и анимация 312
Анимация поверхности смещением вершин 313
Создание фонтана частиц 316
Создание системы частиц с использованием трансформации с обратной связью 322
Создание системы частиц клонированием 331
Имитация пламени с помощью частиц 334
Имитация дыма с помощью частиц 337

Глава. 10. Вычислительные шейдеры 340
Реализация системы частиц с помощью вычислительного шейдера 344
Имитация полотнища ткани с помощью вычислительного шейдера 348
Определение границ с помощью вычислительного шейдера 355
Создание фракталов с помощью вычислительного шейдера 360
Предметный указатель 364

Источник

OpenGL 4. Язык шейдеров. Книга рецептов

opengl язык шейдеров книга рецептов. Смотреть фото opengl язык шейдеров книга рецептов. Смотреть картинку opengl язык шейдеров книга рецептов. Картинка про opengl язык шейдеров книга рецептов. Фото opengl язык шейдеров книга рецептовopengl язык шейдеров книга рецептов. Смотреть фото opengl язык шейдеров книга рецептов. Смотреть картинку opengl язык шейдеров книга рецептов. Картинка про opengl язык шейдеров книга рецептов. Фото opengl язык шейдеров книга рецептов

Купить электронную книгу

Аннотация

Язык шейдеров OpenGL (OpenGL Shading Language, GLSL) является фундаментальной основой программирования с использованием OpenGL. Его применение дает беспрецедентную гибкость и широту возможностей, позволяет использовать мощь графического процессора (GPU) для реализации улучшенных приемов отображения и даже для произвольных вычислений. Версия GLSL 4.x несет еще более широкие возможности, благодаря введению новых видов шейдеров: шейдеров тесселяции и вычислительных шейдеров.

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

Издание предназначено для программистов трехмерной графики, желающих задействовать в своих проектах всю мощь современных программных и аппаратных средств.

Оплата

Наш интернет-магазин работает только по предоплате!
Мы принимаем следующие виды оплаты:

Вы так же можете выбрать оплату по платежной квитанции и оплатить по ней покупку в отделении любого банка.
Юридические лица могут выбрать счёт на оплату.
Возврат денежных средств возможен в случаях:

Возврат не проводится в случаях:

Для оформления возврата обращайтесь по электронной почте dmkpress.help@gmail.com.

Доставка:

Курьерская доставка по Москве в течение 7 дней после оплаты заказа.
Стоимость доставки:

Самовывоз возможен в течение суток после оплаты.
Адрес для самовывоза:
115487, г. Москва, проспект Андропова, 38
Доставка почтой России: от 7 до 28 дней с момента оплаты заказа.
Стоимость доставки:

Источник

learnopengl. Урок 1.5 — Shaders

opengl язык шейдеров книга рецептов. Смотреть фото opengl язык шейдеров книга рецептов. Смотреть картинку opengl язык шейдеров книга рецептов. Картинка про opengl язык шейдеров книга рецептов. Фото opengl язык шейдеров книга рецептовМы уже упоминали шейдеры в предыдущем уроке. Шейдеры — это небольшие программы выполняемые на графическом ускорителе (далее будем использовать более распространенное название — GPU). Эти программы выполняются для каждого конкретного участка графического конвейера. Если описывать шейдеры наиболее простым способом, то шейдеры — это не более чем программы преобразующие входы в выходы. Шейдеры обычно изолированы друг от друга, и не имеют механизмов коммуникации между собой кроме упомянутых выше входов и выходов.

В предыдущем уроке мы кратко коснулись темы “поверхностных шейдеров” и того, как их использовать. В данном уроке мы рассмотрим шейдеры подробнее и в частности шейдерный язык OpenGL (OpenGL Shading Language).

Шейдеры (как упоминалось выше, шейдеры — это программы) программируются на C подобном языке GLSL. Он адаптирован для использования в графике и предоставляет функции работы с векторами и матрицами.

Описание шейдера начинается с указания его версии, далее следуют списки входных и выходных переменных, глобальных переменных (ключевое слово uniform), функции main. Функции main является начальной точкой шейдера. Внутри этой функции можно производить манипуляции с входными данными, результат работы шейдера помещается в выходные переменные. Не обращайте внимания на ключевое слово uniform, к нему мы вернемся позднее.

Ниже представлена обобщенная структура шейдера:

Входные переменные вершинного шейдера называются вершинными атрибутами. Существует максимальное количество вершин, которое можно передать в шейдер, такое ограничение накладывается ограниченными возможностями аппаратного обеспечения. OpenGL гарантирует возможности передачи по крайней мере 16 4-х компонентных вершин, иначе говоря в шейдер можно передать как минимум 64 значения. Однако стоит учитывать, что существуют вычислительные устройства значительно поднимает эту планку. Так или иначе, узнать максимальное количество входных переменных-вершин, передаваемых в шейдер, можно узнать обратившись к атрибуту GL_MAX_VERTEX_ATTRIBS.

В результат выполнения данного кода, в результате мы увидим цифру >= 16.

GLSL, как и любой другой язык программирования, предоставляет определенный перечень типов переменных, к ним относятся следующие примитивные типы: int, float, double, uint, bool. Также GLSL предоставляет два типа-контейнера: vector и matrix.

Vector

Vector в GLSL — это контейнер, содержащий от 1 до 4 значений любого примитивного типа. Объявление контейнера vector может иметь следующий вид (n — это количество элементов вектора):

vecn (например vec4) — это стандартный vector, содержащий в себе n значений типа float
bvecn (например, bvec4) — это vector, содержащий в себе n значений типа boolean
ivecn (например, ivec4) — это vector, содержащий в себе n значений типа integer
uvecn (нарпример, uvecn) — это vector, содержащий в себе n значений типа unsigned integer
dvecn (например dvecn) — это vector, содержащий в себе n значений типа double.

В большинстве случаев будет использоваться стандартный vector vecn.

Для доступа к элементам контейнера vector мы будем использовать следующий синтаксис vec.x, vec.y, vec.z, vec.w (в данном случае мы обратились ко всем элементам по порядку, от первого к последнему). Также можно итерироваться по RGBA, если вектор описывает цвет, или stpq если вектор описывает координаты текстуры.

P.S. Допускается обращение к одному вектору через XYZW, RGBA, STPQ. Не нужно воспринимать данную заметку как руководство к действию, пожалуйста.

P.P.S. Вообще, никто не запрещает итерироваться по вектору при помощи индекса и оператора доступа по индексу []. https://en.wikibooks.org/wiki/GLSL_Programming/Vector_and_Matrix_Operations#Components

Из вектора, при обращении к данным через точку, можно получить не только одно значение, но и целый вектор, используя следующий синтаксис, который называется swizzling

Для создания нового вектора вы можете использовать до 4 литералов одного типа или вектор, правило только одно — в сумме нужно получить необходимое нам количество элементов, например: для создания вектора из 4 элементов мы можем использовать два вектора длиной в 2 элемента, или один вектор длиной в 3 элемента и один литерал. Также для создания вектор из n элементов допускается указание одного значения, в этом случае все элементы вектора примут это значение. Также допускается использование переменных примитивных типов.

Можно заметить, что вектор очень гибкий тип данных и его можно использовать в роли входных и выходных переменных.

In и out переменные

Мы знаем что шейдеры — это маленькие программы, но в большинстве случаев они являются частью чего-то большего, по этой причине в GLSL есть in и out переменные, позволяющие создать “интерфейс” шейдера, позволяющий получить данные для обработки и передать результаты вызывающей стороне. Таким образом каждый шейдер может определить для себя входные и выходные переменные используя ключевые слова in и out.

Вершинный шейдер был бы крайне неэффективным, если бы он не принимал никаких входных данных. Сам по себе это шейдер отличается от других шейдеров тем, что принимает входные значения напрямую из вершинных данных. Для того, чтобы указать OpenGL, как организованы аргументы, мы используем метаданные позиции, для того, чтобы мы могли настраивать атрибуты на CPU. Мы уже видели этот прием ранее: ‘layout (location = 0). Вершинных шейдер, в свою очередь, требует дополнительных спецификаций для того, чтобы мы могли связаться аргументы с вершинных данными.

Можно опустить layout (location = 0), и использовать вызов glGetAttributeLocation для получения расположения атрибутов вершин.

Еще одним исключением является то, что фрагментный шейдер (Fragment shader) должен иметь на выходе vec4, иначе говоря фрагментный шейдер должен предоставить в виде результата цвет в формате RGBA. Если этого не будет сделано, то объект будет отрисован черным или белым.

Таким образом, если перед нами стоит задача передачи информации от одного шейдера к другому, то необходимо определить в передающем шейдере out переменную такого типа как и у in переменной в принимающем шейдере. Таким образом, если типы и имена переменных будут одинаковы с обеих сторон, то OpenGL соединит эти переменные вместе, что даст нам возможность обмена информацией между шейдерами (это делается на этапе компоновки). Для демонстрации этого на практике мы изменим шейдеры из предыдущего урока, таким образом, чтобы вершинный шейдер предоставлял цвет для фрагментного шейдера.

Vertex shader

Fragment shader

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

opengl язык шейдеров книга рецептов. Смотреть фото opengl язык шейдеров книга рецептов. Смотреть картинку opengl язык шейдеров книга рецептов. Картинка про opengl язык шейдеров книга рецептов. Фото opengl язык шейдеров книга рецептов

Вот и все. Мы сделали так, что значение из вершинного шейдера было получено фрагментным шейдером. Дальше мы рассмотрим способ передачи информации шейдеру из нашего приложения.

Uniforms

Uniforms (будем называть их формами) — это еще один способ передачи информации от нашего приложения, работающего на CPU, к шейдеру, работающему на GPU. Формы немного отличаются от атрибутов вершин. Для начала: формы являются глобальными. Глобальная переменная для GLSL означает следующее: Глобальная переменная будет уникальной для каждой шейдерной программы, и доступ к ней есть у каждого шейдера на любом этапе в этой программе. Второе: значение формы сохраняется до тех пор, пока оно не будет сброшено или обновлено.

Для объявления формы в GLSL используется спецификатор переменной unifrom. После объявления формы его можно использовать в шейдере. Давайте посмотрим как установить цвет нашего треугольника с использованием формы:

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

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

На данный момент форма не содержит в себе полезных данных, т.к. мы их туда не поместили, так давайте же сделаем это. Для начала нам нужно узнать индекс, иначе говоря местоположение, нужного нам атрибута формы в нашем шейдере. Получив значение индекса атрибута мы сможем вместить туда необходимые данные. Чтобы наглядно продемонстрировать работоспособность этой функции мы будем менять цвет от времени:

Сначала мы получаем время работы в секундах вызвав glfwGetTime(). После мы изменяем значение от 0.0 до 1.0 используя функцию sin и записываем результат в переменную greenValue.

Так как OpenGL реализован с использованием языка C, в котором нет перегрузки функций, вызов функций с разными аргументами невозможен, но в OpenGL определены функции для каждого типа данных, которые определяются постфиксом функции. Ниже приведены некоторые постфиксы:

f: функция принимает float аргумент;
i: функция принимает int аргумент;
ui: функция принимает unsigned int аргумент;
3f: функция принимает три аргумента типа float;
fv: функция принимает в качестве аргумента вектор из float.

Таким образом, вместо использования перегруженных функций, мы должны использовать функцию, реализация которой предназначена для определенного набора аргументов, на что указывает постфикс функции. В приведенном выше примере мы использовали функцию glUniform…() специализированную для обработки 4 аргументов типа float, таким образом, полное имя функции было glUniform4f() (4f — четыре аргумента типа float).

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

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

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

Как вы уже заметили, формы — это очень удобный способ обмена данными между шейдером и вашей программой. Но что делать если мы хотим задать цвет для каждой вершины? Для этого мы должны объявить столько форм, сколько имеется вершин. Наиболее удачным решением будет использование атрибутов вершин, что мы сейчас и продемонстрируем.

Больше атрибутов богу атрибутов.

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

Теперь у нас есть много информации для передачи ее вершинному шейдеру, необходимо отредактировать шейдер так, чтобы он получал и вершины и цвета. Обратите внимание на то, что мы устанавливаем местоположения цвета в 1:

Сейчас нам не нужна форма ourColor, но выходной параметре ourColor нам пригодится для передачи значения фрагментному шейдеру:

Т.к. мы добавили новый вершинный параметр и обновили VBO память, нам нужно настроить указатели атрибутов вершин. Обновленные данные в памяти VBO выглядят следующим образом:

opengl язык шейдеров книга рецептов. Смотреть фото opengl язык шейдеров книга рецептов. Смотреть картинку opengl язык шейдеров книга рецептов. Картинка про opengl язык шейдеров книга рецептов. Фото opengl язык шейдеров книга рецептов

Зная текущую схему мы можем обновить формат вершин используя функцию glVertexAttribPointer:

Первые несколько атрибутов функции glVertexAttribPointer достаточно просты. В данном примере мы используем вершинный атрибут с позицией 1. Цвет состоит из трех значений типа флота и нам не нужна нормализация.

Т.к. теперь мы используем два атрибута шейдеров, то нам следует пересчитать шаг. Для доступа к следующему атрибуту шейдера (следующий x вектора вершин) нам нужно переместиться на 6 элементов float вправо, на 3 для вектора вершин и на 3 для вектора цвета. Т.е. мы переместимся 6 раз вправо, т.е. на 24 байта вправо.

Теперь мы разобрались со сдвигами. Первым идет вектор с координатами вершины. Вектор со значением цвета RGB идет после вектора с координатами, т.е. после 3 * sizeof(GLfloat) = 12 байт.

Запустив программу вы можете увидеть следующий результат:

opengl язык шейдеров книга рецептов. Смотреть фото opengl язык шейдеров книга рецептов. Смотреть картинку opengl язык шейдеров книга рецептов. Картинка про opengl язык шейдеров книга рецептов. Фото opengl язык шейдеров книга рецептов

Полный исходный код, творящий это чудо можно посмотреть тут:

Может показаться что результат не соответствует проделанной работе, ведь мы задали лишь три цвета, а не палитру, которую мы видим в результате. Такой результат дает фрагментная интерполяция фрагментного шейдера. При отрисовке треугольника, на этапе растеризации, получается намного больше областей, а не только вершины, которые мы используем в качестве аргументов шейдера. Растеризатор определяет позиции этих областей на основе их положения на полигоне. На основании этой позиции происходит интерполяция всех аргументов фрагментного шейдера. Предположим, мы имеем простую линию, с одного конца она зеленая, с другого она синяя. Если фрагментный шейдер обрабатывает область, которая находится примерно посередине, то цвет этой области будет подобран так, что зеленый будет равен 50% от цвета, используемого в линии, и, соответственно, синий будет равен 50% процентов от синего. Именно это и происходит на нашем треугольнике. Мы имеем три цвета, и три вершины, для каждой из которых установлен один из цветов. Если приглядеться, то можно увидеть, что красный, при переходе к синему, сначала становится фиолетовым, что вполне ожидаемо. Фрагментная интерполяция применяется ко всем атрибутам фрагментного шейдера.

ООП в массы! Делаем свой класс шейдера

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

Начнем разработку нашего класса с объявления его интерфейса и пропишем во вновь созданный заголовочник все необходимые include директивы. В результат получаем нечто подобное:

Давайте будем молодцами и будем использовать директивы ifndef и define, чтобы избежать рекурсивного выполнения директив include. Этот совет относится не к OpenGL, а к программированию на C++ в целом.

И так, наш класс будет хранить в себе свой идентификатор. Конструктор шейдера будет принимать в качестве аргументов указатели на массивы символов (иначе говоря текст, а в контексте класса, уместнее будет сказать — путь к файлу с исходным кодом нашего шейдера), содержащие путь к файлам, содержащим вершинный и фрагментный шейдеры, представленные обычным текстом. Также добавим утилитарную функцию Use, наглядно демонстрирующую преимущества использования классов-шейдеров.

Считывание файла шейдера. Для считывания будем использовать стандартные потоки C++, помещая результат в строки:

Теперь нам нужно скомпилировать и слинковать наш шейдер (давайте будем делать все хорошо, и сделаем функционал, сообщающей нам об ошибке при компиляции и линковки шейдера. Неожиданно, …но это очень полезно в процессе отладки):

Ну а вишенкой на торте будет реализация метода Use:

А вот и результат нашей работы:

В данном примере мы поместили наш вершинный шейдер в файл shader.vs, а фрагментный шейдер в файл shader.frag. В принципе, вы можете задать собственную конвенцию именования файлов, особой роли это не сыграет, но делайте это обдуманно, сохраняя семантику.

1. Модифицируйте вершинный шейдер так, чтобы в результате треугольник перевернулся: решение.

2. Передайте горизонтальное смещение с помощью формы и переместите треугольник к правой стороне окна с помощью вершинного шейдера: решение.

3. Передайте фрагментному шейдеру позицию вершины и установите значение цвета равное значению позиции (посмотрите, как позиция вершины интерполируется по всему треугольнику). После того, как сделаете это, постарайтесь ответить на вопрос, почему нижняя левая часть треугольника черная?: решение

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *