Компьютерная графика. Рейтрейсинг и растеризация - Гэбриел Гамбетта - E-Book

Компьютерная графика. Рейтрейсинг и растеризация E-Book

Гэбриел Гамбетта

0,0

Beschreibung

За красивыми образами анимационного фильма и реалистичной средой популярных видеоигр скрываются загадочные алгоритмы. В этой книге вы познакомитесь с двумя основными направлениями современной графики: рейтресингом и растеризацией. Такая литература пугает новичков из-за большого количества математики. Но только не в этом случае. Познакомьтесь с 3D-рендерингом без длинных формул! Вы создадите полноценные рабочие рендеры — рейтрейсинг, симулирующий лучи света и их отражение от объектов, растеризатор 3D-моделей, научитесь создавать реалистичные отражения и тени, а также отрисовывать сцены с любой точки обзора. Наглядные примеры с псевдокодом позволят без проблем создавать рендеры на любом языке, а живые JavaScript-демо каждого алгоритма вдохновят на самостоятельные подвиги.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 199

Veröffentlichungsjahr: 2024

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Гэбриел Гамбетта
Компьютерная графика. Рейтрейсинг и растеризация
2022

Перевод с английского Д. Брайт

Научный редактор Д. Соколов

Литературный редактор Т. Сажина

Корректоры Е. Павлович, Н. Терех

Гэбриел Гамбетта

Компьютерная графика. Рейтрейсинг и растеризация. — СПб.: Питер, 2022.

ISBN 978-5-4461-1911-0

© ООО Издательство "Питер", 2022

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

Оглавление

Посвящение
Об авторе
О техническом редакторе
Благодарности
Введение
Для кого эта книга
Охват книги
Зачем читать эту книгу
Структура издания
И еще об авторе
От издательства
1. Вводные понятия
Холст
Глубина цвета и представление
Управление цветом
Сцена
Итоги главы
Часть I. Трассировка лучей
2. Базовая трассировка лучей
Рендеринг ландшафта Швеции
Основные допущения
С холста на окно просмотра
Трассировка лучей
Рендеринг первых сфер
Итоги главы
3. Свет
Упрощающие допущения
Источники света
Освещение одной точки
Диффузное отражение
Зеркальное отражение
Итоги главы
4. Тени и отражения
Тени
Отражения
Итоги главы
5. Расширение возможностей трассировщика лучей
Свободное расположение камеры
Улучшение производительности
Поддержка других примитивов
Конструктивная блочная геометрия
Прозрачность
Избыточная выборка
Итоги главы
Часть II. Растеризация
6. Прямые
Описание прямых
Рисование прямых
Рисование прямых с любым уклоном
Линейная интерполяция
Итоги главы
7. Закрашенные треугольники
Отрисовка каркасных треугольников
Отрисовка закрашенных треугольников
Итоги главы
8. Затененные треугольники
Определение задачи
Вычисление затенения краев
Вычисление внутреннего затенения
Итоги главы
9. Перспективная проекция
Базовые допущения
Поиск P'
Уравнение проекции
Свойства уравнения проекции
Проецирование первого 3D-объекта
Итоги главы
10. Описание и рендеринг сцены
Представление куба
Модели и экземпляры
Преобразование модели
Преобразование камеры
Матрицы преобразований
Однородные координаты
Возвращение к матрице преобразований
Итоги главы
11. Отсечение
Обзор процесса отсечения
Отсекаемый объем
Отсечение сцены по плоскости
Определение плоскостей отсечения
Отсечение объектов
Отсечение треугольников
Место отсечения в конвейере рендеринга
Итоги главы
12. Удаление скрытых поверхностей
Рендеринг сплошных объектов
Алгоритм художника
Буферизация глубины
Отбрасывание задней грани
Итоги главы
13. Затенение
Затенение и освещение
Плоское затенение
Затенение по Гуро
Затенение по Фонгу
Итоги главы
14. Текстуры
Закрашивание ящика
Билинейная фильтрация
MIP-текстурирование
Трилинейная фильтрация
Итоги главы
15. Расширение растеризатора
Карты нормалей
Наложение карты среды
Тени
Итоги главы
Послесловие
Приложение. Линейная алгебра
Точки
Векторы
Операции с точками и векторами
Матрицы
Рекомендуем прочитать

Посвящение

Посвящается моему отцу (1947–2007), архитектору и программисту-самоучке, направившему меня на этот путь.

Мой отец, двухлетний я и ZX81

Моя первая задокументированная программа, рисовавшая линии на экране ZX-Spectrum+, которую я написал в шесть с половиной лет

Об авторе

Габриэл Гамбетта (Gabriel Gambetta) в пять лет начал писать игры на ZX Spectrum. Изучив информатику и поработав в одной крупной организации на родине в Уругвае, он организовал свою компанию по разработке игр, которой руководил десять лет, параллельно преподавая компьютерную графику в университете. С 2011 года Габриэл работает в Google Zürich (за исключением периода, когда он был инженером лондонской компании Improbable, специализирующейся на многопользовательских играх, и одного года в Мадриде, где он осваивал актерское мастерство и киносъемку).

О техническом редакторе

Алехандро Сеговия Азапиан (Alejandro Segovia Azapian) — инженер ПО, уже 14 лет занимающийся компьютерной графикой. За это время он успел поработать в нескольких ведущих компаниях по созданию 3D-графики, включая Autodesk, Electronic Arts, PDI/DreamWorks и WB Games. Там Алехандро принимал участие в разных проектах по реализации графики в реальном времени, будь то приложения, игры, игровые движки или фреймворки. Сейчас он занимается разработкой программного обеспечения для GPU в ведущей компании по производству бытовой электроники в Купертино, штат Калифорния.

Благодарности

Книга, которую вы собираетесь прочесть, создавалась почти 20 лет. Она появилась благодаря стараниям многих людей.

• Омар Паганини (Omar Paganini) и Эрнесто Окампо Эдье (Ernesto Ocampo Edye). Будучи деканами инженерного факультета и факультета компьютерных наук в Католическом университете Уругвая, они доверили мне, студенту четвертого курса, руководство направлением компьютерной графики, позволив полностью переработать учебную программу по своему усмотрению. Весь первый год моего преподавания профессор Роберто Люблинерман (Roberto Lublinerman) был моим наставником.

• Мои студенты с 2003 по 2008 год. Они оказались невольными подопытными для оттачивания моего преподавательского мастерства, но это не мешало им принимать и уважать профессора, который был старше их всего на год (а в некоторых случаях даже младше). Я понимал, что все мои труды не напрасны, когда видел их сияющие от радости лица после создания первого изображения по принципу трассировки лучей.

• Алехандро Сеговия Азапиан. Он прошел путь от моего студента до ассистента. В итоге Алехандро стал моим близким другом, который время от времени помогал мне в проработке материалов книги. Я горжусь тем, что причастен к его становлению в качестве высококлассного специалиста по оптимизации производительности и рендерингу в реальном времени. Эта книга стала такой благодаря его технической редактуре.

• Дж. К. Ван Винкель (J. C. Van Winkel) проделал дополнительную редакторскую работу, внеся много ценных предложений по улучшению содержания.

• Читатели Hacker News. Мои заметки лекций, чертежи и демки размещались на первой полосе портала Hacker News. Этим интересовались многие, в том числе издательство No Starch Press. Благодаря этому счастливому стечению обстоятельств моя книга увидела свет.

• Билл Поллок (Bill Pollock), Алекс Фрид (Alex Freed), Кэсси Андреадис (Kassie Andreadis) и вся команда No Starch Press. Эти люди помогли довести до ума и переоформить мои, как мне казалось, готовые для публикации конспекты с чертежами в реальную книгу. Никогда бы не подумал, что это может потребовать стольких усилий. На обложке лишь мое имя, но нужно понимать, что книга стала продуктом коллективных стараний.

Введение

Компьютерная графика — удивительная тема. Представьте, как можно перейти от набора геометрических данных и нескольких алгоритмов к спецэффектам для «Звездных войн» и «Мстителей», «Историй игрушек» и «Холодного сердца» либо популярных игр вроде Fortnite или Call of Duty?

При этом область компьютерной графики еще и пугающе огромна: от рендеринга 3D-сцен до создания фильтров изображений, от цифровой типографии до симуляции систем частиц. Одной книги будет мало для раскрытия всех дисциплин, связанных с этой темой. Скорее, потребуется целая библиотека. Здесь же мы сосредоточимся только на рендеринге 3D-сцен.

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

Для кого эта книга

Она будет полезна как школьникам, так и матерым профессионалам. Работая над текстом, я сознательно склонялся в пользу простоты и ясности изложения. Вы увидите это по рассматриваемым идеям и алгоритмам. Везде, где достичь результата можно было несколькими путями, я предпочитал самый понятный, стараясь не усложнять рассуждения и не вносить путаницу. Ориентиром мне служила фраза Альберта Эйнштейна: «Делай просто, насколько это возможно, но не проще».

Здесь вам не пригодятся особые знания или программные и аппаратные зависимости. Единственный используемый в книге примитив — метод, позволяющий устанавливать цвет пикселя. Все максимально приближено к освоению материала с нуля.

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

Охват книги

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

Рис. В.1. Простая сцена, отрисованная трассировщиком лучей (слева) и растеризатором (справа), созданными по материалам этой книги

Возможности трассировщика лучей и растеризатора пересекаются, но не одинаковы. В дальнейшем мы рассмотрим их отличительные черты. Некоторые вы можете увидеть на рис. В.2.

Рис. В.2. И у трассировщика лучей, и у растеризатора есть характерные особенности. Слева: тени с трассировкой лучей и рекурсивные отражения. Справа: растеризованные текстуры

На протяжении книги приводятся неформальный псевдокод и ссылки на полноценные рабочие JavaScript-реализации, которые можно выполнять в любом браузере.

Зачем читать эту книгу

Вы получите знания, необходимые для написания программных модулей рендеринга. Здесь мы не будем использовать или изучать существующие API рендеринга: OpenGL, Vulkan, Metal или DirectX.

Современные графические ускорители мощны и общедоступны. Поэтому редко приходится писать чистый программный рендер, но такой навык будет полезен по ряду причин.

• Шейдеры и ПО. Первые GPU из начала 1990-х реализовывали свои алгоритмы рендеринга аппаратно. Их можно было использовать, но не изменять (именно поэтому большинство игр из середины 1990-х выглядят похоже). Сегодня разработчики пишут свои алгоритмы рендеринга (шейдеры), которые выполняются на специальных микросхемах GPU.

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

• Графика — это весело. Работа с графикой — одна из немногих областей компьютерных наук, где мы получаем быструю отдачу. Вы можете бесконечно радоваться, верно выполнив SQL-запрос. Но это ничто по сравнению с впечатлением от первого успеха в построении отражений по трассировке лучей. Несколько лет я преподавал в университете компьютерную графику и часто задавался вопросом, почему мне никак не надоест учить одному и тому же семестр за семестром. Но, когда я видел радостные лица студентов, которые ставили свои первые готовые сцены на заставки Рабочегостола, я понимал, что все это не напрасно.

Структура издания

Книга состоит из двух частей: «Трассировка лучей» и «Растеризация», соответствующих двум модулям рендеринга, которые мы будем создавать. В первой главе даются базовые знания. Лучше читать все главы поочередно, но обе части достаточно самостоятельны и для независимого изучения. Для большего удобства прочтите описание каждой главы.

• Глава 1. Вводные понятия. Здесь дается определение холсту и единственному инструменту для рисования — PutPixel. В этой же главе вы научитесь представлять цвета и управлять ими.

Часть I. Трассировка лучей

• Глава 2. Базовая трассировка лучей. Здесь мы создадим простой алгоритм трассировки лучей, способный отрисовывать несколько сфер, которые будут выглядеть как цветные круги.

• Глава 3. Свет. В этой главе мы определим модель взаимодействия света с объектами и расширим трассировщик возможностью симуляции света. Теперь сферы будут выглядеть как сферы.

• Глава 4. Тени и отражения. Дальше улучшаем внешний вид сфер: теперь они отбрасывают друг на друга тени и могут иметь зеркальные поверхности.

• Глава 5. Расширение возможностей трассировщика лучей. Здесь дается обзор дополнительных возможностей трассировщика, которые не вписываются в рамки книги, но по желанию их можно добавить.

Часть II. Растеризация

• Глава 6. Прямые. Начинаем с пустого холста и создаем алгоритм для рисования отрезков.

• Глава 7. Закрашенные треугольники. Используя некоторые идеи из предыдущей главы, мы разработаем алгоритм рисования треугольников, заполненных одним цветом.

• Глава 8. Затененные треугольники. Расширяем алгоритм из главы 7 для закрашивания треугольников плавным цветовым градиентом.

• Глава 9. Перспективная проекция. Здесь мы отвлечемся от 2D-рисования, чтобы рассмотреть геометрические и математические принципы для преобразования 3D-точки в 2D-точку, которую можно будет нарисовать на холсте.

• Глава 10. Описание и рендеринг сцены. Разрабатываем представление для объектов сцены и изучаем использование перспективной проекции для их отрисовки на холсте.

• Глава 11. Отсечение. Создаем алгоритм удаления невидимых для камеры частей сцены, позволяющий безопасно отрисовывать ее из любой позиции камеры.

• Глава 12. Удаление скрытых поверхностей. Совмещаем перспективную проекцию и затененные треугольники для рендеринга визуально твердых объектов. Выполнить задачу успешно можно, сделав так, чтобы удаленные объекты не перекрывали более близкие.

• Глава 13. Затенение. Учимся применять уравнение освещенности из главы 3 к целым треугольникам.

• Глава 14. Текстуры. Разрабатываем алгоритм для имитации деталей поверхности на наших треугольниках.

• Глава 15. Расширение растеризатора. Обзор возможностей для растеризатора, выходящих за рамки книги.

• Приложение. Линейная алгебра. Знакомимся с используемыми в книге базовыми понятиями из линейной алгебры: точками, векторами и матрицами. Рассматриваем операции, которые можно выполнять с этими элементами, и некоторые примеры их применения.

И еще об авторе

Сейчас я работаю ведущим инженером в Google. До этого же трудился в компании Improbable (http://improbable.com), у которой есть неплохие шансы создать настоящую матрицу (или в корне изменить разработку мультиплеерных игр). Около десяти лет я руководил собственной компанией по разработке компьютерных игр Mystery Studio (http://mysterystudio.com). За это время мы выпустили почти 20 игр, хотя вы о них наверняка даже не слышали.

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

У меня есть и другие увлечения, помимо компьютерной графики, в том числе не инженерного характера. Приглашаю посетить мой сайт http://gabrielgambetta.com, где есть много дополнительной информации и контактные данные для связи.

От издательства

Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение!

На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.

О научном редакторе русскоязычного издания

Дмитрий Соколов окончил мат-мех СПбГУ, хабилитированный доктор, доцент университета Лотарингии, руководитель небольшой научной группы PIXEL (https://pixel.inria.fr/). На платформе GitHub у него 2,6 тысячи подписчиков (https://github.com/ssloy), а его репозитории по компьютерной графике в сумме имеют двадцать тысяч звезд.