Содержание статьи
Реальность против эффективности
Человеческий глаз воспринимает множество лучей: прямых — от источников света — и отраженных от всевозможных предметов. Камеры фотоаппаратов очень похожи на сетчатку: каждый «пиксель» глаза воспринимает излучение, создающее цвет. Поэтому логичным решением разработчиков было воспользоваться законом обратимости хода лучей и для каждого пикселя экрана — по сути, виртуального глаза — рассчитывать, откуда придет луч света и какого он будет цвета.
Наверняка с уроков физики ты помнишь закон отражения света: угол падения равен углу отражения. Этот закон позволяет в корне поменять концепцию виртуального мира. Вместо того чтобы рассчитывать миллиарды лучей, исходящих от одного источника, имея маленькую надежду, что эти лучи попадут в виртуальный глаз, компьютер может думать лишь о нескольких миллионах лучей (по одному на пиксель экрана), гарантированно важных для создания картинки.
Несмотря на это, во времена зарождения трехмерных компьютерных игр (а это начало 1980-х — конец 1990-х годов) процессоры не были достаточно мощны, чтобы рассчитывать путь луча для каждого отдельного пикселя, поэтому разработчики использовали различные хаки — либо уменьшали количество рассчитываемых пикселей, либо применяли менее физически обоснованный способ создания картинки. Об этих уловках мы сейчас и поговорим.
Рейкастинг
Добиваясь эффективности, программисты решились на множество допущений, которые позволили снизить затраты времени на создание изображения в сотни раз, — это в первую очередь допущения о виртуальном мире.
- Все доступное в игре пространство — это комната с прямоугольными (чаще квадратными) стенами.
- Нет лестниц, лифтов, любого вида спусков и подъемов.
- Потолок везде имеет одинаковую высоту.
- Нет других трехмерных объектов, кроме стен, пола и потолка.
- Все остальные сущности — это «билборды», двумерные изображения, расположенные в трехмерном пространстве.
Wolfenstein 3D — первая действительно популярная игра, разработчики которой этим воспользовались.
Для каждого вертикального кусочка предназначен специальный луч, который двигается маленькими шагами — алгоритм каждый раз проверяет, есть ли попадание в препятствие. Как только луч заканчивает свое движение, подсчитывается количество пройденных шагов, и получается расстояние до стены. Зная это расстояние, мы можем нарисовать стену соответствующей высоты — чем дальше, тем короче стена.
Перечисленные допущения приводят к тому, что стены всегда находятся на одном уровне экрана — ровно посередине, поэтому нарисовать их относительно просто.
У такого типа игр много заметных особенностей. Например, все существа здесь постоянно повернуты к игроку лицом, так как они не трехмерные, рисуются без использования 3D, на них не падают тени.
Движок Wolfenstein 3D стал большим шагом в компьютерной графике, но разработчикам было понятно, что такого подхода надолго не хватит.
Растеризация
Желание приблизить картинку к реальному миру потребовало в корне изменить принцип отрисовки. Мощность компьютеров возросла, и вместо отдельных лучей, которые попадают исключительно в стены, стало возможно использовать самую простую геометрическую фигуру — треугольник.
Треугольник задается тремя отдельными точками, в каждую из которых возможно отправить виртуальный луч. Треугольник остается самим собой всегда, даже после попадания из трехмерного пространства в двумерное.
Каждая точка каждого объекта в трехмерном пространстве переводится в точку на экране, а затем определенные точки — изначально заданные в модели треугольники — соединяются. Так получается изображение исходного объекта.
Так как из треугольников можно составить любую фигуру и любой трехмерный объект, было решено основываться на этом, и до сих пор все механизмы рендеринга в реальном времени работают по такому механизму.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»