УДК 004’27OpenGL ES 3
ББК 32.972.121
Г49
Г49
Гинсбург, Дэн.
OpenGL ES 3.0 : руководство разработчика / Д. Гинсбург, Б. Пурномо ; пер. с англ.
А. Борескова. — 2-е изд., эл. — 1 файл pdf : 449 с. — Москва : ДМК Пресс, 2023. — Систем.
требования: Adobe Reader XI либо Adobe Digital Editions 4.5 ; экран 10". — Текст : электронный.
ISBN
978-5-89818-312-7
OpenGL ES — это ведущий интерфейс и графическая библиотека для рендеринга сложной
трехмерной графики на мобильных устройствах. Последняя версия, OpenGL ES 3.0, делает возможным
создания потрясающей графики для новых игр и приложений, не влияя на производительность
устройства и время работы аккумулятора.
В данной книге авторы рассматривает весь API и язык для написания шейдеров. Они внимательно
рассматривают возможности OpenGL ES такие как теневые карты, дублирование геометрии,
рендеринг в несколько текстур, uniform-буферы, сжатие текстур, бинарное представление программ
и преобразование обратной связи. Шаг за шагом вы перейдете от вводных примеров к продвинутому
попиксельному освещению и системам частиц. Также вы найдете содержательные советы по
оптимизации быстродействия, максимизации эффективности работы API и GPU и полном использовании
OpenGL ES в широком спектре приложений.
На сайте издательства выложены примеры к книге на языке С.
Издание предназначено программистам мобильных приложений, желающих максимально
использовать графические возможности своих устройств.
УДК 004’27OpenGL ES 3
ББК 32.972.121
Электронное издание на основе печатного издания: OpenGL ES 3.0 : руководство разработчика / Д. Гинсбург,
Б. Пурномо ; пер. с англ. А. Борескова. — Москва : ДМК Пресс, 2015. — 448 с. — ISBN 978-5-97060-256-0. —
Текст : непосредственный.
Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы
то ни было средствами без письменного разрешения владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических ошибок все равно
существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с
этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги.
В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами защиты авторских
прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации.
ISBN 978-5-89818-312-7
© 2014 Pearson Education, Inc.
© Оформление, перевод, ДМК Пресс, 2015
Стр.5
Содержание
Предисловие ......................................................... 14
Введение .............................................................. 15
Благодарности ....................................................... 20
Об авторах ............................................................ 22
Глава 1. Введение в OpenGL ES 3.0 ............................ 23
OpenGL ES 3.0 ...............................................................................................................................25
Вершинный шейдер .............................................................................................................26
Сборка примитивов .............................................................................................................28
Растеризация ..........................................................................................................................28
Фрагментный шейдер .........................................................................................................29
Пофрагментные операции .................................................................................................30
Что нового в OpenGL ES 3.0? ..................................................................................................32
Текстурирование ...................................................................................................................32
Шейдеры ..................................................................................................................................34
Геометрия .................................................................................................................................35
Буферные объекты ...............................................................................................................36
Фреймбуфер ...........................................................................................................................37
OpenGL ES 3.0 и обратная совместимость ..........................................................................37
EGL ...................................................................................................................................................38
Программирование с OpenGL ES 3.0 ............................................................................39
Библиотеки и заголовочные файлы ...............................................................................39
Синтаксис EGL .............................................................................................................................40
Синтаксис команд OpenGL ES ...............................................................................................40
Обработка ошибок .......................................................................................................................42
Основы управления состоянием ............................................................................................43
Дальнейшее чтение ......................................................................................................................44
Глава 2. Hello Triangle: пример использования
OpenGL ES 3.0 ........................................................ 45
Используемая библиотека ........................................................................................................45
Где можно скачать примеры .....................................................................................................46
Пример Hello Triangle.................................................................................................................46
Использование библиотеки утилит для OpenGL ES 3.0................................................50
Стр.6
6 Содержание
Создание простого вершинного и фрагментного шейдеров .........................................51
Компиляция и загрузка шейдеров .........................................................................................53
Создание объекта-программы и сборка шейдеров ...........................................................54
Задание области вывода и очистка буфера цвета .............................................................55
Загрузка геометрии и вывод примитива ..............................................................................56
Отображение буфера ..................................................................................................................56
Резюме .............................................................................................................................................57
Глава 3. Введение в EGL ........................................... 58
Взаимодействие с оконной системой ....................................................................................58
Проверка на ошибки ...................................................................................................................59
Инициализация EGL ..................................................................................................................60
Определение допустимых конфигураций поверхностей ...............................................60
Получение атрибутов EGLConfig ...........................................................................................61
Позволяем EGL выбрать конфигурацию ............................................................................64
Создание видимой области для рендеринга: окна EGL .................................................66
Создание внеэкранных областей для рендеринга: п-буферы EGL .............................68
Создание контекста для рендеринга .....................................................................................71
Делаем EGLContext текущим ..................................................................................................73
Собираем все вместе ...................................................................................................................73
Синхронизация рендеринга .....................................................................................................75
Резюме .............................................................................................................................................76
Глава 4. Шейдеры и программы ................................ 77
Шейдеры и программы ..............................................................................................................77
Создание и компилирование шейдера ..........................................................................78
Создание и сборка программы .........................................................................................81
Uniform-переменные и атрибуты ...........................................................................................85
Получение информации и задание значений для uniform-переменных ...........86
Uniform-буферы ....................................................................................................................92
Получение и задание атрибутов .....................................................................................96
Компилятор шейдеров ...............................................................................................................97
Бинарные программы .................................................................................................................97
Резюме .............................................................................................................................................98
Глава 5. Шейдерный язык OpenGL ES ......................... 99
Основы шейдерного языка OpenGL ES ...............................................................................99
Задание версии шейдера ......................................................................................................... 100
Переменные и типы переменных ........................................................................................ 100
Стр.7
Содержание 7
Конструкторы переменных ................................................................................................... 101
Векторные и матричные компоненты ................................................................................ 102
Константы .................................................................................................................................... 103
Структуры ................................................................................................................................... 104
Массивы ....................................................................................................................................... 104
Операторы ................................................................................................................................... 105
Функции....................................................................................................................................... 106
Встроенные функции............................................................................................................... 107
Управляющие операторы ....................................................................................................... 107
Uniform-переменные ................................................................................................................ 108
Uniform-блоки ............................................................................................................................ 109
Входные и выходные значения вершинного/фрагментного шейдера ................... 111
Описатели интерполяции ...................................................................................................... 113
Препроцессор и его команды ................................................................................................ 114
Упаковка uniform-переменных и интерполяторов ........................................................ 116
Описатели точности ................................................................................................................. 117
Инвариантность......................................................................................................................... 118
Резюме .......................................................................................................................................... 121
Глава 6. Атрибуты вершины, вершинные массивы
и объекты-буферы .................................................122
Задание данных для вершинных атрибутов .................................................................... 123
Постоянный вершинный атрибут ................................................................................ 123
Вершинные массивы ........................................................................................................ 123
Советы по оптимизации .................................................................................................. 127
Объявление переменных для вершинного атрибута в вершинном шейдере ....... 131
Привязка вершинного атрибута к переменной в шейдере .................................. 133
Вершинные объекты-буферы ............................................................................................... 136
Объект состояния вершинных буферов (Vertex Array Object) ................................ 145
Отображение буферов в память приложения ................................................................. 149
Сбрасывание отображенного буфера ......................................................................... 152
Копирование данных между буферами ............................................................................. 152
Резюме .......................................................................................................................................... 153
Глава 7. Сборка примитивов и растеризация ..............155
Примитивы .................................................................................................................................. 155
Треугольники ...................................................................................................................... 155
Отрезки ................................................................................................................................. 156
Точечные спрайты ............................................................................................................. 157
Стр.8
8 Введение
Вывод примитивов ................................................................................................................... 159
Перезапуск примитива .................................................................................................... 161
Провоцирующая вершина (provoking vertex) ......................................................... 162
Дублирование геометрии (geometry instancing) ..................................................... 162
Советы по оптимизации .................................................................................................. 165
Сборка примитивов .................................................................................................................. 167
Системы координат .......................................................................................................... 168
Отсечение ............................................................................................................................. 168
Перспективное деление ................................................................................................... 170
Преобразование в область видимости ........................................................................ 170
Растеризация .............................................................................................................................. 171
Отсечение ............................................................................................................................. 171
Смещение полигона .......................................................................................................... 173
Запросы видимости .................................................................................................................. 175
Резюме .......................................................................................................................................... 177
Глава 8. Вершинные шейдеры .................................178
Обзор вершинного шейдера .................................................................................................. 179
Встроенные переменные вершинного шейдера ...................................................... 180
Встроенные специальные переменные ...................................................................... 180
Встроенные uniform-переменные, хранящие состояние ...................................... 181
Встроенные константы .................................................................................................... 181
Описатели точности ......................................................................................................... 182
Ограничения на использование uniform-переменных в вершинном
шейдере ................................................................................................................................. 183
Примеры вершинных шейдеров .......................................................................................... 186
Матричные преобразования .......................................................................................... 186
Модельно-видовая матрица ........................................................................................... 187
Матрица проектирования ............................................................................................... 188
Расчет освещения в вершинном шейдере ................................................................. 188
Генерация текстурных координат ....................................................................................... 194
Вершинный скиннинг ............................................................................................................. 195
Преобразование обратной связи (transform feedback) ................................................. 200
Вершинные текстуры............................................................................................................... 202
Вершинный конвейер OpenGL ES 1.1 как вершинный шейдер
OpenGL ES 3.0 ............................................................................................................................ 203
Резюме .......................................................................................................................................... 210
Глава 9. Текстурирование ........................................211
Основы текстурирования ....................................................................................................... 211
Стр.9
Содержание 9
Двухмерные текстуры ...................................................................................................... 211
Кубические текстурные карты ...................................................................................... 213
Трехмерные текстуры ....................................................................................................... 214
Массив двухмерных текстур ......................................................................................... 214
Текстурные объекты и загрузка текстур .................................................................... 215
Фильтрование текстуры и пирамидальное фильтрование ................................. 220
Бесшовная фильтрация кубических текстур ........................................................... 224
Автоматическое построение пирамиды изображений ......................................... 224
Отсечение текстурных координат ............................................................................... 225
Перестановки каналов ..................................................................................................... 227
Текстурный уровень детализации ............................................................................... 227
Сравнение для текстуры глубины (Percentage Closest Filtering, PCF) .......... 228
Форматы текстур ............................................................................................................... 228
Нормализованные текстурные форматы .................................................................. 229
Форматы текстур с плавающей точкой ..................................................................... 230
Целочисленные текстурные форматы ........................................................................ 231
Форматы текстур с общей экспонентой .................................................................... 232
Текстурные форматы sRGB ........................................................................................... 233
Форматы для текстур глубины ..................................................................................... 234
Использование текстур в шейдере .............................................................................. 234
Пример использования кубической текстуры ........................................................ 237
Загрузка трехмерных текстур и массивов двухмерных текстур ....................... 239
Сжатые текстуры....................................................................................................................... 240
Задание части изображения текстуры ............................................................................... 243
Копирование текстурных данных из буфера цвета ...................................................... 246
Объекты-сэмплеры ................................................................................................................... 249
Неизменяемые текстуры ........................................................................................................ 252
Распаковка объектов-буферов.............................................................................................. 253
Резюме .......................................................................................................................................... 254
Глава 10. Фрагментные шейдеры .............................255
Пример реализации фиксированного конвейера .......................................................... 256
Обзор фрагментного шейдера .............................................................................................. 257
Встроенные специальные переменные ...................................................................... 258
Встроенные константы .................................................................................................... 259
Описатели точности ......................................................................................................... 260
Реализация алгоритмов из фиксированного конвейера при помощи
шейдеров ...................................................................................................................................... 260
Мультитекстурирование ................................................................................................. 261
Туман ...................................................................................................................................... 262
Стр.10
10 Содержание
Альфа-тест (с использованием discard) ..................................................................... 265
Задаваемые пользователем плоскости отсечения .................................................. 267
Резюме .......................................................................................................................................... 269
Глава 11. Операции с фрагментами ..........................270
Буферы ......................................................................................................................................... 270
Запрос дополнительных буферов ............................................................................... 271
Очистка буферов ............................................................................................................... 272
Использование масок для управления записью во фреймбуферы .................. 273
Тесты фрагментов и операции .............................................................................................. 275
Использование теста попадания в прямоугольник (scissor test) ...................... 275
Тесты трафарета ................................................................................................................. 276
Тесты глубины .................................................................................................................... 281
Смешение цветов (альфа-блендинг) .................................................................................. 282
Растрирование ............................................................................................................................ 284
Антиалиасинг с использованием мультисэмплинга ..................................................... 284
Использование спецификатора centroid ................................................................... 285
Чтение и запись пикселов во фреймбуфер ...................................................................... 286
Объекты-буферы для упаковки пикселов ................................................................ 289
Рендеринг в несколько буферов цвета (MRT) ............................................................... 290
Резюме .......................................................................................................................................... 293
Глава 12. Объекты-фреймбуферы ............................294
Зачем нужны объекты-фреймбуферы? ............................................................................. 294
Объекты-фреймбуферы и рендербуферы ....................................................................... 296
Выбор между рендербуфером и текстурой в качестве подключения
к фреймбуферу ................................................................................................................... 296
Сравнение объектов-фреймбуферов с поверхностями EGL .............................. 297
Создание объектов-фреймбуферов и рендербуферов.................................................. 298
Использование рендербуферов ............................................................................................ 298
Рендербуферы с мультисэмплингом........................................................................... 300
Форматы рендербуфера .................................................................................................. 301
Использование объектов-фреймбуферов ......................................................................... 302
Подключение рендербуфера к точке подключения фреймбуфера .................. 303
Подключение двухмерной текстуры к фреймбуферу........................................... 304
Подключение слоя трехмерной текстуры к фреймбуферу ................................. 305
Проверка полноты фреймбуфера ................................................................................ 306
Копирование между фреймбуферами ............................................................................... 307
Сообщение о том, что содержимое фреймбуфера больше не нужно ...................... 309
Стр.11
Содержание 11
Уничтожение фреймбуферов и рендербуферов ............................................................. 310
Уничтожение рендербуферов, которые используются как подключение
к фреймбуферу ................................................................................................................... 311
Чтение пикселов и объекты-фреймбуферы ............................................................. 311
Примеры ....................................................................................................................................... 312
Подсказки по оптимизации ................................................................................................... 318
Резюме .......................................................................................................................................... 318
Глава 13. Объекты синхронизации и барьеры .............320
Команды glFlush и glFinish .................................................................................................... 320
Зачем использовать объект синхронизации .................................................................... 321
Создание и уничтожение объекта синхронизации........................................................ 321
Ожидание объекта синхронизации..................................................................................... 322
Пример .......................................................................................................................................... 323
Резюме .......................................................................................................................................... 324
Глава 14. Продвинутое программирование
с OpenGL ES 3.0 .....................................................325
Пофрагментное освещение .................................................................................................... 325
Освещение с использованием карты нормалей ...................................................... 326
Шейдеры для освещения ................................................................................................ 327
Уравнения освещения ..................................................................................................... 331
Имитация отражения окружающей среды (environment mapping) ........................ 331
Система частиц при помощи точечных спрайтов .................................................. 335
Настройка системы частиц ............................................................................................ 335
Вершинный шейдер для системы частиц .................................................................. 336
Фрагментный шейдер для системы частиц ............................................................. 338
Системы частиц с использованием преобразования обратной связи .................... 340
Алгоритм рендеринга системы частиц ....................................................................... 341
Создание частиц при помощи преобразования обратной связи ....................... 342
Рендеринг частиц ............................................................................................................... 346
Постобработка изображений ................................................................................................ 347
Настройка рендеринга в текстуру ............................................................................... 348
Фрагментный шейдер размытия .................................................................................. 348
Эффект свечения ............................................................................................................... 349
Проективное текстурирование ............................................................................................. 351
Основы проективного текстурирования ................................................................... 351
Матрицы для проективного текстурирования ........................................................ 352
Шейдеры проективного источника света ................................................................. 354
Стр.12
12 Содержание
Шум при помощи трехмерной текстуры .......................................................................... 357
Получение шума ................................................................................................................ 357
Использование шума ........................................................................................................ 361
Процедурное текстурирование ............................................................................................ 363
Пример процедурной текстуры .................................................................................... 364
Антиалиасинг процедурных текстур .......................................................................... 367
Дополнительная литература по процедурным текстурам .................................. 369
Рендеринг ландшафта при помощи чтения из текстуры в вершинном
шейдере ......................................................................................................................................... 370
Вычисление нормали в вершине и чтение значения высоты
в вершинном шейдере ...................................................................................................... 371
Дополнительное чтение по рендерингу больших ландшафтов ......................... 372
Рендеринг теней при помощи карты глубины ................................................................ 373
Рендеринг из положения источника света в текстуру глубины ....................... 373
Рендеринг из положения наблюдателя с использованием текстуры
глубины ................................................................................................................................. 376
Резюме .......................................................................................................................................... 378
Глава 15. Получение состояния ................................379
Запросы строковых значений о реализации OpenGL ES 3.0 ..................................... 379
Получение информации о зависящих от реализации ограничениях ..................... 380
Запрос состояния OpenGL ES .............................................................................................. 383
Пожелания (hints) .................................................................................................................... 387
Запросы по идентификаторам .............................................................................................. 387
Управление непрограммируемыми операциями и запрос их состояния .............. 388
Получение состояния шейдеров и программ .................................................................. 389
Получение информации о вершинных атрибутах ......................................................... 391
Получение состояния текстуры ........................................................................................... 391
Получение состояния сэмплера ........................................................................................... 392
Получение информации об асинхронном объекте-запросе (query) ....................... 392
Получение информации об объекте синхронизации ................................................... 393
Получение информации о вершинном буфере ............................................................... 394
Получение информации о рендербуфере и фреймбуфере ......................................... 394
Резюме .......................................................................................................................................... 396
Глава 16. Платформы OpenGL ES ..............................397
Сборка для Microsoft Windows с использованием Visual Studio ............................. 397
Сборка для Ubuntu Linux ....................................................................................................... 399
Сборка для Android 4.3+ NDK (C++) ................................................................................ 400
Стр.13
Содержание 13
Пререквизиты ..................................................................................................................... 400
Сборка примеров при помощи Android NDK .......................................................... 401
Сборка на Android 4.3+ SDK (Java) ................................................................................... 401
Сборка для iOS 7 ....................................................................................................................... 402
Пререквизиты ..................................................................................................................... 402
Сборка примеров при помощи XCode 5 .................................................................... 402
Резюме .......................................................................................................................................... 404
Приложение А. GL_HALF_FLOAT ................................405
16-битовое число с плавающей точкой.............................................................................. 405
Преобразование значения с плавающей точкой в 16-битовое значение
с плавающей точкой ................................................................................................................. 406
Приложение Б. Встроенные функции ........................410
Функции для работы с углами и тригонометрические функции ............................ 411
Экспоненциальные функции ................................................................................................ 412
Общие функции ....................................................................................................................... 412
Функции для упаковки и распаковки значений с плавающей точкой .................. 414
Геометрические функции ....................................................................................................... 416
Матричные функции ............................................................................................................... 416
Векторные логические функции ......................................................................................... 417
Функции обращения к текстуре .......................................................................................... 418
Функции по обработке фрагментов ................................................................................... 422
Приложение В. Описание библиотеки,
использованной в данной книге ...............................424
Базовые функции ...................................................................................................................... 424
Функции для преобразований ............................................................................................. 428
Стр.14