автордың кітабын онлайн тегін оқу Компьютерная графика. Рейтрейсинг и растеризация
Перевод с английского Д. Брайт
Научный редактор Д. Соколов
Литературный редактор Т. Сажина
Корректоры Е. Павлович, Н. Терех
Гэбриел Гамбетта
Компьютерная графика. Рейтрейсинг и растеризация. — СПб.: Питер, 2022.
ISBN 978-5-4461-1911-0
© ООО Издательство "Питер", 2022
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Посвящение
Посвящается моему отцу (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, где есть много дополнительной информации и контактные данные для связи.
От издательства
Ваши замечания, предложения, вопросы отправляйте по адресу comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.
О научном редакторе русскоязычного издания
Дмитрий Соколов окончил мат-мех СПбГУ, хабилитированный доктор, доцент университета Лотарингии, руководитель небольшой научной группы PIXEL (https://pixel.inria.fr/). На платформе GitHub у него 2,6 тысячи подписчиков (https://github.com/ssloy), а его репозитории по компьютерной графике в сумме имеют двадцать тысяч звезд.
1. Вводные понятия
Трассировщик лучей и растеризатор реализуют рендеринг 3D-сцены на 2D-поверхности по-разному. Но у обоих подходов есть несколько базовых общих принципов.
В этой главе мы познакомимся с холстом для отрисовки изображений и системой координат, с помощью которой будем ссылаться на пиксели холста. Еще мы научимся представлять цвета и управлять ими, а также описывать 3D-сцену для ее обработки модулями рендеринга.
Холст
Мы будем рисовать на холсте — прямоугольном массиве пикселей, которые могут закрашиваться независимо. В нашем случае неважно, на экране холст или на бумаге. Нам нужно будет представлять 3D-сцену на 2D-холсте, поэтому рендеринг мы будем делать на этом абстрактном прямоугольном массиве пикселей.
Все реализации в этой книге будут строиться на основе одной простой функции, присваивающей цвет пикселю холста:
canvas.PutPixel(x, y, color)
В этом методе находится три аргумента: координата x, координата y и цвет. Начнем с координат.
Система координат
У холста есть измеряемые в пикселях ширина и высота, которые мы назовем Cw и Ch. Для обращения к этим пикселям нужна система координат. На большинстве компьютерных экранов исходная точка отсчета будет в верхнем левом углу. При этом x возрастает вправо, а y — вниз, как показано на рис. 1.1.
Рис. 1.1. Система координат, используемая на большинстве компьютерных экранов
Эта система координат естественна для компьютера, так как опирается на принцип организации видеопамяти, но не очень удобна для людей. Вместо этого программисты 3D-графики используют систему координат для рисования графиков на бумаге: исходная точка находится в центре, x возрастает вправо и уменьшается влево, а y возрастает вверх и уменьшается вниз, как показано на рис. 1.2.
Рис. 1.2. Система координат, которую мы будем использовать для холста
При использовании этой системы координат диапазон x представлен как
В наших примерах холст будет отрисовываться на экране, значит, нам придется выполнять преобразование из одной системы координат в другую. Для этого нужно изменить центр системы и обратить направление оси Y. Вот итоговые уравнения преобразования:
Предположим, что PutPixel выполняет преобразование автоматически. Теперь можно представлять холст как имеющий исходную точку координат в середине, с x, возрастающим вправо, а y — вверх экрана.
Взглянем на последний аргумент PutPixel: цвет.
Цветовые модели
Теория цвета удивительна, но выходит за рамки этой книги, поэтому ниже я приведу упрощенную версию только интересующих нас аспектов.
Когда свет попадает в человеческий глаз, он стимулирует светочувствительные клетки на его задней стенке. Они генерируют сигналы для мозга согласно длине волны воспринимаемого света, которые мы интерпретируем как цвета.
В обычных условиях человек не может видеть длину волны, выходящую за видимый диапазон. Длина волны и частота находятся в обратной зависимости (чем выше частота волны, тем меньше расстояние между ее пиками). Именно поэтому инфракрасный свет (длина волны больше 740 нм, что соответствует частотам ниже 405 ТГц) безвреден, а ультрафиолетовый (длина волны менее 380 нм, что соответствует частотам выше 790 ТГц) может обжечь кожу.
Любой вообразимый цвет можно описать как разные комбинации этих цветов. «Белый» — это сумма всех цветов, а «черный» — их полное отсутствие. Описывать цвета через их длины волн очень неудобно, но почти все их можно создать линейной комбинацией всего трех основных цветов.
Субтрактивная цветовая модель
Субтрактивная цветовая модель — это просто вычурное название для процесса смешивания цветов, знакомого вам с детства. Представьте, что берете белый лист бумаги и красный, синий и желтый карандаши. Сначала вы рисуете желтый круг и пересекающийся с ним синий, получая зеленый цвет. При наложении желтого и красного получается оранжевый, при совмещении красного и синего — пурпурный. Если смешать все три цвета, то выйдет почти черный. Детство — увлекательная пора, не так ли? На рис. 1.3 показаны основные цвета субтрактивной модели и создаваемые их смешением вариации.
Рис. 1.3. Основные цвета субтрактивной схемы и их комбинации
У объектов разный цвет из-за того, что они по-разному поглощают и отражают свет. Начнем с белого света, наподобие солнечного (солнечный свет нельзя назвать белым, но для наших целей достаточно их сходства). Белый свет содержит весь диапазон световых волн. После столкновения с объектом поверхность последнего поглощает некоторые волны, а остальные отражает, в зависимости от материала. После часть отраженного света достигает наших глаз, и мозг преобразует эту информацию в цвет. Какой именно? Тот, что представляет сумму длин волн, отраженных поверхностью.
А что происходит с карандашами? Мы начинаем с белого света, отражающегося от бумаги. Она белая, поэтому отражает большую часть падающего на нее света. При рисовании желтым карандашом вы добавляете слой материала, поглощающего волны определенной длины, но пропускающего другие. Они отражаются бумагой, снова проходят через желтый слой, достигают наших глаз, и мозг интерпретирует именно эту комбинацию длин волн как «желтый». В этом случае желтый слой вычитает (субтрактирует) часть волн из исходного белого света.
Каждый цветной круг можно рассматривать как фильтр. При рисовании синего круга, накладывающегося на желтый, вы отфильтровываете из исходного света еще больше длин волн и глаз достигают те, что не отсеялись синим или желтым кругом, а мозг их воспринимает как «зеленый».
Короче говоря, мы начинаем со всеми длинами волн и для создания нужного цвета вычитаем их часть из основных цветов. В этой модели цвета получаются путем вычитания определенных длин волн из основных цветов, чем и обусловлено ее название.
Но эта модель не совсем верна. На самом деле основные цвета субтрактивной схемы — не синий, красный и желтый, как учат детей и студентов, а циан, маджента и желтый. Более того, смешение этих трех основных цветов создает очень темный тон, который не является полностью черным. Поэтому в качестве четвертого основного добавляется чистый черный цвет. В результате мы получаем цветовую схему CMYK (Cyan, Magenta, Yellow, Key или Black) (рис. 1.4).
Рис. 1.4. Четыре основных субтрактивных цвета, используемые в картриджах
Эта схема используется в картриджах цветных принтеров, а иногда ее можно увидеть и в контурах картинок дешевых флаеров, где разные цвета немного съезжают друг с друга.
Аддитивная цветовая модель
Субтрактивная модель — это только половина истории. Если вы когда-нибудь разглядывали экран вблизи или через увеличительное стекло (либо, чего уж греха таить, случайно на него чихали), то наверняка видели мелкие цветные точки: красные, зеленые и синие.
Принцип работы экранов компьютеров противоположен бумаге, которая не излучает свет, а только отражает часть получаемого. Здесь мы начинаем с белого цвета и вычитаем ненужные длины волн. Экраны же, наоборот, черные, но при этом сами излучают свет. И в таком случае мы начинаем без цвета и добавляем волны нужной длины. Для этого необходимы другие основные цвета. Большинство из них можно создать, добавляя к черной поверхности красный, зеленый и синий в разных пропорциях. Это называется цветовой схемой RGB или аддитивной цветовой моделью, показанной на рис. 1.5.
Комбинация аддитивных основных цветов светлее ее компонентов, а комбинация субтрактивных основных цветов — темнее. Все основные аддитивные цвета складываются в белый, а субтрактивные — в черный.
Рис. 1.5. Аддитивные основные цвета и некоторые из их комбинаций
Забудьте лишние детали
Теперь, когда вам все это известно, вы можете выборочно забыть детали и сосредоточиться на самом важном для нашей работы.
Большинство цветов можно выразить в RGB или в CMYK (либо в другой цветовой схеме), преобразовывая при этом одно цветовое пространство в другое. Наш приоритет — это рендеринг изображений на экране, поэтому в книге мы будем использовать схему RGB.
Как уже говорилось, объекты поглощают часть достигающего их света, а остальной отражают. Воспринимаемый нами «цвет» поверхности определяется длинами поглощаемых и отражаемых волн. С этого момента мы будем рассматривать цвет как свойство поверхности и забудем о длинах волн.
Глубина цвета и представление
Цвет в мониторе зависит от смешения в разных пропорциях красного, зеленого и синего. Для этого мелкие цветные точки экрана подсвечиваются с разной интенсивностью, которая определяется разницей в подаваемом напряжении.
Сколько же значений интенсивности можно получить? Несмотря на непрерывность напряжения, мы будем управлять цветами с помощью компьютера, использующего дискретные величины (то есть их ограниченное число). Чем больше оттенков красного, зеленого и синего мы можем представить, тем больше цветов можно создать.
В большинстве встречающихся сегодня изображений используется по 8 бит на один основной цвет. Это называется цветовым каналом. Используя 8 бит на канал, мы получаем 24 бита на пиксель, итого 224 цветов (примерно 16,7 миллиона). Именно такой формат, известный как R8G8B8 или просто 888, мы и будем использовать в книге. Об этом формате можно сказать, что его глубина цвета — 24 бита.
Но это не единственный возможный формат. Не так давно для экономии памяти в ходу были 15- и 16-битные аналоги. В случае с 15 битами присваивалось по 5 бит на канал, а с 16 битами — 5 бит для красного, 6 для зеленого и 5 для синего (этот формат назывался R5G6B5 или 565). Зеленому выделяется дополнительный бит, потому что наши глаза более чувствительны к изменению именно в этом цвете.
При использовании 16 бит мы получаем 216 цветов (примерно 65 000), то есть по одному для каждых 256 цветов в 24-битном режиме. Несмотря на то что 65 000 цветов — это очень много, на изображениях, где цвета изменяются очень плавно, можно заметить едва уловимые «переходы». Но при использовании 16,7 миллиона цветов их не видно, так как здесь уже достаточно битов для всех промежуточных оттенков. В некоторых специализированных приложениях, таких как цветоустановка для кинофильмов, хорошим решением будет задействовать дополнительные биты на каждый канал для расширения спектра цветовых деталей.
Мы будем использовать для выражения цвета 3 байта со значением 8-битного цветового канала в диапазоне от 0 до 255 в каждом. Цвета мы будем выражать как (R, G, B) — например, (255, 0, 0) представляет чистый красный, (255, 255, 255) — белый, а (255, 0, 128) — красновато-пурпурный.
Управление цветом
Для управления цветом мы будем использовать небольшой набор операций. Если вы знакомы с линейной алгеброй, то можете представить цвета как векторы в трехмерном цветовом пространстве. Если же нет, то ничего страшного, сейчас мы разберем все базовые операции, которые будем использовать.
Интенсивность цвета можно изменять, умножая каждый из его цветовых каналов на константу:
k(R, G, B) = (kR, kG, kB).
Например, (32, 0, 128) вдвое ярче, чем (16, 0, 64).
Мы можем совместить два цвета, по отдельности сложив их цветовые каналы:
(R1, G1, B1) + (R2, G2, B2) = (R1 + R2, G1 + G2, B1 + B2).
Если нужно совместить красный (255, 0, 0) и зеленый (0, 255, 0), то мы складываем их поканально и получаем (255, 255, 0) — желтый.
Учтите, что эти операции могут давать недействительные значения. Удваивание интенсивности (192, 64, 32) дает значение R, выходящее за цветовой диапазон. Любое значение больше 255 мы будем принимать за 255, а любое значение меньше 0 — за 0. Такой прием называется обрезкой значения до диапазона 0–255. Это чем-то похоже на то, что происходит, когда мы делаем недо- или переэкспонированный фотоснимок: получаем полностью черные либо полностью белые области.
На этом вводная часть по теме цветов и PutPixel заканчивается. Теперь уделим немного времени изучению представления 3D-объектов при рендеринге.
Сцена
Вы уже познакомились с холстом (абстрактной поверхностью, на которой закрашиваются пиксели). Теперь перейдем к отображению объектов, рассмотрев еще одну абстракцию — сцену.
Сцена — набор объектов, которые вы отрисовываете. Это может быть что угодно: от сферы, дрейфующей в бесконечном пустом пространстве (начнем мы именно с этого), и до невероятно детализированной модели внутренностей угрюмого носа огра.
Для рассмотрения объектов в рамках сцены нам нужна система координат. Использовать ту же систему, что и для холста, мы не можем по двум причинам: во-первых, холст двухмерный, а сцена трехмерная, во-вторых, холст и сцена используют разные единицы измерения: на холсте — пиксели, а для сцены — реальные единицы (имперская или метрическая системы).
Выбор осей здесь произволен, поэтому мы возьмем самые подходящие для нас. Предположим, что Y вертикальная, а X и Z горизонтальные и все три оси перпендикулярны друг другу. Рассматривайте плоскость XZ как «пол», а XY и YZ —как вертикальные «стены» квадратной комнаты. Это согласуется с системой координат, выбранной нами для холста, где Y — вертикаль, а X — горизонталь. На рис. 1.6 показано, как все это выглядит.
Рис. 1.6. Система координат для сцен
Выбор единиц измерения сцены тоже произволен и зависит от того, что она будет представлять. К примеру, 1 может означать 1 дюйм при моделировании чашки или 1 астрономическую единицу при моделировании Солнечной системы. Неважно, что выражают выбранные единицы измерения, пока мы согласованно их используем. С этого момента можно смело их игнорировать.
Итоги главы
В этой главе вы познакомились с холстом, абстракцией и с базовым методом для построения всего остального: PutPixel. Еще мы выбрали систему координат для ориентации в пространстве пикселей холста и рассмотрели способ представления цвета этих пикселей. В завершение было введено понятие сцены и для нее тоже выбрана система координат.
Теперь можно приступать к созданию трассировщика лучей и растеризатора на базе заложенных нами основ.
