УДК 004'27OpenGL ES 3
ББК 32.972.121
Г49
Г49 OpenGL ES 3.0. Руководство разработчика / пер. с англ. А. Борескова. – М.:
ДМК Пресс, 2015. – 448 с.: ил.
Гинсбург Д., Пурномо Б.
ISBN 978-5-97060-256-0
OpenGL ES – это ведущий интерфейс и графическая библиотека для рендеринга сложной трехмерной
графики на мобильных устройствах. Последняя версия, OpenGL ES 3.0, делает возможным
создания потрясающей графики для новых игр и приложений, не влияя на производительность
устройства и время работы аккумулятора.
В данной книге авторы рассматривает весь API и язык для написания шейдеров. Они внимательно
рассматривают возможности OpenGL ES такие как теневые карты, дублирование геометрии,
рендеринг в несколько текстур, uniform-буферы, сжатие текстур, бинарное представление программ
и преобразование обратной связи. Шаг за шагом вы перейдете от вводных примеров к продвинутому
попиксельному освещению и системам частиц. Также вы найдете содержательные советы
по оптимизации быстродействия, максимизации эффективности работы API и GPU и полном
использовании OpenGL ES в широком спектре приложений.
На сайте издательства www.dmkpress.com выложены примеры к книге на языке С.
Издание предназначено программистам мобильных приложений, желающих максимально
использовать графические возможности своих устройств.
УДК 004'27OpenGL ES 3
ББК 32.972.121
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any
Все права защищены. Любая часть этой книги не может быть воспроизведена в какой
means, electronic or mechanical, including photocopying, recording or by any information storage
retrieval system, without permission from Pearson Education, Inc. RUSSIAN language edition
published by DMK PUBLISHERS. Copyright © 2015.
бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев
авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность
технических ошибок все равно существует, издательство не может гарантировать абсолютную
точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности
за возможные ошибки, связанные с использованием книги.
ISBN 978-0-321-93388-1 (анг.)
ISBN 978-5-97060-256-0 (рус.
Copyright © 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